Если вы ищете готовое решение, которое требует от вас лишь небольшого количества сценариев, я не знаю о таком инструменте.Однако я не верю, что вам будет особенно трудно делать то, чего вы хотите достичь.Длинный ответ ниже состоит в том, что я даю много деталей, а не то, чтобы мне было труднее сделать это.
Шаг 1: Сбор пакетов
Восстановление всехпроекты в вашем репо на компьютере, подключенном к Интернету.Если у вас есть проекты, использующие packages.config
, их пакеты уже собраны для вас в папке пакетов решений.Они также должны находиться в папке глобальных пакетов, но если вы очистите папку глобальных пакетов и восстановите, когда пакеты уже существуют в папке пакетов решений, они не будут загружены / извлечены в папку глобальных пакетов.Проекты, использующие PackageReference
, будут извлекать свои пакеты только в папку глобальных пакетов.
Итак, если вы восстановите все свои решения на компьютере, подключенном к внутренней сети, тогда папка глобальных пакетов, вероятно, будет содержать все пакеты.вам нужно, но технически вам может потребоваться также получить пакеты из папки пакетов решений.
Один из вариантов - просто скопировать все пакеты из вашей глобальной папки пакетов, но, вероятно, будут содержать пакеты, которые не требуются вашему решению.,Если вы хотите копировать только пакеты, используемые вашим решением, начните с копирования пакетов в папке пакетов решений, потому что на них определенно есть ссылки, иначе их не будет.Затем напишите программу, которая будет читать каждый файл PackageReference
проекта obj\project.assets.json
, поскольку он содержит полный граф зависимостей.Пусть ваш проект получит список пакетов NuGet из всех этих файлов, а затем у вас есть список пакетов, которые необходимо скопировать из папки глобальных пакетов.
Другой вариант - создать файл nuget.config
и * 1016.* укажите пользовательский globalPackagesFolder
перед выполнением восстановления.Если вы сделаете это, я также рекомендую вам добавить папку глобальных пакетов вашего профиля в качестве источника пакета , чтобы сделать восстановление намного быстрее.Пока ваша пользовательская глобальная папка пакетов пуста до запуска, она будет содержать только пакеты, используемые вашими решениями.
Шаг 2. Выберите, как вы хотите, чтобы ваш автономный компьютер получал пакеты
Технически вы можете просто скопировать папку пакетов решений с исходного компьютера на конечный компьютер и скопировать папки глобальных пакетов с исходного компьютера на конечный компьютер.Однако всегда существует вероятность того, что инструмент меняет поведение в разных версиях инструмента, поэтому я предпочитаю позволить инструментам управлять своими собственными данными.Одним из примеров является то, что папка глобальных пакетов содержит файл .nupkg.sha512
, а в последних версиях NuGet также файл .nupkg.metadata
, которого нет в папке пакетов решений.Из-за того, как работает NuGet, он не будет работать, если вы скопируете папку пакетов решений в глобальную папку пакетов.Это может измениться в будущем, но в то время, когда я пишу это, оно не будет работать.
Поэтому я рекомендую копировать только файлы .nupkg
, а на автономном компьютере создайте nuget.config
файл, в который добавляется папка, в которую вы копируете все .nupkg
как источник пакета .Этот nuget.config
файл не обязательно должен быть в вашем репо.Вы можете воспользоваться тем фактом, что NuGet накапливает конфигурацию в иерархическом порядке и создать этот nuget.config
в корне вашего автономного компьютера (или, если вы клонируете все репозитории в одном месте, вы можете поместить его туда), поскольку это требуется только дляавтономный компьютер.Пока ни один из ваших проектов не имеет nuget.config
, который очищает раздел packageSources
, все проекты в подпапке, где находится nuget.config
, будут автоматически использовать его в качестве источника пакета.
TL; DR
Самый простой способ (скажем, вы хотите написать его):
- На компьютере, подключенном к Интернету, создайте файл
nuget.config
(dotnet new nugetconfig
, хотя он создает ужасный nuget.config
, который очищает источники пакетов, и я не могу найти хороший способ удалить элемент <clear/>
XML) что - Устанавливает
globalPackagesFolder
в произвольный путь (nuget.exe config -set globalPackagesFolder=usedPackages -configfile nuget.config
), который в настоящее время пуст - Добавьте
packageSource
в папку глобальных пакетов вашего профиля пользователя (nuget.exe sources add -name globalPackagesFolder -Source %USERPROFILE%\.nuget\packages -configfile .\nuget.config
), для повышения производительности
- Восстановление всех проектов (
nuget.exe restore my.sln
) - Рекурсивный поиск в папке пользовательских глобальных пакетов и копирование только файлов
.nupkg
(Get-ChildItem .\globalPackagesFolder\ -Recurse -Filter *.nupkg | Copy-Item -Destination .\nupkgs\
)при использовании powershell) на устройство, которое вы будете использовать для переноса на автономный компьютер.Вы можете (должны?) Скопировать .nupkg
s в плоскую папку. - Скопируйте
.nupkg
s с устройства в папку, предназначенную для автономной подачи. - Если высоздал сценарий для выполнения вышеизложенного, и на этом этапе ваш сценарий может очистить себя, например, удалив файл
nuget.config
и папку пользовательских глобальных пакетов. - Создайте файл
nuget.config
на автономном компьютерекоторый добавляет вашу автономную папку каналов в качестве источника пакета (dotnet new nugetconfig
, удалите <clear/> and change the sample source in the file to the directory you copied the
nupkg`s).