Как я могу иметь сборки (dll) для локальных пакетов в NuGet v3 API?

Вступление

Всем привет, я нашел способ найти локальные пакеты NuGet с помощью API NuGet v3. Я не знаю, правильно ли я это делаю, но это работает... Не так много документации. Единственная интересная документация, которую я нашел, - это блог. Так что я не знаю, правильно ли я это делаю. Я пытаюсь найти некоторые вопросы о моей проблеме на официальном GitHub NuGet. Я не нашел ничего интересного даже в Google.

Поэтому я сохранил свой код и попытался найти способ получения сборок (dll) при поиске локальных пакетов с помощью API NuGet v3. Я пробую много классов NuGet, но, кажется, ничто не возвращает того, что я ожидал. Некоторые функции возвращают информацию о пакете, но AssemblyReferences собственность отсутствует.

Я знаю, в API NuGet v2, функции поиска возвращают IPackage, Теперь, в v3, он возвращает IPackageSearchMetadata или LocalPackageInfo в зависимости от того, какие функции вы вызываете. Итак, они изменили возвращенный объект.

Итак, есть ли способ получить AssemblyReferences словно IPackage в API Nuget V2?

Я не знаю, если это проблема, но я опубликовал это на GitHub.

Пример кода с использованием API Nuget V2 (работает)

var rootPath = @"pathWhereNugetPackageAre";
LocalPackageRepository repo1 = new LocalPackageRepository(rootPath);
var newtonsoft = repo1.FindPackagesById("Newtonsoft.Json").First();
//return the package and the assembly property because it's v2

Пример кода с использованием API Nuget V3 (что я пробовал)

var rootPath = @"pathWhereNugetPackageAre";
var logger = new Logger();

List<Lazy<INuGetResourceProvider>> providers = new List<Lazy<INuGetResourceProvider>>();
providers.AddRange(Repository.Provider.GetCoreV3());

FindLocalPackagesResourceV2 findLocalPackagev2 = new FindLocalPackagesResourceV2(rootPath);
var packageFound = findLocalPackagev2.GetPackages(logger, CancellationToken.None)
    .FirstOrDefault();
//found, but missing a lot of informations...

FindLocalPackagesResourceV3 findLocalPackagev3 = new FindLocalPackagesResourceV3(rootPath);
var packageNotFound = findLocalPackagev3.GetPackages(logger, CancellationToken.None)
    .FirstOrDefault();
// I don't know why it is null. It should be found

NuGetv3LocalRepository nugetV3LocalRepo = new NuGetv3LocalRepository(rootPath);
var newtonsoftToFound = nugetV3LocalRepo.FindPackagesById("Newtonsoft.Json")
    .FirstOrDefault();
// return empty I don't know why...

var supportedFramework = new[] { ".NETFramework,Version=v4.6" };
var searchFilter = new SearchFilter(true)
{
    SupportedFrameworks = supportedFramework,
    IncludeDelisted = false
};

PackageSource localSource = new PackageSource(rootPath);
SourceRepository localRepository = new SourceRepository(localSource, providers);
PackageSearchResource searchLocalResource = await localRepository
    .GetResourceAsync<PackageSearchResource>();

var packageFound3 = await searchLocalResource
    .SearchAsync("Newtonsoft.Json", searchFilter, 0, 10, logger, CancellationToken.None);
var thePackage = packageFound3.FirstOrDefault();
// found but missing the assemblies property

// Logger class
public class Logger : ILogger
{
    private List<string> logs = new List<string>();

    public void LogDebug(string data)
    {
        logs.Add(data);
    }

    public void LogVerbose(string data)
    {
        logs.Add(data);
    }

    public void LogInformation(string data)
    {
        logs.Add(data);
    }

    public void LogMinimal(string data)
    {
        logs.Add(data);
    }

    public void LogWarning(string data)
    {
        logs.Add(data);
    }

    public void LogError(string data)
    {
        logs.Add(data);
    }

    public void LogInformationSummary(string data)
    {
        logs.Add(data);
    }

    public void LogErrorSummary(string data)
    {
        logs.Add(data);
    }
}

Я знаю, что могу перечислить все файлы DLL, используя DirectoryInfo, но я ищу класс NuGet, который делает логику.

1 ответ

Решение

@emgarten Он ответил на мой вопрос на GitHub

Чтобы найти пакеты в локальных папках, посмотрите: https://github.com/NuGet/NuGet.Client/blob/dev/src/NuGet.Core/NuGet.Protocol/Utility/LocalFolderUtility.cs

Обратите внимание, что папки v2 и v3 ожидают присутствия различных структур и файлов, поэтому, если пакет не возвращен, скорее всего, потому что он не находится в ожидаемом месте или дополнительных файлов за пределами nupkg не было.

Вы можете прочитать пакет, используя PackageArchiveReader который дает вам данные, аналогичные IPackage,

Вы можете использовать PackageArchiveReader для извлечения информации о пакете NuGet. Ты можешь использовать GetFiles()или другие функции (доступно много функций). В моем случае я использовал GetReferenceItems()потому что он сгруппирован по целевым фреймворкам. Так что интереснее получить правильные сборки с целевой платформой.

Примечание: если у вас возникли проблемы с поиском пакетов с GetPackageV2() а также GetPackageV3()Убедитесь, что у вас есть действительная папка структуры V2 или папка структуры V3. Я сравнил папку NuGet с папкой NuGet Visual Studio, и некоторые файлы отсутствовали (*.nuspec, *nupkg.sha512...). Должно быть, этого не хватает, чтобы поиск V3 не работал. Я сравнил свою папку NuGet с моим последним проектом (NuGet v2), и папки и файлы были одинаковыми. Итак, я использовал GetPackageV2(),

Надеюсь, это поможет!

Другие вопросы по тегам