Как опубликовать .nupkg в галерее Powershell?

Решение

Кредит mklement0

Вот что я сделал, чтобы опубликовать свой модуль bin\MyModule.0.1.0.nupkg в PSGallery:

  1. Переименовать bin\MyModule.0.1.0.nupkg в bin\MyModule.0.1.0.zip
  2. Извлеките bin\MyModule.0.1.0.zip в bin\MyModule\ (имя извлеченной папки должно совпадать с именем файла .psd1 внутри, поэтому в моем случае теперь был файл bin\MyModule\MyModule.psd1).
  3. Удалите файл [Content_Types].xml из извлеченной папки (неудаление этого вызывает ошибку при попытке загрузить и установить модуль из PSGallery, по-видимому, из-за того, что 2 копии этого файла присутствуют в полученном .nupkg).

Затем я смог запустить эту команду:

PS> Publish-Module -NuGetApiKey xxx -Path .\bin\MyModule

И это сработало! Мой модуль теперь опубликован в PSGallery.

Исходное сообщение

У меня есть модуль Powershell, созданный и упакованный в виде файла .nupkg с помощью Autorest.Powershell. Теперь я хочу опубликовать свой модуль в галерее Powershell, но не могу понять, как его Работа. Я пытался:

PS> Publish-Module -NuGetApiKey xxx -Path .\bin\MyModule.0.1.0.nupkg
Publish-Module: The specified path '.\bin\MyModule.0.1.0.nupkg' is not a valid directory.

PS> Publish-Module -NuGetApiKey xxx -Path .\bin\
Publish-Module: The specified module with path '.\bin' was not published because no valid module was found with that path.

PS> Publish-Module -NuGetApiKey xxx -Name .\bin\MyModule.0.1.0.nupkg
Get-Module: C:\Users\bport\Documents\PowerShell\Modules\PowerShellGet\2.2.5\PSModule.psm1:10630
 Line |
10630 |  …   $module = Microsoft.PowerShell.Core\Get-Module -ListAvailable -Name …
      |                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      | The specified module 'D:\workarea\bin\MyModule.0.1.0.nupkg'
      | was not found. Update the Name parameter to point to a valid path, and then try again.

Publish-Module: The specified module '.\bin\MyModule.0.1.0.nupkg' was not published because no module with that name was found in any module directory.

PS> dotnet nuget push .\bin\MyModule.0.1.0.nupkg --api-key xxx --source https://www.powershellgallery.com/api/v2
Pushing MyModule.0.1.0.nupkg to 'https://www.powershellgallery.com/api/v2'...
  PUT https://www.powershellgallery.com/api/v2/
  MethodNotAllowed https://www.powershellgallery.com/api/v2/ 580ms
error: Response status code does not indicate success: 405 (Method Not Allowed).

Публикация файлов .nupkg в галерее Powershell должна быть возможной, поскольку вы можете загружать пакеты из галереи Powershell в виде файлов .nupkg. Кроме того, в документации Autorest говорится: ">это о сгенерированных файлах nupkg:

Структура .nupkg создана таким образом, что ее можно загрузить как часть PSRepository. Кроме того, этот пакет находится в формате для распространения в PSGallery.

Я предполагаю, что это возможно, но я просто не могу понять, как это сделать. Любая помощь будет оценена


person Brian    schedule 17.02.2021    source источник
comment
Я считаю, что способ, которым вы пытаетесь сделать это с помощью Publish-Module, требует, чтобы модуль НЕ был упакован. Он сделает упаковку за вас.   -  person Daniel    schedule 18.02.2021


Ответы (1)


Начиная с версии 2.2.5 модуля PowerShellGet — того, который поставляется с предварительными версиями PowerShell 7.2 — Publish-Module для публикации модулей PowerShell в галерее PowerShell не поддерживает загрузку .nupkg файлов.

Вместо этого требуется (несжатый) каталог, содержащий модуль PowerShell для публикации[1], который затем сжимается в (временный ) Пакет NuGet (.nupkg архив) за кадром и выложен в галерею.

Я не знаком с AutoRest.PowerShell, но если он утверждает, что создаваемые им .nupkg архивы совместимы с галереей PowerShell, вы можете попытаться распаковать (распаковать) такой архив (файлы NuGet представляют собой ZIP-архивы , поэтому вы можете передать их Expand-Archive) в каталог и попытайтесь передать путь к этому каталогу параметру -Path Publish-Module (выберите каталог, содержащий файл манифеста модуля (.psd1), который может быть вложенной папкой).


[1] Если модуль для публикации находится в одном из каталогов, перечисленных в $env:PSModulePath, его местоположение можно определить по имени модуля, переданному в параметр -Name.

person mklement0    schedule 18.02.2021