首页 文章

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

提问于
浏览
14

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

VSIX Solution Structure

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


我相信我已经适当地设置了我的VSIX清单,因为当我没有引用 Microsoft.Net.Http 时,一切都很完美(原来我在值中硬编码而不是检索值) . 我不确定为什么包含 Microsoft.TeamFoundationServer.ExtendedClient NuGet包不会导致任何问题,而 Microsoft.Net.Http NuGet包确实存在问题 .

我查看了调试文件夹以查看正在编译的内容,并且我看到每个程序集都被拉入,但是如果我解压缩VSIX(我将其重命名为* .zip并解压缩它),则只包含项目程序集; Nuget引用的程序集未打包在VSIX包中 .

我遇到了一些资源,但似乎没有任何工作:

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


Update:

我相信用于生成VSIX包的工具可能不支持NuGet的新 PackageReference 功能 . 如果我使用旧的packages.config功能,一切正常 . 我已经输入UserVoice Ticket来支持新的NuGet功能 .

3 回答

  • -1

    通过执行以下Microsoft教程中概述的步骤,我能够在模板中成功包含NuGet包:Packages in Visual Studio templates

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

    我见过其他人因为他们正在使用的NuGet包而遇到问题 . 对于.NET Core,我使用了Microsoft.Net.Http,虽然它确实需要Microsoft.BCL . 除非您遇到问题,否则我建议保留遗留系统,特别是因为这些命名空间似乎是移动目标 .

    看来System.Net.Http是正确的选择,至少在Windows平台上是.NET . 此包没有外部依赖性也是值得的 .


    EDIT: 看来这可能与 PackageReference 本身的错误有关 . 我看到here描述了一个类似的记录错误 .

  • 0

    对于那些像我们一样面对这个问题的穷人(nuget使用PackageReference和VSIX依赖),我找到了一个解决方法,受到这篇文章的启发:NuGet packages referenced via PackageReference don't include DLLs in 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进行测试

  • 0

    适用于Visual Studio 2017的选项是NuGet packages referenced via PackageReference don't include DLLs in VSIX . 但是,请使用作者建议的版本:

    <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,但我没有耐心测试它 .

相关问题