在 _CopyOutOfDateSourceItemsToOutputDirectoryAlways 目标中为 ItemGroups 添加自定义构建操作
上面的标题应该更接近 bwerks 的目标。作为测试,我们可以知道 ItemGroups 的自定义构建操作不会复制到输出目录,因此我们需要将自定义构建操作复制到目标_CopyOutOfDateSourceItemsToOutputDirectoryAlways
。
为此,请打开Microsoft.Common.CurrentVersion.targets
MSBuild 15.0 文件夹中的文件C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\Microsoft.Common.CurrentVersion.targets
(确保您有足够的权限并备份它),找到目标_CopyOutOfDateSourceItemsToOutputDirectoryAlways
:
<Copy
SourceFiles = "@(_SourceItemsToCopyToOutputDirectoryAlways)"
DestinationFiles = "@(_SourceItemsToCopyToOutputDirectoryAlways->'$(OutDir)%(TargetPath)')"
...
>
<Output TaskParameter="DestinationFiles" ItemName="FileWrites"/>
</Copy>
然后我们可以知道复制的源文件是@(_SourceItemsToCopyToOutputDirectoryAlways)
,在目标中搜索_SourceItemsToCopyToOutputDirectoryAlways
这个,你会发现:
<ItemGroup>
<_SourceItemsToCopyToOutputDirectoryAlways KeepMetadata="$(_GCTODIKeepMetadata)" Include="@(ContentWithTargetPath->'%(FullPath)')" Condition="'%(ContentWithTargetPath.CopyToOutputDirectory)'=='Always'"/>
<_SourceItemsToCopyToOutputDirectory KeepMetadata="$(_GCTODIKeepMetadata)" Include="@(ContentWithTargetPath->'%(FullPath)')" Condition="'%(ContentWithTargetPath.CopyToOutputDirectory)'=='PreserveNewest'"/>
</ItemGroup>
可以知道源文件是@(ContentWithTargetPath)
,在目标中不断搜索ContentWithTargetPath
,最后得到如下:
<AssignTargetPath Files="@(Content)" RootFolder="$(MSBuildProjectDirectory)">
<Output TaskParameter="AssignedFiles" ItemName="ContentWithTargetPath" />
</AssignTargetPath>
因此,我们可以知道目标是如何将默认构建操作文件复制到输出目录的。
现在,转到我们的自定义构建操作,我们只需将我们的自定义构建操作添加到ItemName="ContentWithTargetPath"
,因此在文件中添加以下内容Microsoft.Common.CurrentVersion.targets
:
<AssignTargetPath Files="@(MyBuildAction)" RootFolder="$(MSBuildProjectDirectory)">
<Output TaskParameter="AssignedFiles" ItemName="ContentWithTargetPath" />
</AssignTargetPath>
保存。
对于项目文件中的文件.csproj
:
<ItemGroup>
<MyBuildAction Include="TextFile1.txt">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</MyBuildAction>
</ItemGroup>
希望这可以帮助。