我正在尝试升级一堆旧的c#项目来使用我从旧的程序集依赖项中创建的nuget包。我想编写一个C#程序来更新所有csproj文件以引用该包。
我有使用nuget.core的代码,为nuget包创建一个依赖程序集的字典。我可以迭代我的项目文件中的引用,并从我的存储库中找到所需的nuget包。
var localRepo = PackageRepositoryFactory.Default.CreateRepository(nugetCachePath);
var packages = localRepo.GetPackages();
foreach (var package in packages)
{
foreach (var assemblyReference in package.AssemblyReferences)
{
assemblyToPackage.Add(Path.GetFileNameWithoutExtension(assemblyReference.Name).ToLower(),package);
}
}
我想我需要使用Nuget.Core ProjectManager来添加对我的项目文件(csproj)的引用。
<ItemGroup>
<PackageReference Incluse="KB.MyOldAssemblyPackage">
<Version>1.0.0</Version>
</PackageReference>
</ItemGroup>
我无法弄清楚如何获取ProjectManager的实例或如何使用它来添加nuget引用的任何示例。我知道我可以简单地用xdocument注入xml但是因为我努力使用nuget.core我希望找到一个使用它的解决方案。
有任何帮助吗?
答案 0 :(得分:0)
简短回答。 你不能。
NuGet.Core dll是NuGet 2.x,而PackageReference是在4.x中引入的 4.x采用更模块化的方法,并且您无法使用一个包来实现目标。
如果您使用Visual Studio 2017,则可以使用最新的15.7版本(将在2周内发布或仅使用预览版)将软件包迁移到PackageReference。 这是一个内置工具,如果兼容,应该可以处理大多数情况。
如果您真的不得不以编程方式执行此操作,则以下code应该是一个很好的开始。
答案 1 :(得分:0)
我不了解管理您现在使用的软件包的方法,但如果它是packages.config
,那么我认为最好迁移到PackageReference
。因为它可以使用NuGet PackageReference Upgrader将您的依赖项从packages.config转换为PackageReference
格式。
之后,您可以add/remove Visual Studio 2017
内置Visual Studio 17 Preview 3
NuGet Package Manager UI扩展程序包。
<强> UPD2 即可。 packages.config
has工具,用于从PackageReference
迁移到MSBuild 15.1 +
。
NuGet
has内置.csproj
目标,例如restore和pack,您可以将其与自定义构建目标相结合。它使构建过程更容易。
如果您仍想编写程序以添加对Visual Studio
的引用,则可以为IEnumerable<Project>
创建扩展名。
<强> UPD1 即可。从GlobalProjectCollection获取GetReferences
并从包含属性中解析库名称:
public static IEnumerable<string> GetReferences(IEnumerable<Project> project)
{
return project.Select(p => p.GetItems("Reference").Select(i => i.EvaluatedInclude);
}
-
NuGet
之后检查CreateReference
存储库中的此库以及您的代码(如果存在)的帮助,然后删除当前引用并创建新的:
using Microsoft.Build.Evaluation;
using System.Collections.Generic;
namespace NuGetReference
{
public static class Reference
{
public static void CreateReference(string projectName, string packageName, string packageVersion)
{
Project project = ProjectCollection.GlobalProjectCollection.LoadProject(projectName);
project.AddItemFast("PackageReference", packageName, new List<KeyValuePair<string, string>> { new KeyValuePair<string, string>("Version", packageVersion) });
project.Save();
}
}
}
-
render
Migrate from packages.config to PackageReference | Project Class | GlobalProjectCollection | AddItemFast