如何在VSIX安装程序中包含NuGet软件包中的程序集?

如何在VSIX安装程序中包含NuGet软件包中的程序集?,nuget,visual-studio-2017,vsix,checkin-policy,Nuget,Visual Studio 2017,Vsix,Checkin Policy,我正在创建Visual Studio 2017自定义签入策略扩展。我当前的解决方案结构如下: 注意:我正在利用新的NuGet方法,这就是为什么没有packages.config文件的原因 我相信我已经正确地设置了我的VSIX清单,因为当我不引用Microsoft.Net.Http(最初我是硬编码值,而不是检索值)时,一切都能正常工作。我不确定为什么包含的Microsoft.TeamFoundationServer.ExtendedClientnumget包不会引起任何问题,而Microsof

我正在创建Visual Studio 2017自定义签入策略扩展。我当前的解决方案结构如下:

注意:我正在利用新的NuGet方法,这就是为什么没有packages.config文件的原因


我相信我已经正确地设置了我的VSIX清单,因为当我不引用
Microsoft.Net.Http
(最初我是硬编码值,而不是检索值)时,一切都能正常工作。我不确定为什么包含的
Microsoft.TeamFoundationServer.ExtendedClient
numget包不会引起任何问题,而
Microsoft.Net.Http
numget包会引起任何问题

我查看了debug文件夹以查看正在编译的内容,并查看了所有需要的程序集,但是如果我解压缩VSIX(我将其重命名为*.zip并解压缩),则只包含项目程序集;Nuget引用的程序集未打包在VSIX包中

我找到了一些资源,但似乎没有任何效果:

这些问题/答案中的每一个似乎都没有解决我的具体问题


更新:


我相信用于生成VSIX包的工具可能不支持NuGet的新
PackageReference
功能。如果我使用较旧的packages.config功能,一切正常。我已经加入了一个支持新NuGet功能的组件。

通过执行以下Microsoft教程中概述的步骤,我成功地将NuGet软件包包括在模板中:

使用MSI安装的SDK可以直接在开发人员的计算机上安装NuGet软件包。这使它们在使用项目或项模板时立即可用,而不必在此期间提取它们。ASP.NET模板使用这种方法

我看到其他人因为使用NuGet软件包而遇到问题。对于.NETCore,我使用了,尽管它确实需要。除非您遇到问题,否则我建议保留遗留系统,尤其是因为这些名称空间似乎是移动的目标

至少对于Windows平台上的.NET来说,这似乎是正确的选择。这个包没有外部依赖关系也毫无价值


编辑:
这似乎与
PackageReference
本身的bug有关。我看到了一个类似的有文档记录的bug。

对于像我们这样面临这个问题的可怜人(nuget使用PackageReference和VSIX依赖项),我发现了一个变通方法,灵感来自这篇文章:这对我来说并不完全有效(它只包括程序集的元数据版本,而不是包含代码的完整程序集)。例如,在这里,我手动引用了4个nuget包:

<Target Name="IncludeNuGetPackageReferences" AfterTargets="GetVsixSourceItems">
  <ItemGroup>
    <VSIXSourceItem Include="@(ReferenceCopyLocalPaths)" Condition="'%(ReferenceCopyLocalPaths.NuGetPackageId)' == 'Microsoft.Win32.Registry'" />
    <VSIXSourceItem Include="@(ReferenceCopyLocalPaths)" Condition="'%(ReferenceCopyLocalPaths.NuGetPackageId)' == 'System.CodeDom'" />
    <VSIXSourceItem Include="@(ReferenceCopyLocalPaths)" Condition="'%(ReferenceCopyLocalPaths.NuGetPackageId)' == 'System.Configuration.ConfigurationManager'" />
    <VSIXSourceItem Include="@(ReferenceCopyLocalPaths)" Condition="'%(ReferenceCopyLocalPaths.NuGetPackageId)' == 'System.ServiceProcess.ServiceController'" />
  </ItemGroup>
</Target>


