17

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

VSIX 解决方案结构

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


我相信我已经适当地设置了我的 VSIX 清单,因为当我不引用时一切正常Microsoft.Net.Http(最初我是在值中硬编码而不是检索值)。我不确定为什么包含的Microsoft.TeamFoundationServer.ExtendedClientNuGet 包不会导致任何问题,而Microsoft.Net.HttpNuGet 包会。

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

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

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


更新:

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

4

4 回答 4

4

对于像我们这样面临这个问题的可怜人(使用 PackageReference 和 VSIX 依赖项的 nuget),我找到了一种解决方法,受这篇文章的启发:通过 PackageReference 引用的 NuGet 包不包括 VSIX中不完全适合我的 DLL(它包括仅元数据版本的程序集,而不是带有代码的完整程序集)。例如,在这里,我手动引用了 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 测试

于 2018-01-19T14:10:08.133 回答
2

我您正在寻找一种更灵活的方式来解决我使用以下问题的其他答案。

  <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 引用添加到适当的 VSIXSubPath。这也将忽略对 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>
于 2020-04-17T22:54:09.457 回答
0

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

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

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

看来System.Net.Http是正确的选择,至少对于 Windows 平台上的 .NET 而言。这个包没有外部依赖也毫无价值。


编辑: 看来这可能与PackageReference自身的错误有关。我在这里看到了一个类似的记录错误。

于 2017-05-26T14:34:32.117 回答
-2

适用于 Visual Studio 2017 的选项是通过 PackageReference 引用的 NuGet 包不包括 VSIX 中的 DLL。但是,使用作者建议的版本:

<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,但我没有耐心对其进行测试。

于 2018-06-04T11:22:03.167 回答