【问题标题】:MSBuild copies dependencies when absolute path is specified and ignores when relativeMSBuild 在指定绝对路径时复制依赖关系,在相对路径时忽略
【发布时间】:2012-09-24 04:06:49
【问题描述】:

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

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

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

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

为什么MSBuild在指定绝对路径时忽略CopyLocal=false,而在指定相对路径时正确对待?

【问题讨论】:

    标签: .net msbuild msbuild-4.0


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 不,我没有。我认为他们永远不会考虑解决这个问题。这并不重要。我们已经看到了更严重的错误,这些错误已经存在多年。所以我认为这个甚至不值得发布到 Connect :)
    • 是的,但是既然您已经找到了问题的原因,那么解决起来很容易。只需将绝对路径更改为相对路径。我很高兴我的问题和回答帮助了某人:)
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-01
      • 2012-01-11
      • 2010-09-15
      • 2013-04-17
      • 2017-11-30
      • 1970-01-01
      • 2012-05-20
      相关资源
      最近更新 更多