Добавляет настраиваемое действие сборки для ItemGroups в целевой среде Microsoft.Common.CurrentVersion.targets
Вышеупомянутое название должно быть ближе к цели bwerks. В качестве теста мы могли бы знать, что пользовательское действие сборки для ItemGroups не будет скопировано в каталог «Выход», поэтому нам нужно выполнить наше пользовательское действие сборки для цели _CopyOutOfDateSourceItemsToOutputDirectoryAlways
.
Для этого откройте файл C:Program Files (x86)Microsoft Visual Studio2017EnterpriseMSBuild15.0BinMicrosoft.Common.CurrentVersion.targets
в папке MSBuild 15.0 _CopyOutOfDateSourceItemsToOutputDirectoryAlways
(убедитесь, что у вас есть достаточные разрешения и создайте резервную копию), найдите цель _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>
Надеюсь это поможет.