2012-09-24 13 views
4

我嘗試構建引用解決方案中的某些項目的.csproj。這些參考文件標有CopyLocal=False。這是所需的行爲。MSBuild在指定絕對路徑時複製相關性,並在相對時忽略

我使用MSBuild構建CI,所以我通過/p:OutputPath="some output dir"設置輸出文件夾。我還設置了/p:SolutionDir="path to the solution"正確解析一些NuGet引用。

問題是:當我指定輸出路徑與輸出目錄的絕對路徑(如d:\solution\build\buildgroupsubfolder),然後MSBuild將每個依賴項複製到輸出目錄,我不知道它爲什麼這樣做。如果我使用相對路徑指定輸出路徑(如..\..\..\..\..\build\buildgroupsubfolder),則MSBuild將正確處理CopyLocal=false,並且不會將引用複製到輸出目錄。

我們在我們的解決方案中嵌套了一些嵌套項目,項目分組,所以我們希望它們被構建到子文件夾中。我希望能夠指定相對於基本構建路徑的構建路徑,而不是項目本身的路徑。

爲什麼MSBuild在指定絕對路徑時忽略CopyLocal = false,並在指定相對路徑時正確處理它?

回答

4

那麼,我已經深入挖掘了。我發現MSBuild行爲不當,但我沒有看到它。

我以爲MSBuild有不正確的行爲,正如我在我的問題中所描述的。如果我將OutputDir設置爲相對路徑,它確實會處理CopyLocal=false。如果我將OutputDir設置爲絕對路徑,它會出現異常。我發現說,在MSDN答案:

OutputPath - 指定路徑輸出目錄,相對於 項目目錄,例如,「斌\調試」。

所以實際上MSBuild應該警告我,甚至會失敗,當我設置OutputPath爲絕對路徑,但它不。這就是爲什麼我在印象中認爲絕對路徑不錯,並且存在處理CopyLocal的錯誤。實際的錯誤是MSBuild在失敗時工作。

+0

哇!鬼祟的錯誤!你有沒有發佈這在連接? –

+0

不,我沒有。我不認爲他們會認爲這是固定的。這並不重要。我們已經看到了多年來存在的更嚴重的錯誤。所以我不認爲這個人甚至值得張貼到連接:) –

+0

只需在我們的CI構建中打這一個。很煩人,浪費了數小時...... –

0

我剛把Visual Studio 2005中的項目和MSBuild切換到Visual Studio 2010後也遇到了同樣的問題。但是,我想避免使用相對路徑,所以我轉而使用新的Web發佈管道(WPP )在.NET 4.0中加入下面的我的MSBuild的命令行:

/p:UseWPP_CopyWebApplication=True /p:PipelineDependsOnBuild=False 

現在產量恢復正常,依然能在我的輸出目錄中使用絕對路徑。