Visual studio 如何在NAnt中设置工作目录?

Visual studio 如何在NAnt中设置工作目录?,visual-studio,build-process,build,build-automation,nant,Visual Studio,Build Process,Build,Build Automation,Nant,我刚刚开始使用NAnt。我从一个教程开始工作,只是试图设定一个目标,在构建时清理我的解决方案。我的Visual Studio解决方案结构如下所示: 解决方案文件夹 项目文件夹 项目文件夹 工具文件夹 南特文件夹 NAnt.exe文件位于Tools/NAnt文件夹中。我的.build文件也在那里。这是我的.build文件: <?xml version="1.0" encoding="utf-8" ?> <project name="NAntTest" default=

我刚刚开始使用NAnt。我从一个教程开始工作,只是试图设定一个目标,在构建时清理我的解决方案。我的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查看基本工作目录?

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

<project name="NAntTest" default="build" basedir="C:\Code\MyProject" xmlns="http://nant.sf.net/release/0.86-beta1/nant.xsd">


我的建议是始终将生成文件放在解决方案级别。然后,生成文件中的所有相对路径都将与解决方案的路径相同。

如果设置nant的verbose属性,则它将吐出它生成的确切命令行。不确定执行msbuild的具体问题是什么-我一直在使用。

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

  <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>


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

现在您可以在
exec
元素上定义
workingdir
属性


根据workingdir指的是“将在其中执行命令的目录”。

作为任务而不是功能:

<?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>

将其向上移动到解决方案目录是有效的。谢谢你的帮助!这会管用的,但我的意思是,这个建议并不完全合理。只需适当地设置basedir。(顺便说一句,不是我被否决了。)您可能应该使用相对路径(即“.\..”)设置basedir。这是正确的答案,以及使用相对路径的注释。
$ nant

build:

     [echo] c:\Program Files