如何使用nuget.core将nuget包添加到c#项目文件中

时间:2018-04-26 17:18:05

标签: c# nuget

我正在尝试升级一堆旧的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我希望找到一个使用它的解决方案。

有任何帮助吗?

2 个答案:

答案 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目标,例如restorepack,您可以将其与自定义构建目标相结合。它使构建过程更容易。

如果您仍想编写程序以添加对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