[英]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.config
到PackageReference
。
此外, 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.