我应该如何在 VSIX 项目中包含包引用

How should I include Package References in a VSIX project

我的解决方案使用多个 NuGet 包从多个项目创建一个 Visual Studio 包。

所有 Nuget 包都使用 PackageReference(而不是旧的 packages.config 文件)在项目文件中指定。我正在使用 Visual Studio 2019.

我遇到了一个问题,NuGet 包引用的 DLL 未包含在 VSIX 安装中。

this article by Daniel Cazzulino 中描述了这个问题的解决方案,方法是将以下代码添加到项目文件中:

<PropertyGroup>
  <GetVsixSourceItemsDependsOn>$(GetVsixSourceItemsDependsOn);IncludeNuGetResolvedAssets</GetVsixSourceItemsDependsOn>
</PropertyGroup>
<Target Name="IncludeNuGetResolvedAssets" DependsOnTargets="ResolveNuGetPackageAssets">
  <ItemGroup>
    <VSIXCopyLocalReferenceSourceItem Include="@(ReferenceCopyLocalPaths)"  /> 
  </ItemGroup>
</Target>

这确实有效,但它会使安装的大小从大约 20MB 增加到大约 40MB。

安装现在包括很多我并不需要的 PDB 文件。

更重要的是,它引入了大约 46MB 的 Visual Studio 不必要的 DLL,因为它们是 Visual Studio.

的一部分

是否有更好的方法来确保引用的 NuGet 包包含在 VSIX 中,而不用这些其他文件膨胀安装?

您可以使用像这样的简单脚本:

<Target Name="IncludeNuGetPackageReferences" AfterTargets="GetVsixSourceItems">
  <ItemGroup>
    <VSIXSourceItem Include="@(ReferenceCopyLocalPaths)" Condition="'%(ReferenceCopyLocalPaths.NuGetPackageId)' == 'Newtonsoft.Json'" />
    <VSIXSourceItem Include="@(ReferenceCopyLocalPaths)" Condition="'%(ReferenceCopyLocalPaths.NuGetPackageId)' == 'xxx'" />
 ... </ItemGroup>
</Target>

您可以指定应将哪些程序集包含到 .vsix 中。在我的机器上测试后,它不会复制 unnecessary VS assemblies。来自 smourier 的提示,感谢他。

希望对您有所帮助:)