簡體   English   中英

如何使用nuget.core將nuget包添加到c#項目文件

[英]How to add nuget packages to c# project files with nuget.core

我試圖升級一堆舊的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,所以我希望找到一個使用它的解決方案。

有什么幫助嗎?

簡短的答案。 你不能

NuGet.Core dll是NuGet 2.x,而PackageReference是在4.x 4.x中引入的,它具有一種更加模塊化的方法,沒有一個可用於實現目標的軟件包。

如果您擁有Visual Studio 2017,則可以使用最新的15.7版本(將在2周內發布或僅使用預覽)將包遷移到PackageReference。 這是一個內置工具,如果兼容,它應該可以處理大多數情況。

如果您真的不得不通過編程來解決這個問題,那么下面的代碼應該是一個很好的開始。

我不知道現在使用什么方法來管理軟件包,但是如果是packages.config ,那么我認為最好遷移到PackageReference 因為它可能使用NuGet PackageReference升級程序 ,將您的依賴項從packages.config轉換為PackageReference格式。

之后,您可以使用Visual Studio 2017中內置的NuGet軟件包管理器UI擴展來添加/刪除我們的軟件包。

UPD2 Visual Studio 17 Preview 3 已經用於遷移從工具packages.configPackageReference


此外, MSBuild 15.1 + 還具有內置的NuGet目標,例如還原打包 ,您可以將其與自定義構建目標結合使用。 它使構建過程更容易。


如果仍要編寫程序以添加對.csproj引用,則可以為Visual Studio創建擴展名。


UPD1 GlobalProjectCollection獲取IEnumerable<Project>並從Include屬性解析庫名稱:

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();
        }
    }
}

從packages.config遷移到PackageReference | 項目類別 GlobalProjectCollection | AddItemFast

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM