Ответ 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>
для соответствующей платформы и загрузки сборок этих пакетов.