如何在VSIX安装程序中包含NuGet软件包中的程序集?
我正在创建Visual Studio 2017自定义签入策略扩展。我当前的解决方案结构如下: 注意:我正在利用新的NuGet方法,这就是为什么没有packages.config文件的原因如何在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
我相信我已经正确地设置了我的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特性自动包含程序集。该问题/答案涉及通过直接引用程序集来添加资产。