代码之家  ›  专栏  ›  技术社区  ›  Mark Struzinski

如何在南特设置工作目录?

  •  6
  • Mark Struzinski  · 技术社区  · 16 年前

    我刚开始使用南特。我在一个教程中工作,只是试图设置一个目标来在构建时清理我的解决方案。我的Visual Studio解决方案结构如下:

    • 解决方案文件夹
      • 项目文件夹
      • 项目文件夹
      • 工具文件夹
        • 总文件夹

    nant.exe文件位于tools/nant文件夹中。我的.build文件也在其中。这是我的.build文件:

    <?xml version="1.0" encoding="utf-8" ?>
    <project name="NAntTest" default="build" xmlns="http://nant.sf.net/release/0.86-beta1/nant.xsd">
      <property name="solution.file.name" value="NAntTest.sln" />
      <property name="project.config" value="debug" />
    
      <target name="build" depends="clean.source" />
    
      <target name="clean.source">
        <exec program="${framework::get-framework-directory(framework::get-target-framework())}\msbuild.exe"
              commandline="${solution.file.name} /t:Clean /p:Configuration=${project.config} /v:q" 
              workingdir="."/>
      </target>
    
    </project>
    

    下面的示例就是这样格式化的。如果尝试运行此生成,则会收到一个错误,说明项目文件不存在。在clean.source目标中,如果将workingdir属性替换为指向基本解决方案文件夹的硬编码路径,脚本将正确编译并运行。显然,如果我需要将项目移动到任何地方,这对于可移植性来说都不是理想的选择。

    如何让nant看到基本工作目录?

    6 回复  |  直到 7 年前
        1
  •  7
  •   Peter Lillevold Rene    16 年前

    我的建议是始终将构建文件放在解决方案级别。那么构建文件中的所有相对路径都将等于解决方案的路径。

        2
  •  7
  •   cao    14 年前

    没有用于更改当前目录的内置函数,但可以在脚本块中创建一个:

      <target name="foo">
        <echo message="Current directory set to ${directory::set-current-directory('C:')}"/>
        <echo message="Current directory is now ${directory::get-current-directory()}"/>
      </target>
    
      <script language="C#" prefix="directory">
        <code><![CDATA[
        [Function("set-current-directory")]
        public static string SetCurrentDirectory(string path)
        {
          System.IO.Directory.SetCurrentDirectory(path);
          return path;
        }
        ]]></code>
      </script>
    

    当然,您应该避免依赖脚本或代码中的当前目录。

        3
  •  2
  •   Henryk    16 年前

    您可以尝试设置项目节点的basedir属性。这可以解决您的问题。

    <project name="NAntTest" default="build" basedir="C:\Code\MyProject" xmlns="http://nant.sf.net/release/0.86-beta1/nant.xsd">
    
        4
  •  1
  •   robaker    16 年前

    如果设置了nant的verbose属性 exec task 然后它将输出它生成的确切命令行。不确定执行msbuild的具体问题是什么-我一直在使用 nantcontrib msbuild task 相反。

        5
  •  0
  •   jeremysawesome    10 年前

    现在有一个 workingdir 您可以在 exec 元素。

    根据 documentation , 工作DIR 指“执行命令的目录”。

        6
  •  0
  •   Frank Rem    7 年前

    作为任务而不是函数:

    <?xml version="1.0"?>
    <project name="test" default="build">
        <script language="C#" prefix="path" >
            <code>
                <![CDATA[
                [TaskName("set-current-directory")]
                public class SetCurrentDirectory : Task {
                    private string _path;
    
                    [TaskAttribute("path", Required=true)]
                    public string Path {
                        get { return _path; }
                        set { _path = value; }
                    }
    
                    protected override void ExecuteTask() {
                        System.IO.Directory.SetCurrentDirectory(_path);;
                    }
                }
                ]]>
            </code>
        </script>
    
        <target name="build">
            <set-current-directory path="c:\Program Files" />
            <echo message="${directory::get-current-directory()}" />
         </target>
    </project>
    

    输出:

    $ nant
    
    build:
    
         [echo] c:\Program Files