2012-09-24 10 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 

现在产量恢复正常,依然能在我的输出目录中使用绝对路径。