PS:Visual Studio 2017从15.5.4到15.7.3进行了测试,适用于Visual Studio 2017的选项是。但是,请使用作者建议的版本:

<Target Name="IncludePackageReferenceDependencies" AfterTargets="GetVsixSourceItems">
  <ItemGroup>
    <VSIXSourceItem Include="@(ReferencePath)" Condition="$([System.String]::new('%(ReferencePath.FusionName)').StartsWith('NuGet.VisualStudio'))" />
  </ItemGroup>
</Target>


不要尝试Simon Mourier建议的版本。这可能在VS 2015中起作用,但现在不起作用。还要注意,此解决方案适用于NuGet的PackageReference版本。它可能适用于packages.config,但我没有耐心进行测试。

我想你正在寻找一种更灵活的方法来回答其他问题,我使用了以下方法

  <Target Name="IncludeProjectReferenceNuGetPackageAssemblies" AfterTargets="GetVsixSourceItems">
    <!--Add project reference NuGet package assemblies to the package-->
    <ItemGroup>
      <VSIXSourceItem Include="@(ReferencedVSIXSourceItem)" Condition="'%(ReferencedVSIXSourceItem.NuGetSourceType)' == 'Package' and '%(ReferencedVSIXSourceItem.FrameworkFile)' != 'true'" />
    </ItemGroup>
  </Target>

这将把所有已解析的项目引用NuGet引用添加到相应的VSIxesSubpath。这也将忽略对NuGet包文件的框架引用

这些项将添加到目标GetVsixSourceItems中。我在添加项目输出程序集时也遇到问题,因为默认情况下,它会将程序集添加到中间输出路径(obj)文件夹中。这给我带来了问题,因为我在bin文件夹中对程序集进行了签名。这里有一个使用bin程序集而不是中间输出程序集的目标

  <Target Name="SwapIntermediateAssemblyForTargetPath" AfterTargets="GetVsixSourceItems" Condition="'$(IncludeAssemblyInVSIXContainer)' == 'true'">
    <!--Create an item for the primary output of the project. By default the intermediate assembly is packed in the VSIX. Use the output target path instead.-->
    <ItemGroup>
      <VSIXSourceItem Remove="@(IntermediateAssembly)" />

      <VSIXSourceItem Include="$(TargetPath)">
        <VSIXSubPath>$(AssemblyVSIXSubPath)</VSIXSubPath>
        <InstallRoot>$(InstallRoot)</InstallRoot>
        <Ngen>$(Ngen)</Ngen>
        <NgenApplication>$(NgenApplication)</NgenApplication>
        <NgenArchitecture>$(NgenArchitecture)</NgenArchitecture>
        <NgenPriority>$(NgenPriority)</NgenPriority>
      </VSIXSourceItem>
    </ItemGroup>
  </Target>

$(AssemblyVSIxesSubpath)
$(InstallRoot)
$(Ngen)
$(应用程序)
$(体系结构)
$(优先权)

我想你误解了我的问题。我不是在创建项或项目模板,而是在创建自定义签入策略。我遇到的问题是生成的VSIX包不包括我的程序集所依赖的NuGet程序集。您所引用的链接是如何确保项/项目模板自动将NuGet包拉入使用这些模板的项目中。此外,问题围绕NuGet的新PackageReference特性展开。如果我使用NuGet的packages.config方法而不是出于好奇,那么一切都很好。你有没有理由想/需要使用NuGet的PackageReference功能?是的,--基本上它有很多好处,是NuGet的未来。虽然我同意这是NuGet的未来,我认为不幸的是,它仍然有相当数量的bug。更新了我的答案。即使有了你的更新,你的答案也在谈论一些完全无关的东西(项目和项目模板)。我可能会迟到,但这个帖子解决了我的问题:@AmauryLevé:这个问题可能解决了你的问题,但它与我引用的问题完全无关,这与VSIX packager有关,它通过NuGet的PackageReference特性自动包含程序集。该问题/答案涉及通过直接引用程序集来添加资产。