我正试图升级一批旧的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引用的任何示例。我知道我可以简单地向xml注入一个xdocument,但是由于我努力使用nuget.core,所以我希望能够找到一个使用它的解决方案。
有什么帮助吗?
发布于 2018-04-27 16:53:35
我不知道现在使用什么方法来管理包,但是如果是packages.config,那么我认为最好迁移到PackageReference。因为它可以使用NuGet PackageReference升平机将依赖关系从packages.config转换为PackageReference格式。
在此之后,您可以使用内置在添加/删除中的NuGet包管理器UI扩展来扩展我们的包。
UPD2.Visual Studio 17 Preview 3 有工具,用于从packages.config迁移到PackageReference。
此外,MSBuild 15.1 + 有内置的NuGet目标(如恢复和pack )可以与自定义构建目标相结合。这使得构建过程更容易。
如果仍然希望将程序写入添加到.csproj的引用,则可以为Visual Studio创建扩展。
UPD1.从IEnumerable<Project>属性获取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();
}
}
}从packages.config迁移到PackageReference,项目类,GlobalProjectCollection,AddItemFast
发布于 2018-04-27 06:22:43
简短的回答。你不能这么做。
NuGet.Core dll是NuGet 2.x,而PackageReference是在4.x4.x中引入的,它有一种更模块化的方法,而且没有一个包可以用来实现您的目标。
如果您有VisualStudio2017,可以使用最新的15.7版本(将在2周内发布或仅使用预览版)将包迁移到PackageReference。这是一个内置的工具,如果兼容的话,应该可以处理大部分场景。
如果您真的不得不以编程的方式完成这个任务,那么下面的代码应该是一个很好的开始。
https://stackoverflow.com/questions/50048697
复制相似问题