MSBuild在指定绝对路径时会复制依赖项,而在使用相对路径时则会忽略。

4
我试图构建引用解决方案中某些项目的.csproj文件,这些引用被标记为CopyLocal=False。这是期望的行为。
我使用MSBuild进行持续集成构建,所以我通过/p:OutputPath="某个输出路径"设置输出文件夹。我还设置了/p:SolutionDir="解决方案路径"以正确解析一些NuGet引用。
问题在于:当我使用绝对路径(例如d:\solution\build\buildgroupsubfolder)指定OutputPath时,MSBuild会将每个依赖项复制到输出目录中,我不知道为什么会这样。如果我使用相对路径(例如..\..\..\..\..\build\buildgroupsubfolder)指定输出路径,则MSBuild正确处理CopyLocal=false,并且不会将引用复制到输出目录中。
我们的解决方案中存在一些嵌套,项目被分成组,因此我们希望将它们构建到子文件夹中。我希望能够指定相对于基本构建路径而不是项目本身路径的构建路径。
为什么MSBuild在指定绝对路径时忽略了CopyLocal=false,在指定相对路径时却正确处理?
2个回答

4

嗯,我深入研究了一下。我发现MSBuild表现不佳,但不是我想到的那个地方。

我认为MSBuild有错误的行为,就像我在问题中描述的那样。如果我将OutputDir设置为相对路径,则它确实按照应有的方式处理CopyLocal=false。如果我将OutputDir设置为绝对路径,则它会表现出异常行为。我在MSDN上找到了答案:

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

因此,实际上,MSBuild应该在我将OutputPath设置为绝对路径时警告我甚至失败,但它没有这样做。这就是为什么我印象中绝对路径是可以的,并且CopyLocal处理存在错误的原因。实际的错误是当MSBuild应该失败时,它仍然在运行。


不,我没有。我认为他们永远不会考虑修复这个问题。它并不是很关键。我们已经遇到过更严重的错误,而这些错误存在了很多年。所以我认为这个问题甚至不值得发布到Connect :) - Dmitrii Lobanov
是的,但既然你已经找到了问题的原因,解决起来就很容易了。只需将绝对路径更改为相对路径即可。我很高兴我的问题和答案能帮助到某个人 :) - Dmitrii Lobanov

0

我在将我的项目和 MSBuild 从 Visual Studio 2005 切换到 Visual Studio 2010 后遇到了相同的问题。然而,我想避免使用相对路径,所以我改用了 .NET 4.0 中的新 Web Publishing Pipeline (WPP),通过在我的 MSBuild 命令行中添加以下内容来实现:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接