我正在创建一个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年后,还不可能吗?
答案 0 :(得分:6)
由于在线回购安装/升级软件包仍然没有内置功能,所以这里有一个小的解决方法可能有所帮助:
<强>先决条件强>
首先,将NuGet.VisualStudio nuget包安装到您的项目中。 你可以从here
获得安装后,软件包会自动将程序集引用的嵌入互操作类型属性设置为 True 。这样做的原因是当用户更新到新版本的NuGet时,使您的代码能够抵御版本更改。
出于同样的原因,您必须 NOT 使用代码中除上述接口之外的任何其他类型。您不得引用任何其他NuGet程序集,包括NuGet.Core.dll。
设置完所有内容后,您可以在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;
如果有帮助,请告诉我!
答案 1 :(得分:1)
是的,您可以创建一个nuget包并添加其他包作为其依赖项。然后,当您下载该软件包时,它将获得所有依赖项并添加到您的项目中。