4

我尝试构建.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 并在指定相对路径时正确对待它?

4

2 回答 2

4

好吧,我已经深入挖掘了。我发现 MSBuild 行为不端,但不是我曾经想过的地方。

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

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

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

于 2012-09-24T16:37:51.353 回答
0

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

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

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

于 2013-04-19T18:29:57.580 回答