在Visual Studio自定义项模板中从nuget.org添加NuGet包
自定义项模板自动安装NuGet包(从nuget.org拉取)的可行方案
方案1:通过DTE调用NuGet控制台命令
直接在模板向导中使用Visual Studio的DTE对象执行Install-Package命令,无需本地存储包,自动从nuget.org拉取并安装。
在向导的ProjectItemFinishedGenerating或RunFinished方法中添加逻辑:
public void ProjectItemFinishedGenerating(ProjectItem projectItem) { var dte = (DTE)ServiceProvider.GetService(typeof(DTE)); var targetProject = projectItem.ContainingProject; // 替换为目标包名和版本 var packageName = "Newtonsoft.Json"; var packageVersion = "13.0.3"; var nugetSource = "https://api.nuget.org/v3/index.json"; // 执行安装命令,自动处理包下载和项目配置更新 dte.ExecuteCommand("NuGetPackageManager.InstallPackage", $"{targetProject.Name} {packageName} -Version {packageVersion} -Source {nugetSource}"); }
关键说明:
- 命令执行后,Visual Studio会自动更新项目配置(packages.config或PackageReference)并下载包,无需手动重新加载项目。
- 需在模板的
.vstemplate文件中正确配置向导扩展,指向你的向导程序集。
方案2:直接修改项目文件触发NuGet自动恢复
针对使用PackageReference的现代项目,直接在模板中添加PackageReference节点,或在向导中修改项目文件,然后触发NuGet恢复命令。
- 在项模板的项目文件片段中添加(或向导中动态写入):
<ItemGroup> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> </ItemGroup>
- 在向导的
RunFinished方法中触发恢复:
public void RunFinished() { var dte = (DTE)ServiceProvider.GetService(typeof(DTE)); var targetProject = dte.Solution.Projects.OfType<Project>().First(p => p.IsSelected); targetProject.Save(); // 触发NuGet恢复,自动从nuget.org拉取缺失的包 dte.ExecuteCommand("NuGetPackageManager.RestorePackages", targetProject.Name); }
关键说明:
- 此方案适配.NET Core/.NET 5+项目,也支持.NET Framework的PackageReference模式。
- 无需处理复杂的NuGet API,依赖Visual Studio内置的恢复机制。
方案3:使用NuGet.Client库直接操作项目
通过官方NuGet.Client库,绕过DTE的Project对象,直接通过项目路径完成包安装,完全从nuget.org拉取包。
- 在向导项目中引用NuGet.Client相关包:
NuGet.PackageManagement、NuGet.Configuration、NuGet.Packaging。 - 实现安装逻辑:
using NuGet.Configuration; using NuGet.PackageManagement; using NuGet.Packaging.Core; using NuGet.Versioning; using NuGet.Common; public void InstallPackage(string projectPath) { var settings = Settings.LoadDefaultSettings(projectPath); var sourceProvider = new SourceRepositoryProvider(settings, Repository.Provider.GetCoreV3()); // 确保nuget.org源存在 var nugetSource = sourceProvider.GetRepositories().FirstOrDefault(s => s.Source.Equals("https://api.nuget.org/v3/index.json", StringComparison.OrdinalIgnoreCase)); if (nugetSource == null) { var packageSources = settings.GetSection<PackageSources>(); packageSources.AddSource(new PackageSource("https://api.nuget.org/v3/index.json", "nuget.org")); settings.SaveToFile(); } var packageManager = new PackageManager(sourceProvider, settings, projectPath); var packageIdentity = new PackageIdentity("Newtonsoft.Json", NuGetVersion.Parse("13.0.3")); // 同步执行安装(也可使用异步) packageManager.InstallPackageAsync(packageIdentity, new ResolutionContext(), new NullLogger(), false, false).Wait(); }
关键说明:
- 此方案不依赖Visual Studio的DTE对象,灵活性更高,但需要处理NuGet配置和异步逻辑。
- 需确保向导程序集包含NuGet.Client的依赖,或采用独立部署方式。
通用配置要求
在模板的.vstemplate文件中添加向导扩展配置:
<WizardExtension> <Assembly>YourWizardAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=your_public_key</Assembly> <FullClassName>YourWizardNamespace.YourWizardClass</FullClassName> </WizardExtension>
内容的提问来源于stack exchange,提问作者JBartlau
相关产品推荐
相关产品推荐

