繁体   English   中英

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

[英]Create a Visual Studio Project Template that pulls NuGet references from online feed

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

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

Visual Studio模板上NuGet文档提供了有关如何在VSIX中添加软件包的说明,但它要求将文件本地存储在磁盘上,并且.nupkg.nupkg中的软件包:

将您的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" /> 

问题已经问过

我知道有一个类似的问题( 创建一个已经包含Nuget Package Reference的Visual Studio项目模板? )并回答(不可能),但是2011年就提出了这个问题。

5年后,还不可能吗?

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

先决条件

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

安装后,程序包将自动将程序集引用的Embed Interop Types属性设置为True 这样做的原因是当用户更新到较新版本的NuGet时,使您的代码能够抵御版本更改。

出于同样的原因,你不能使用任何其他类型,除了在你的代码上面的接口。 您不能引用任何其他NuGet程序集,包括NuGet.Core.dll。

设置完所有内容后,您可以在RunFinished执行以下RunFinished

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显示了如何安装包。 您肯定可以选择面向安装的项目。 您还可以确定要安装的版本。

这似乎有点不舒服,但遗憾的是没有别的办法。

Usings

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

如果有帮助,请告诉我!

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM