Как игнорировать кеш для переопределения пакета nuget из репозитория? - PullRequest
0 голосов
/ 23 октября 2018

Это метод, который я использую для загрузки пакета NuGet с помощью API NuGet.Client.

    public DownloadResourceResult DownloadPackage(string packageId, NuGetVersion version)
    {
        var packageSource = new PackageSource(_Task.PackageSource);
        var sourceRepository = new SourceRepository(packageSource, Repository.Provider.GetCoreV3());
        DownloadResource downloadResource = _DownloadResource ?? (_DownloadResource = sourceRepository.GetResourceAsync<DownloadResource>().Result);
        var packageIdentity = new PackageIdentity(packageId, version);
        var packageDownloadContext = new PackageDownloadContext(NullSourceCacheContext.Instance);
        string globalPackagesFolder = SettingsUtility.GetGlobalPackagesFolder(_Settings);
        return downloadResource.GetDownloadResourceResultAsync(packageIdentity, packageDownloadContext, globalPackagesFolder, _Logger, CancellationToken.None).Result;
    }

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

Например, у меня есть пакет NuGet с именем MyPackage в репозитории NuGet.После того как я вызову этот метод, чтобы загрузить пакет.MyPackage загружается и распаковывается в C: \ Users [CurrentUser] .nuget \ packages.Если я обновлю MyPackage в репозитории, а затем снова вызову DownloadPackage, он не обновит кеш, и вся система будет считать, что пакет не обновлен.Я могу вручную удалить пакет из C: \ Users [CurrentUser] .nuget \ packages перед загрузкой, но он кажется агрессивным.Я предполагаю, что должен быть способ для лучшего контроля кэша.

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

1 Ответ

0 голосов
/ 23 октября 2018

Я считаю, что это пример проблемы XY .NuGet разработан для того, чтобы пакеты были неизменяемыми, поэтому вы работаете против дизайна, если воссоздаете одну и ту же версию пакета с другим контентом, даже для тестирования.Вы только что сделали мимолетный комментарий об автоматической упаковке и развертывании, но не объяснили, почему вы пишете пользовательский код для загрузки пакетов, а не с помощью nuget.exe, поэтому мне трудно сделать хорошее предложение.

Если у вас есть среда CI / CD, в которой пакеты создаются автоматически, и другие тесты автоматически используют их, то я рекомендую, чтобы пакеты создавались с предварительными номерами версий и публиковались в канале dev nuget.Например, здесь вы можете видеть, где CI-сервер команды ASP.NET публикует сборки dev пакета, несколько раз в день.Когда они будут готовы опубликовать готовую производственную версию, другие сборки сборки CI без предварительной версии будут отправлены на nuget.org вместо их ленты разработчика.

В зависимости от того, что вы пытаетесь сделать, изменение папки глобальных пакетов может работать для вас.Предполагая, что вы используете git для управления исходным кодом, если вы сделаете папку глобальных пакетов вашего теста в игнорируемой части вашего git-репо, git clean -Xdf удалит ее, и я считаю, что для CI-серверов обычная очистка перед сборкой.Это также то, что я сделал для локального, ручного тестирования, где я не хотел загрязнять свой глобальный кеш.Я просто удаляю папку, как только закончу.

В конечном итоге кеш пакета - это просто папка, которую вы можете удалить с помощью API-интерфейсов System.IO, при этом нет необходимости использовать API-интерфейсы NuGet.Хотя, если вы хотите учесть тот факт, что файлы nuget.config могут изменять папку глобальных пакетов, вы можете использовать API-интерфейсы NuGet, чтобы найти ее.Если вы не возражаете против удаления всех пакетов, вы можете просто запустить nuget.exe locals global-cache -clear и не писать никакого кода.

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