Поделиться через


Управление глобальными пакетами, кэшем и временными папками

При установке, обновлении или восстановлении пакета NuGet управляет пакетами и сведениями о пакетах в нескольких папках за пределами структуры проекта:

Имя Местоположение
глобальные пакеты
  • Виндовс: %userprofile%\.nuget\packages
  • Mac/Linux: ~/.nuget/packages
  • Переопределение с помощью переменной среды NUGET_PACKAGES, globalPackagesFolderrepositoryPathпараметров конфигурации (при использовании PackageReference и packages.configсоответственно) или RestorePackagesPath свойства MSBuild (только MSBuild). Переменная среды имеет приоритет над параметром конфигурации.
http-cache
  • Виндовс: %localappdata%\NuGet\v3-cache
  • Mac/Linux: ~/.local/share/NuGet/v3-cache
  • Переопределение с помощью переменной среды NUGET_HTTP_CACHE_PATH.
temp
  • Виндовс: %temp%\NuGetScratch
  • Мак: /tmp/NuGetScratch
  • Линукс: /tmp/NuGetScratch<username>
  • Переопределение с помощью переменной среды NUGET_SCRATCH.
  • plugins-cache4.8+
    • Виндовс: %localappdata%\NuGet\plugins-cache
    • Mac/Linux: ~/.local/share/NuGet/plugins-cache
    • Переопределение с помощью переменной среды NUGET_PLUGINS_CACHE_PATH.

    Замечание

    NuGet 3.5 и более ранних версий использует кэш пакетов вместо http-cache, который находится в %localappdata%\NuGet\Cache.

    Используя папки кэша и глобальных пакетов , NuGet обычно избегает скачивания пакетов, которые уже существуют на компьютере, повышая производительность операций установки, обновления и восстановления. При использовании PackageReference папка глобальная папка пакетов предотвращает сохранение скачанных пакетов в папках проектов, где они могут быть непреднамеренно добавлены в систему контроля версий, а также снижает общее влияние NuGet на хранилище компьютера.

    При запросе на получение пакета NuGet сначала ищет в папке global-packages. Если точной версии пакета нет, NuGet проверяет все не-HTTP источники пакетов. Если пакет по-прежнему не найден, NuGet ищет пакет в http-кэше, если вы не указываете команды --no-http-cachedotnet.exe или команды -NoHttpCachenuget.exe. Если пакет не находится в кэше или кэш не используется, NuGet извлекает пакет по протоколу HTTP.

    Дополнительные сведения см. в статье "Что происходит при установке пакета?".

    глобальные пакеты

    Папка глобальных пакетов — это папка NuGet, в которой устанавливается любой скачанный пакет. Каждый пакет полностью распаковывается в вложенную папку, которая соответствует идентификатору пакета и номеру версии. Проекты, использующие формат PackageReference , всегда используют пакеты непосредственно из этой папки. При использовании packages.configпакеты устанавливаются в папку глобальных пакетов , а затем копируются в папку проекта packages .

    Очистка каталога глобальных пакетов

    Для удаления пакетов, которые больше не используются, необходимо вручную очистить каталог глобальных пакетов. Это можно сделать с помощью команды или кнопки dotnet nuget locals global-packages --clear "Очистить локальные ресурсы NuGet" в параметрах Visual Studio (эквивалентно dotnet nuget locals all --clear). После очистки каталога глобальных пакетов необходимо снова восстановить проекты, чтобы повторно загрузить все необходимые пакеты. В Visual Studio может потребоваться перезагрузить решение для очистки кэша актуальных восстановлений NuGet, или выполнить восстановление через командную строку (например, в окне терминала Visual Studio) с помощью msbuild -t:restore your.sln.

    Чтобы очистить только неиспользуемые пакеты, процесс состоит из двух шагов. Во-первых, необходимо включить параметр updatePackageLastAccessTimenuget.config. Этот параметр приведет к обновлению файла .nupkg.metadata каждого пакета NuGet при его использовании для восстановления. При запуске восстановления, если проект уже считается актуальным, метки времени пакета не обновляются. Файл .nupkg.metadata является последним файлом, который NuGet создаёт при скачивании и извлечении пакетов во время восстановления или установки, и это файл, который используется восстановлением для проверки успешности извлечения пакета.

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

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

    Если вы собираетесь написать собственное средство очистки, важно удалить .nupkg.metadata файл при удалении любого из других файлов пакета, поэтому рекомендуется сначала удалить этот файл. В противном случае проекты, ссылающиеся на пакет, могут иметь непредвиденное поведение. При написании средства очистки в .NET рекомендуется использовать ConcurrencyUtilities.ExecuteWithFileLocked[Async](..) из пакета NuGet.Common, передавая полный путь nupkg каталога пакета, который вы собираетесь удалить, в качестве ключа, чтобы избежать удаления пакета, который одновременно восстанавливается. Каталог глобальных пакетов можно программировать с помощью пакета NuGet.Configuration. Используйте Settings.LoadDefaultSettings(path) для получения экземпляра ISettings (можно передать null как путь или указать каталог, если вы хотите обрабатывать решения с файлoм nuget.config, который изменяет стандартный каталог пакетов), а затем воспользуйтесь SettingsUtility.GetGlobalPackagesFolder(settings). Кроме того, можно запустить dotnet nuget locals global-packages --list в качестве дочернего процесса и проанализировать выходные данные.

    http-cache

    NuGet кэширует копии большинства коммуникаций веб-канала NuGet (за исключением поиска), организованных в вложенные папки для каждого источника пакета. Пакеты не развернуты, а файлы с последней датой изменения старше 30 минут обычно считаются истекшими.

    температура

    Папка, в которой NuGet может хранить временные файлы во время различных операций.

    плагин-кэш

    Папка, в которой NuGet хранит результаты запроса на утверждение прав доступа операции. Дополнительные сведения см. в справочнике по кроссплатформенным подключаемым модулям .

    Просмотр расположений папок

    Вы можете просмотреть расположения с помощью команды nuget locals:

    # Display locals for all folders: global-packages, http cache, temp and plugins cache
    nuget locals all -list
    

    Типичные выходные данные (Windows; "user1" — текущее имя пользователя):

    http-cache: C:\Users\user1\AppData\Local\NuGet\v3-cache
    global-packages: C:\Users\user1\.nuget\packages\
    temp: C:\Users\user1\AppData\Local\Temp\NuGetScratch
    plugins-cache: C:\Users\user1\AppData\Local\NuGet\plugins-cache
    

    (package-cache используется в NuGet 2.x и отображается с NuGet 3.5 и более ранними версиями.)

    Вы также можете просмотреть расположения папок с помощью команды dotnet nuget locals:

    dotnet nuget locals all --list
    

    Типичные выходные данные (Mac; "user1" — текущее имя пользователя):

    info : http-cache: /home/user1/.local/share/NuGet/v3-cache
    info : global-packages: /home/user1/.nuget/packages/
    info : temp: /tmp/NuGetScratch
    info : plugins-cache: /home/user1/.local/share/NuGet/plugins-cache
    

    Типичные выходные данные (Linux; "user1" — текущее имя пользователя):

    info : http-cache: /home/user1/.local/share/NuGet/v3-cache
    info : global-packages: /home/user1/.nuget/packages/
    info : temp: /tmp/NuGetScratchuser1
    info : plugins-cache: /home/user1/.local/share/NuGet/plugins-cache
    

    Чтобы отобразить расположение одной папки, используйте http-cache, global-packages, temp или plugins-cache вместо all.

    Очистка локальных папок

    Command-line

    Если возникают проблемы с установкой пакетов или требуется убедиться, что пакеты устанавливаются из удаленной коллекции, используйте locals --clear параметр (dotnet.exe) или locals -clear (nuget.exe), указав папку для очистки или all очистить все папки:

    # Clear the 3.x+ cache (use either command)
    dotnet nuget locals http-cache --clear
    nuget locals http-cache -clear
    
    # Clear the 2.x cache (NuGet CLI 3.5 and earlier only)
    nuget locals packages-cache -clear
    
    # Clear the global packages folder (use either command)
    dotnet nuget locals global-packages --clear
    nuget locals global-packages -clear
    
    # Clear the temporary cache (use either command)
    dotnet nuget locals temp --clear
    nuget locals temp -clear
    
    # Clear the plugins cache (use either command)
    dotnet nuget locals plugins-cache --clear
    nuget locals plugins-cache -clear
    
    # Clear all caches (use either command)
    dotnet nuget locals all --clear
    nuget locals all -clear
    

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

    Visual Studio

    Visual Studio поддерживает очистку всех локальных папок в опциях Диспетчера пакетов NuGet, расположенных в > меню > Параметры диспетчера пакетов NuGet.

    На странице "Общие" выберите "Очистить локальные ресурсы NuGet". После запуска это действие не может быть отменено. Откроется индикатор выполнения и будет содержать окончательное состояние команды.

    В окне вывода при выборе команды "Показать выходные данные" из диспетчера пакетов будут отображаться дополнительные сведения о ясной команде, включая любые сообщения об ошибках.

    Очистка локальных ресурсов NuGet

    Кнопка

    Управление кэшем в настоящее время недоступно через консоль диспетчера пакетов.

    Дополнительные сведения см. в разделе "Параметры NuGet" в Visual Studio.

    Устранение ошибок

    При использовании nuget locals или dotnet nuget locals могут возникать следующие ошибки:

    • Ошибка. Не удается получить доступ к пакету< файлов>, так как он используется другим процессом или сбоем очистки локальных ресурсов: не удается удалить один или несколько файлов.

      Один или несколько файлов в папке используются другим процессом; Например, проект Visual Studio открыт, который ссылается на пакеты в папке глобальных пакетов . Закройте эти процессы и повторите попытку.

    • Ошибка: доступ к пути <> запрещен или каталог не пуст

      У вас нет разрешения на удаление файлов в кэше. При возможности измените разрешения папки и повторите попытку. В противном случае обратитесь к системному администратору.

    • Ошибка: указанный путь, имя файла или оба слишком длинны. Полное имя файла должно быть меньше 260 символов, а имя каталога должно быть меньше 248 символов.

      Сократите имена папок и повторите попытку.