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

本文关键字:复制 依赖 项目文件 CopyOutOfDateSourceItemsToOutputDirectory MSBuild | 更新日期: 2023-09-27 18:25:25

我有一个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>,这似乎有效,但这不是我想要的解决方案。

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

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

作为一种变通方法,我添加了ProjectA作为带有False的ProjectReference,这似乎有效,但这不是我想要的解决方案。

I解决了在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*任务,如下所示。但我的变体现在让我满意了。因为我的项目中不依赖其他内容文件。