2009-04-16 18 views
6

我剛剛開始使用NAnt。我正在從一個教程開始工作,並試圖設置一個目標來清理我的解決方案。我的Visual Studio解決方案結構如下:如何在NAnt中設置工作目錄?

  • 解決方案文件夾
    • 項目文件夾
    • 項目文件夾
    • Tools文件夾
      • 楠文件夾

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以查看基本工作目錄?

回答

7

我的建議是始終把解決在水平構建文件。然後,構建文件中的所有相對路徑將與解決方案的路徑相同。

2

您可以嘗試設置項目節點的basedir屬性。這可能會解決您的問題。

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

你或許應該設置使用相對路徑BASEDIR(即 「.. \ ..」)。 – BrainSlugs83 2014-04-02 19:24:14

+0

這是正確的答案,以及使用相對路徑的註釋。 – 2015-06-25 21:23:32

1

如果您設置了nant exec task的詳細屬性,那麼它會吐出它生成的確切命令行。不知道你的具體問題是關於執行msbuild - 我一直在使用nantcontrib msbuild task

7

沒有內置功能來改變當前目錄,但您可以創建一個在腳本塊:

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

當然,你應該避免在你的腳本或代碼依賴於當前目錄。

0

現在您可以在exec元素上定義一個workingdir屬性。

根據documentationworkingdir引用「該命令將被執行的目錄」。

0

作爲一個任務,而不是一個功能:

<?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 
相關問題