0

我发现以下文章很好地描述了项目引用的 PDB 文件如何包含在 VSIX 包中:http: //www.cazzulino.com/include-pdbs-in-vsix.html

现在我想做同样的事情,但是对于项目引用生成的文档 XML 文件。我看到 XML 文件已被复制到 VSIX 项目的输出目录,但我如何确保它们也被添加到 .VSIX 文件中?

4

2 回答 2

1

回答我自己的问题:

显然还有一个“DocumentationProjectOutputGroup”输出组。然后可以通过以下方式将此输出组添加到所有项目引用中:

<PropertyGroup>
    <DefaultIncludeOutputGroupsInVSIX>
        BuiltProjectOutputGroup;
        DebugSymbolsProjectOutputGroup;
        GetCopyToOutputDirectoryItems;
        SatelliteDllsProjectOutputGroup;
        BuiltProjectOutputGroupDependencies;
        DocumentationProjectOutputGroup;
        SatelliteDllsProjectOutputGroupDependencies
    </DefaultIncludeOutputGroupsInVSIX>
</PropertyGroup>

<ItemDefinitionGroup>
    <ProjectReference>
        <IncludeOutputGroupsInVSIX>$(DefaultIncludeOutputGroupsInVSIX)</IncludeOutputGroupsInVSIX>
    </ProjectReference>
</ItemDefinitionGroup>
于 2018-11-05T08:20:58.267 回答
0

您可以通过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 包含的所有项目(据我所知,默认情况下它只包含 vsix 项目本身的 xml 文件)。

因此,要添加除被 vsix 构建包抑制的所有 xml 文件,您需要手动添加它们:

...
<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>
于 2018-10-31T21:30:11.450 回答