Ответ 1
Полезный ответ crownedjitter является хорошей отправной точкой, и сам Тревис предоставил дополнительные ссылки в комментариях, но позвольте мне подвести итог, начиная с Windows PowerShell v5.1:
-
Как уже говорилось, PowerShell v5+, включая PowerShell Core, поставляется с модулем
PackageManagementкоторый представляет собой менеджер метапакетов, обеспечивающий доступ к нескольким хранилищам через провайдеров; установка этого модуля по требованию возможна в версиях 3 и 4 (эта загрузка помечена как "Предварительный просмотр за март 2016 года", и это самая последняя версия, которую я смог найти).-
Find-PackageProviderперечисляет всех доступных провайдеров. -
Get-PackageProviderперечисляет установленные.
-
-
Это
nugetпоставщик, который позволяет устанавливать пакеты NuGet черезInstall-Package, и есть два возможных препятствия:-
Возможно, поставщик
nugetне установлен. -
Он может быть установлен с неверным URL-адресом API, который не позволяет
Find-Packageвозвращать результаты.
-
Проверьте, установлен ли поставщик nuget:
# If this fails, the provider isn't installed
Get-PackageProvider nuget
Если он установлен: убедитесь, что исходный URI пакета верен:
- Откройте сеанс PowerShell с повышенными правами.
- Запустите
Get-PackageSource:- Если вы найдете источник
Nugettest, удалите его:-
Unregister-PackageSource Nugettest
-
- Если в столбце "
Locationдля источникаnuget.orgотображаетсяhttps://api.nuget.org/v3/index.json(или что-то другое, кромеttps://www.nuget.org/api/v2), обновите его:-
Set-PackageSource nuget.org -NewLocation https://www.nuget.org/api/v2 -Trusted - Предостережение. Это может нарушить возможность просмотра пакетов NuGet в Visual Studio: см. Https://github.com/PowerShell/PowerShellGet/issues/107.
-
- Если вы найдете источник
Если он не установлен: установите провайдера с нуля:
- Откройте сеанс PowerShell с повышенными правами.
-
Запустите следующие команды:
Install-PackageProvider nuget Register-PackageSource -ProviderName nuget -name nuget.org -Location https://www.nuget.org/api/v2 -Trusted
После выполнения описанных выше шагов, обнаружение (например, Find-Package Dapper) и установка (например, Install-Package Dapper) пакетов NuGet должны завершиться успешно.
По умолчанию Install-Package устанавливается в области AllUsers, что требует повышения AllUsers, но вы можете отказаться от установки в контексте текущего пользователя только с -Scope CurrentUser.
Используя загруженный пакет NuGet:
Примечание. Посмотрите это предложение на GitHub, чтобы упростить использование пакетов NuGet в PowerShell, расширив Add-Type, что устранит необходимость во всех последующих шагах, которые по-прежнему необходимы в PowerShell Core 6.2.0.
-
Как показано в этом вопросе, вам необходимо вручную загрузить сборки пакетов в сеанс PowerShell с помощью
Add-Type -Path <assembly-file-Path>; однако в эпоху .NET Core пакеты могут иметь библиотеки DLL для разных сред .NET, поэтому вы не всегда можете вслепую загружать все файлы*.dllв папку пакета: -
Чтобы
.Sourceместоположение файловой системы загруженного пакета, запросите свойство.Sourceсоответствующего объекта, возвращаемогоGet-Package:(Get-Package Dapper).Source -
Чтобы увидеть полные пути всех библиотек DLL внутри пакета, выполните следующее:
(Get-ChildItem -Filter *.dll -Recurse (Split-Path (Get-Package Dapper).Source)).FullName -
Просмотр полных путей к DLL должен сказать вам, какие DLL лучше всего загрузить для вашей среды; на примере пакета
Dapper:C:\Program Files\PackageManagement\NuGet\Packages\Dapper.1.50.4\lib\net451\Dapper.dll C:\Program Files\PackageManagement\NuGet\Packages\Dapper.1.50.4\lib\netstandard1.3\Dapper.dll C:\Program Files\PackageManagement\NuGet\Packages\Dapper.1.50.4\lib\netstandard2.0\Dapper.dll -
Однако, учитывая, что библиотеки .NET Standard работают на всех платформах .NET, вы можете программно искать (самые последние) такие библиотеки DLL и загружать их:
(Get-Item (Join-Path (Split-Path (Get-Package Dapper).Source) lib/netstandard*) | Sort-Object { [version] ($_.Name -replace '^netstandard') })[-1] | Get-ChildItem -Filter *.dll -Recurse | ForEach-Object { Add-Type -LiteralPath $_.FullName }-
Вышесказанное ищет библиотеки DLL стандартной версии .NET; если вы хотите указать конкретную версию, команда станет проще; например, для .NET Standard
2.0:Get-ChildItem -Recurse -Filter *.dll -LiteralPath (Join-Path (Split-Path (Get-Package Dapper).Source) lib/netstandard2.0) | ForEach-Object { Add-Type -LiteralPath $_.FullName }
-
Бэкон отмечает, что вышеприведенного недостаточно, если у пакета есть зависимости, которые также должны быть загружены:
Единственный (не очень тривиальный) шаг, который отсутствует, - это загрузка любых зависимостей, которые также могли быть установлены. Поскольку свойство Dependencies не содержит достаточной информации, кажется, что это потребует извлечения файла
.nuspecиз файла.nupkgв каталоге Source, чтения<group>для соответствующей платформы и загрузки сборок этих пакетов.

