【问题标题】:VS Project Template with Public NuGet Packages带有公共 NuGet 包的 VS 项目模板
【发布时间】:2012-09-07 16:33:01
【问题描述】:
NuGet 文档为在 VS 模板中定义的包文件描述了两个可能的存储库:1) 在 VSIX 中,或 2) 在模板中。 “已安装”包的注册表还有第三个选项。
我们有自定义项目模板,这些模板将使用尚未在注册表中定义的公开可用的 NuGet 包。它会使 VSIX 和/或模板过于膨胀,以至于无法包含 nupkg 文件。是否有一些隐藏的选项或技巧可以让存储库改为指向 Visual Studio 用户定义的包源?
【问题讨论】:
标签:
nuget
vsix
visual-studio-templates
【解决方案1】:
由于我没有找到任何简单的“技巧”,因此我根据本次讨论编写了一个自定义项目向导 - http://nuget.codeplex.com/discussions/385955。
可以通过 PackageSourceProvider 找到包源,您可以通过 MEF 将其与 PackageInstaller 一起导入。然后,您从包源创建一个存储库,并将其传递给安装程序:
var factory = NuGet.PackageRepositoryFactory.Default;
var packageSources = PackageSourceProvider.LoadPackageSources().Select(s => s.Source).ToList();
var repository = new AggregateRepository(factory, packageSources, true);
NuGetPackageInstaller.InstallPackage(repository, project, package.Id, package.Version, false, false);
直接调用 InstallPackage 还允许您安装依赖包和程序集引用,这两者都被标准 NuGet VSIX 包安装程序禁用。
我猜标准 NuGet 出于安全原因不允许安装依赖项,但在我们的例子中,我们使用的是我们自己的 VSIX、我们的模板和我们的 NuGet 包,以及一些额外的已知依赖项,所以在模板实际使用之前很久就进行了许可证检查。