Иногда в сценариях PowerShell мне нужен доступ к определенной DLL, используя Add-Type -AssemblyName
. Однако DLL, которые мне нужны, не всегда находятся на машине или в GAC. Например, мне может понадобиться быстрый скрипт, который использует Dapper для запроса базы данных. В этих случаях я буквально копировал библиотеки DLL вместе с файлом ps1
. Мне было интересно, было ли это общепринято/хорошая идея и было ли существующее расширение, которое будет загружать пакеты NuGet, хранить их в глобальной или локальной папке и автоматически вызывать Add-Type -AssemblyName
.
Это было бы очень похоже на использование npm
или pip
в Node.js или Python, соответственно.
Обновить
Я провел несколько исследований и ничего не добавил в более старые версии PowerShell. Я сделал некоторый прогресс, пытаясь написать его с нуля, используя nuget.exe
&"$(Get-Location)/nuget.exe" install $packageName -Version $version -OutputDirectory "$(Get-Location)/packages" -NoCache -NoInteractive
Это загрузит данный пакет/версию в папку "пакеты" в текущей папке вместе с любой из ее зависимостей. Тем не менее, похоже, что он загружает каждую версию фреймворка без очевидного способа узнать, какой из них использовать для данной среды.
В противном случае вы можете просто просмотреть результаты и вызвать Add-Type:
Get-ChildItem .\packages\ -Recurse -Filter "*.dll" | % {
try
{
Add-Type -Path $_.FullName
}
catch [System.Exception]
{
}
}
Я попытался использовать команду restore
используя файл project.json
чтобы проверить, могу ли я управлять версией фреймворка без везения. Это слишком тяжело для меня.
Я рассмотрю предложение @crownedjitter об использовании PowerShell 5.
Обновить
Используя предложение @crownedjitter, я смог в конечном итоге зарегистрировать модуль PackageManagement с NuGet (см. Комментарии ниже). Следуя команде, я смог воспроизвести то, что Nuget.exe
команда Nuget.exe
выше:
Install-Package Dapper -Destination packages
Очевидно, это намного короче. Проблема в том, что она имеет такое же ограничение; он сбрасывает каждую версию пакета. Если это включает в себя ядро .NET, оно сбивает с собой значительную часть основной среды.NET! Кажется, что не существует способа указать целевую структуру (например,.NET 4.5.1 или ниже).
Мне интересно, есть ли способ определить, какие пакеты пакетов NuGet загружать библиотеки DLL на основе PowerShell текущего поля $PSVersionTable.CLRVersion
.