Вы можете добавить любой файл по своему усмотрению, используя VSIXSourceItem
в файле проекта или используя его из отдельного импортированного проекта:
...
<!--You also can invoke this target before GetVsixSourceItems-->
<Target Name="ForceIncludeItems" AfterTargets="GetVsixSourceItems">
<ItemGroup>
<VSIXSourceItem Include="Path_to_your_xml_file" />
</ItemGroup>
</Target>
Также вы можете указать подстановочные знаки и функции для выбора специальных файлов, которые вы хотите:
...
<VSIXSourceItem Include="*.xml" Condition="$([System.String]::new('%FileName)').StartsWith('My_start_with_pattern'))"/>
Более простой, но менее гибкий способ - установить IncludeDocFilesInVSIXContainer
в true:
...
<IncludeDocFilesInVSIXContainer>true</IncludeDocFilesInVSIXContainer>
Таким образом, цель будет включать все элементы, которые были включены как @DocFileItem (как я знаю, по умолчанию это только файл xml для самого проекта vsix).
Таким образом, чтобы добавить все XML-файлы, за исключением подавляемого пакетом сборки vsix, необходимо добавить их вручную:
...
<IncludeDocFilesInVSIXContainer>true</IncludeDocFilesInVSIXContainer>
...
<Target Name="AppendNonSuppressXml" AfterTargets="GetVsixSourceItems">
<ItemGroup>
<SuppressXml Include="@(SuppressFromVsix->'%(FileName)')" /> <!-- store all suppressed assemblies names to avoid copying their xml files-->
</ItemGroup>
<PropertyGroup>
<SuppressAsString>$([System.String]::Join(';', @(SuppressXml))</SuppressAsString> <!-- use to emulate Collections.Contains(item)-->
</PropertyGroup>
<ItemGroup>
<!-- assume that xml files will be received from ReferenceCopyLocalPaths, you can use another source -->
<VSIXSourceItem
Include="@(ReferenceCopyLocalPaths)"
Condition="$(IncludeDocFilesInVSIXContainer) And '%(ReferenceCopyLocalPaths.Extension)' =='.xml'
And !($([System.String]::new($(SuppressAsString)).Contains('%(ReferenceCopyLocalPaths.FileName)')))" />
</ItemGroup>
</Target>