MSBuild 在 _CopyOutOfDateSourceItemsToOutputDirectory 期间复制依赖项目文件

Posted

技术标签:

【中文标题】MSBuild 在 _CopyOutOfDateSourceItemsToOutputDirectory 期间复制依赖项目文件【英文标题】:MSBuild copies dependent project files during _CopyOutOfDateSourceItemsToOutputDirectory 【发布时间】:2016-03-07 22:19:31 【问题描述】:

我有一个 C# 项目,它使用 sln 文件中的项目依赖项来确保构建顺序正确。

所以我的 sln 文件中有 ProjectB 依赖于 ProjectA。

Project("FAE04EC0-301F-11D3-BF4B-00C04F79EFBC") = "ProjectB", "ProjectB.csproj", "E24EAC46-1563-4E73-9411-3F9D2645F77C"
    ProjectSection(ProjectDependencies) = postProject
        4A7D6720-4AA1-4F0B-A796-A0436DB3D7D7 = 4A7D6720-4AA1-4F0B-A796-A0436DB3D7D7
    EndProjectSection
EndProject

ProjectA 有一些内容设置为CopyIfNewer

当我使用 Visual Studio 构建它时,ProjectA 进入它自己的 bin 文件夹,ProjectB 进入它自己的 bin 文件夹。

但是当我用 MSBuild 构建它时,ProjectA 的内容不知何故也出现在 ProjectB 的输出文件夹中!

构建日志显示[ProjectB.csproj] _CopyOutOfDateSourceItemsToOutputDirectory 复制了文件。

我的问题是:我如何告诉 MSBuild 文件不属于该项目并且不必复制?

作为一种解决方法,我将 ProjectA 添加为 ProjectReference<Private>False</Private>,这似乎可行,但这不是我想要的解决方案。

【问题讨论】:

在追查同样的问题时,它让我意识到即使该项目不是参考,它也被设置为依赖。它会按预期在 VS 中构建,但 msbuild 会引入 CopyIfNewer 文件。对我来说,依赖不是必需的,所以我删除了它。 【参考方案1】:

我解决了在 ProjectB .csproj 文件中覆盖 MSBuild 任务的问题。 (我只依赖 .sln 文件中的 ProjectA,没有将项目作为 ProjectReference 添加到 ProjectB)

将此目标添加到您的 .csproj 文件中:

<Project>
.....
<Target Name="_CopyOutOfDateSourceItemsToOutputDirectory" Condition=" '@(_SourceItemsToCopyToOutputDirectory)' != '' " Inputs="@(_SourceItemsToCopyToOutputDirectory)" Outputs="@(_SourceItemsToCopyToOutputDirectory->'$(OutDir)%(TargetPath)')">
        <Message Importance="Normal" Text="$(MSBuildProjectName) Skip copy _CopyOutOfDateSourceItemsToOutputDirectory" />
      </Target>
      <Target Name="_CopyOutOfDateSourceItemsToOutputDirectoryAlways" Condition=" '@(_SourceItemsToCopyToOutputDirectoryAlways)' != '' ">
        <Message Importance="Normal" Text="$(MSBuildProjectName) Skip copy _CopyOutOfDateSourceItemsToOutputDirectoryAlways" />
      </Target>
</Project>

对于我自己的文件,需要复制到输出目录,我在 postbuild 中通过 XCOPY 来完成,例如:

<PropertyGroup>
    <PostBuildEvent>xcopy "$(ProjectDir)SomeSubFolder\SomeContentFile.cfs" "$(TargetDir)SomeSubFolder\" /Y /F</PostBuildEvent>
  </PropertyGroup>

也许有覆盖 _CopyOutOfDateSourceItemsToOutputDirectory* 任务like this 的智能变体。但是我的变种现在让我满意了。因为我的项目中没有其他内容文件的依赖。

【讨论】:

【参考方案2】:

我认为您描述的解决方法是目前您能找到的最佳解决方案。

作为一种解决方法,我将 ProjectA 添加为 False 的 ProjectReference,这似乎可行,但这不是我想要的解决方案。

【讨论】:

以上是关于MSBuild 在 _CopyOutOfDateSourceItemsToOutputDirectory 期间复制依赖项目文件的主要内容,如果未能解决你的问题,请参考以下文章

MSBuild日志文件位置

无法让 MSBuild 社区任务 RegexReplace 工作

使用 msbuild 从命令行创建应用程序包

属性挂钩 MSBuild/Roslyn

msbuild发布web应用程序

使用MSBuild用正则表达式更新版本号