MSBuild在指定绝对路径时复制依赖关系,并在相对时忽略

时间:2012-09-24 04:06:49

标签: .net msbuild msbuild-4.0

我尝试构建引用解决方案中某些项目的.csproj。这些引用标有CopyLocal=False。这是理想的行为。

我使用MSBuild为CI构建它,因此我通过/p:OutputPath="some output dir"设置输出文件夹。我还设置/p:SolutionDir="path to the solution"以正确解析一些NuGet引用。

问题是:当我指定OutputPath带有输出目录的绝对路径(如d:\solution\build\buildgroupsubfolder)时,MSBuild会将每个依赖项复制到输出目录中,我不知道为什么会这样做。如果我使用相对路径指定输出路径(如..\..\..\..\..\build\buildgroupsubfolder),则MSBuild会正确处理CopyLocal=false,并且不会将引用复制到输出目录。

我们的解决方案中有一些嵌套,项目分为几组,因此我们希望将它们构建到子文件夹中。我希望能够指定相对于基本构建路径的构建路径,而不是项目本身的路径。

为什么MSBuild在指定绝对路径时忽略CopyLocal = false并在指定相对路径时正确处理它?<​​/ p>

2 个答案:

答案 0 :(得分:4)

好吧,我进一步深入挖掘。我发现MSBuild行为不端,但我不知道它在哪里。

我认为MSBuild的行为不正确,正如我在问题中描述的那样。如果我将CopyLocal=false设置为相对路径,它确实会处理OutputDir。如果我将OutputDir设置为绝对路径,那就行为不端了。我在MSDN中找到了答案:

  

OutputPath - 指定输出目录的路径,相对于   项目目录,例如“bin \ Debug”。

事实上,当我将OutputPath设置为绝对路径时,MSBuild应该警告我甚至失败,但事实并非如此。这就是为什么我的印象是绝对路径是正常的,并且有一个CopyLocal处理的错误。实际的错误是MSBuild在失败时可以正常工作。

答案 1 :(得分:0)

我将项目和MSBuild从Visual Studio 2005切换到Visual Studio 2010后,我遇到了同样的问题。但是,我想避免使用相对路径,所以改为使用新的Web发布管道(WPP)在.NET 4.0中,将以下内容添加到我的MSBuild命令行:

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

现在输出恢复正常,仍然可以在输出目录中使用绝对路径。