创建一个从在线提要中提取 NuGet 引用的 Visual Studio 项目模板

Posted

技术标签:

【中文标题】创建一个从在线提要中提取 NuGet 引用的 Visual Studio 项目模板【英文标题】:Create a Visual Studio Project Template that pulls NuGet references from online feed 【发布时间】:2016-07-08 16:58:09 【问题描述】:

我正在创建一个 Visual Studio 项目模板并将其捆绑在一个 VS 扩展中。我需要从模板创建的项目来引用 ~20 个 NuGet 包。

是否可以从 nuget.org 解析引用,而不必在 VSIX 中包含所有引用?

NuGet documentation on Visual Studio Templates 提供了有关如何在 VSIX 中添加包的说明,但它要求文件本地存储在磁盘上,.nupkg 是 vsix 中的捆绑包:

将您的 nupkg 文件添加为 source.extension.vsixmanifest 文件中的自定义扩展内容。如果您使用的是 2.0 架构,它应该如下所示:

<Asset Type="Moq.4.0.10827.nupkg" d:Source="File" 
    Path="Packages\Moq.4.0.10827.nupkg" d:VsixSubPath="Packages" />

问题已经提出

我知道有人问过类似的问题 (Creating a Visual Studio Project Template that already includes a Nuget Package Reference?) 并回答了(不可能),但这是在 2011 年提出的。

5年过去了,还是不行吗?

【问题讨论】:

我现在正在做两个模板。一种使用 NPM,一种使用 NuGet。 NuGet 的难度要大得多……我可能会收拾那个,然后尝试仅使用基于 NPM 的那个。 为什么不编写 20 个包的 NuGet 安装脚本并将其粘贴到 Readme.Txt 中? @GerardoGrignoli - 感觉很老套。此外,还有一些人不明白,或者在额外的步骤工作时遇到问题。 @Vaccano 我即将同意 Gerardo 的观点。我假设你已经做了一个巫师。在RunFinished-方法中,您可以手动安装/升级您的软件包。这并不是真正的 hackish,因为没有其他解决方案。 @lok​​usking - 嗯,我不知道这可以在代码中完成。我以为@Gerardo 是说把它留给模板的消费者。如果它可以由模板自动完成(在RunFinished 中),那么这就是我想要的。但我不知道以编程方式恢复 nuget 包的方法.... 【参考方案1】:

由于仍然没有从在线回购安装/升级包的内置功能,这里有一个小解决方法可能会有所帮助:

先决条件

首先,将 NuGet.VisualStudio nuget 包安装到您的项目中。 你从here得到那个

安装后,包会自动将程序集引用的 Embed Interop Types 属性设置为 True。这样做的原因是让您的代码在用户更新到较新版本的 NuGet 时对版本更改具有弹性。

出于同样的原因,您必须在代码中使用除上述接口之外的任何其他类型。您也不得引用任何其他 NuGet 程序集,包括 NuGet.Core.dll。

设置完所有这些内容后,您可以在 RunFinished-Method 中执行以下操作:

var componentModel = (IComponentModel) Package.GetGlobalService(typeof(SComponentModel));
IVsPackageInstallerServices installerServices = 
     componentModel.GetService<IVsPackageInstallerServices>();

if (!installerServices.IsPackageInstalled(project, "Newtonsoft.Json")) 
     var installer = componentModel.GetService<IVsPackageInstaller>();
     installer.InstallPackage(
         "All", 
         project, 
         "Newtonsoft.Json", 
         (System.Version) null, 
         false);

注意

该示例基于Newtonsoft.Json 显示了如何安装软件包。 当然,您可以选择以安装为目标的项目。您还可以确定要安装的版本。

好像有点不舒服,可惜没有别的办法。

用途

using Microsoft.VisualStudio.ComponentModelHost;
using Microsoft.VisualStudio.Shell;
using NuGet.VisualStudio;

如果有帮助,请告诉我!

【讨论】:

【参考方案2】:

是的,您可以创建一个 nuget 包并将这些其他包添加为其依赖项。然后,当您下载该软件包时,它将获取其所有依赖项并添加到您的项目中。

【讨论】:

我希望创建一个 Visual Studio 项目模板,而不是 NuGet 包。 是的,我明白了,您创建了模板并将刚刚创建的包添加到该模板中。 对不起,您的问题是您无法将 nuget 包添加到创建的模板中。我的错。让我试着找出答案。 @Daniel 您可以将 NuGet 包添加到模板中,但您需要手动下载 .nupkg 并将其作为资源添加到项目模板中。使用 VS 项目模板时,NuGet 不会自动下载包。

以上是关于创建一个从在线提要中提取 NuGet 引用的 Visual Studio 项目模板的主要内容,如果未能解决你的问题,请参考以下文章

如何从通过情节提要创建的 UITableView 中提取 UIView?

从情节提要中提取 nibs/xibs (iOS)

从 Nuget 包中自动提取本机和托管 DLL

XML 文件可以从 URL 读取数据吗?

Azure Devops 找不到恢复的 nuget 包

powershell 从TFS提要下载所有NuGet包的脚本