为CopyOutOfDateSourceItemsOutputDirectoryWays目标中的项组添加自定义生成操作
上面的标题应该更接近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
(确保您有足够的权限并进行备份),找到目标
_复制输出数据源项输出目录路径
:
<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>
希望这有帮助。