Создать чистый модуль PowerShell Nuget для PowerShellGet
Что я хочу
Я хочу опубликовать ряд скриптов PowerShell в виде пакета Nuget для использования в системах сборки.
Я хочу использовать PowerShellGet для выполнения установки и управления версиями.
Я не хочу, чтобы эти сценарии были частью какого-либо решения Visual Studio, а как отдельные сценарии.
Сценарий использования
В любой системе с настроенным провайдером Nuget пользователь выполняет:
Install-Module MyModule
С этого момента все экспорты из этого модуля постоянно доступны для этого пользователя. Также пользователь может вызвать эту команду еще раз, чтобы обновить версию этих скриптов.
Что я сделал
Вы можете найти текущее состояние пакета здесь: GitHub
Я добавил и настроил провайдера Nuget на наш локальный сервер Nuget
Для этого звоните
Get-PackageProvider -Name NuGet -ForceBootstrap
а такжеSet-PSRepository -Name My_Nuget_Repo -SourceLocation http://my-nuget/api -InstallationPolicy Trusted
- Создан соответствующий модуль, который можно импортировать локально
Import-Module
- Создан и опубликован пакет Nuget с этим модулем
проблема
Я могу установить этот пакет Install-Module
Командлет и я вижу это позже в Get-InstalledModule
список.
Но никакие функции не доступны.
Кроме того, несмотря ни на что, но Install-Module
не вызывает ни один из скриптов из моего пакета:
- Не звонит
ScriptsToProcess
отMyModule.psd1
- Не звонит
Install.ps1
отtools
папка - Не звонит
Init.ps1
отtools
папка - Командлеты, экспортированные модулем, недоступны, и модуль не может быть импортирован
Import-Module
(Тот же пакет работает правильно при установке из Visual Studios Install-Package MyModule
, скрипты вызываются, модуль PowerShell импортируется).
изучение
поскольку PowerShellGet
основывается на OneGet
кажется, что проблема в Install-Package
командлет (который вызывается внутри Install-Module
Командлет).
Когда я выполняю Install-Package MyModule
из Visual Studio Install.ps1
а также Init.ps1
называются. Но та же команда из чистого PowerShell ничего не делала.
1 ответ
После долгого обратного инжиниринга я нашел причину
Техническая причина
Волшебный тег PSModule
должен быть добавлен к <Tags>
в файле nuspec.
Реальная причина
Вы не должны создавать файл nuspec и упаковывать пакет nuget вручную. использование Publish-Module
командлет вместо.
Как сделать это правильно
Я обновил модуль powershellget-GitHub с помощью:
- Пример минимального модуля, который можно опубликовать
- Способ использования локальной папки в качестве канала Nuget
- Публикация, установка и использование этого модуля
- Справочный скрипт без зависимостей, который все делает локально, так что вы можете изучить его
Проверьте это.