Как добавить пакеты nuget в файлы проекта c # с помощью nuget.core - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь обновить кучу старых проектов на 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, я надеялся найти решение, используя его.

Любая помощь там?

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Я не понимаю, какие способы управления пакетами вы используете сейчас, но если это packages.config, то я думаю, что лучше перейти на PackageReference. Он может использовать NuGet PackageReference Upgrader , который конвертирует ваши зависимости из файла packages.config в формат PackageReference.

После этого вы можете добавлять / удалять наши пакеты с интерфейсом диспетчера пакетов NuGet , который встроен в Visual Studio 2017.

UPD2 . Visual Studio 17 Preview 3 имеет инструмент для миграции с packages.config на PackageReference.


Также MSBuild 15.1 + имеет встроенных NuGet целей, таких как restore и pack , которые можно комбинировать с пользовательскими целями сборки. Это облегчает процесс сборки.


Если вы все еще хотите написать программу для добавленных ссылок на .csproj, вы можете создать расширение для Visual Studio.


UPD1 . Получите IEnumerable<Project> из GlobalProjectCollection и проанализируйте имена библиотек из атрибутов 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

0 голосов
/ 27 апреля 2018

Краткий ответ. Ты не можешь

dll NuGet.Core - это NuGet 2.x, а PackageReference была представлена ​​в 4.x 4.x имеет более модульный подход, и нет ни одного пакета, который вы можете использовать для достижения своей цели.

Если у вас Visual Studio 2017, вы можете использовать последнюю версию 15.7 (которая будет выпущена через 2 недели или просто предварительный просмотр) для переноса ваших пакетов в PackageReference. Это встроенный инструмент, который должен работать с большинством сценариев, если он совместим.

Если вы действительно испытываете необходимость в этом программно, следующий код должен быть отличным началом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...