Publish-ModuleでPowerShellGalleryに公開出来ない問題について

## 環境
- OS : Windows11
- Tarminal : PowerShell 7.5.1
- Module : [QuickAccess for PowerShell](https://www.powershellgallery.com/packages/QuickAccess)
## ターミナル限定
自作のPowerShellモジュールをPowerShellGalleryに公開する場合、ブラウザのインターフェースからGalleryにアップロードする仕組みは用意されていないため、ターミナルでPublish-Moduleコマンドを使用することになる。(2025/6時点)

## .psd1生成 - AIは嘘をつく。
.psd1をAIに生成させると間違ったフォーマットで生成される。以下コマンドで正しいフォーマットテンプレートを生成、それを元に編集する。
```
New-ModuleManifest -Path QuickAccess.psd1 -ModuleVersion "1.0.0" -Author "June-10-cloudy" -RootModule "quick_access.psm1" -Description "Your module description"
```

## Publish-Module 失敗 error NU1101
通常、これでアップロードできる。APIキーはPowerShellGalleryから入手。
```
Publish-Module -Path . -NuGetApiKey "ここにコピーしたAPIキーを貼り付け" -Verbose
```
ここで、error NU1101: が発生。
```
Write-Error: Failed to generate the compressed file for module 'C:\Program Files\dotnet\dotnet.exe failed to pack: error
蠕ｩ蜈・ｯｾ雎｡縺ｮ繝励Ο繧ｸ繧ｧ繧ｯ繝医ｒ豎ｺ螳壹＠縺ｦ縺・∪縺・.. C:\Users\user1\AppData\Local\Temp\c1075e8d-48fe-4c7d-8fea-410b8eddc108\Temp.csproj
: error NU1101: 繝代ャ繧ｱ繝ｼ繧ｸ Microsoft.NETCore.App 縺瑚ｦ九▽縺九ｊ縺ｾ縺帙ｓ縲ゅた繝ｼ繧ｹ Microsoft Visual Studio Offline Packages 縺ｫ縺ｯ縺√％縺ｮ
ID 縺ｮ繝代ャ繧ｱ繝ｼ繧ｸ縺悟ｭ伜惠縺励∪縺帙ｓ縲・   C:\Users\username\AppData\Local\Temp\c1075e8d-48fe-4c7d-8fea-410b8eddc108\Temp.csproj
繧貞ｾｩ蜈・〒縺阪∪縺帙ｓ縺ｧ縺励◆ (103 繝溘Μ遘・縲・  '.
```

## Microsoft.NETCore.App ?
.NETのバージョンが古いかもしれないというAIの指摘。
ここで.NET SDKの最新版(.NET 9.0)をインストール。
(https://dotnet.microsoft.com/download/dotnet)
理由は分からないが、一度だけ文字化け無しで同一エラーが出たので掲載する。
```
Write-Error: Failed to generate the compressed file for module 'C:\Program Files\dotnet\dotnet.exe failed to pack: error
復元対象のプロジェクトを決定しています... C:\Users\username\AppData\Local\Temp\b637dadd-1c14-4b06-8913-ce2d5064a30a\Temp.csproj : error
NU1101: パッケージ Microsoft.NETCore.App が見つかりません。ソース Microsoft Visual Studio Offline Packages には、この ID のパッケージが存在しません。
C:\Users\username\AppData\Local\Temp\b637dadd-1c14-4b06-8913-ce2d5064a30a\Temp.csproj を復元できませんでした (95 ミリ秒)。 
```
AIの分析。

>エラーメッセージが明確に「ソース Microsoft Visual Studio Offline Packages には、この ID のパッケージが存在しません」と述べています。これは、dotnet pack コマンドがパッケージを探しに行く際に、Visual Studio のオフラインパッケージソースを優先して参照してしまい、そこに必要な Microsoft.NETCore.App が見つからない、という状況です。

Visual Studioが関係しているようなので、Visual Studio 2022をアンインストール。
状況変わらず。


## error NU1100:
何がきっかけかは分からないが、エラー表示がNU1100に変化した。
Windowsのディスククリーンアップ後だったような気がする。
```
Files\dotnet\dotnet.exe with exit code 1
Write-Error: Failed to generate the compressed file for module 'C:\Program Files\dotnet\dotnet.exe failed to pack: error
蠕ｩ蜈・ｯｾ雎｡縺ｮ繝励Ο繧ｸ繧ｧ繧ｯ繝医ｒ豎ｺ螳壹＠縺ｦ縺・∪縺・.. C:\Users\username\AppData\Local\Temp\a812d993-d31f-45c9-8c42-d2359cc1f3a3\Temp.csproj
: error NU1100: '.NETCoreApp,Version=v2.0' 縺ｫ蟇ｾ縺吶ｋ 'Microsoft.NETCore.App (>= 2.0.0)' 繧定ｧ｣豎ｺ縺ｧ縺阪∪縺帙ｓ縲・
C:\Users\user1\AppData\Local\Temp\a812d993-d31f-45c9-8c42-d2359cc1f3a3\Temp.csproj 繧貞ｾｩ蜈・〒縺阪∪縺帙ｓ縺ｧ縺励◆ (89 繝溘Μ遘・縲・  '.
```
AIはPowerSellGetを最新にすることを提案したが、既に最新(2.2.5)。
再インストールも提案。だが、PowerShell 7.5.1にPowerShellGetは組み込みで入っており、管理者権限でもアンインストールできない。

PowerShell 5.1でも環境を一致させて試したが同様のエラーメッセージで停止。硬直状態。

## NuGet ?

AIとの質疑のやりとりで、以下の回答。

>はい、Publish-Module コマンドレットの実行には、通常 NuGet プロバイダー と nuget.exe が必要です。

>Publish-Module と NuGet: Publish-Module コマンドレットは、PowerShell モジュールをオンラインのNuGetベースのギャラリー（PowerShell Galleryなど）に公開するために使用されます。このプロセスでは、モジュールがNuGetパッケージ（.nupkgファイル）として作成され、指定されたリポジトリにアップロードされます。

>PowerShellGet と NuGet プロバイダー: Publish-Module は PowerShellGet モジュールの一部です。PowerShellGet は、モジュールの取得、インストール、公開など、PowerShell Galleryとのやり取りを管理するモジュールです。PowerShellGet は、これらの操作のためにNuGetプロバイダーを使用します。

Publish-Moduleは、内部でNugetを使ってModuleをパッケージ化(.nupkg)するラッパー。ラッパーが余計な仕事をしている可能性あり。

## NuGet単体をインストール 

nuget.exeをダウンロードし、手動でインストールしようとしたが、上手くいかず、ChocolateyでNugetをインストール
```
choco install nuget.commandline
```
再度、Publish-Moduleを実行したが、以下のさっきと違うエラー。
```
Write-Error: Failed to generate the compressed file for module 'Cannot index into a null array.'.
```
硬直状態が、ようやく動いた。NuGetがインストールされてなかったから、Microsoft.NETCore.Appを代替えとして使おうとしていたのだろうか？　謎。

## 'Cannot index into a null array.'

英語圏以外の地域からPowerShell-Galleryにアップロードした場合、このエラーが出るというブログ、Githubの投稿を発見。対処方法は、環境変数設定を英語にするというものだが、今回のケースには当てはまらず。
(https://www.neko3cs.net/entry/publishing-ps-module-error-null-array)
(https://github.com/PowerShell/PowerShellGetv2/issues/606)
```
$env:DOTNET_CLI_LANGUAGE="en_US"
$env:DOTNET_CLI_UI_LANGUAGE="en_US"
```
再び硬直状態。

## さよなら。Publish-Module
>nugetを使ってPowerShellGalleryにアップロードできますか？

>はい、Publish-Module コマンドレットを使用せずに、nuget.exe を直接使って PowerShell Gallery にモジュールをアップロードすることは可能です。

ただし、この方法は、.nuspecファイルを手動で作成しなければならない。
リファレンスとスキーマは公式から。

(https://learn.microsoft.com/ja-jp/nuget/reference/nuspec)

AIにスキーマを読み込ませ、シンプルなテンプレートファイルを生成。あとは手動で編集。
以下はAIが生成したテンプレート。(変わる可能性があるから、あくまで本家情報を参照すること)
```
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
  <metadata>
    <id>QuickAccess</id>
        <version>0.0.1</version> <authors>Your Name</authors> <description>A PowerShell module for quick file system navigation.</description> <tags>PowerShell Module Navigation</tags> <projectUrl>https://github.com/yourusername/QuickAccess</projectUrl> <license type="expression">MIT</license> <licenseUrl>https://github.com/yourusername/QuickAccess/blob/main/LICENSE</licenseUrl> <requireLicenseAcceptance>true</requireLicenseAcceptance> <releaseNotes>Initial release.</releaseNotes> </metadata>
      <files>
        <file src="QuickAccess.psd1" target="" />
        <file src="QuickAccess.psm1" target="" />
        
        <file src="src\**\*" target="src\" /> 
    
        <file src="README.md" target="" />
        <file src="LICENSE" target="" />
      </files>
</package>
```
## パッケージ生成
nuget packでパッケージ生成に成功する。まだ、powershellGalleryにアップロードされたわけではない。
```
C:\Users\username\Documents\PowerShell\Modules\QuickAccess> nuget pack QuickAccess.nuspec -OutputDirectory . -NoDefaultExcludes
'QuickAccess.nuspec' からパッケージをビルドしようとしています。
パッケージ '.\QuickAccess.1.0.0.nupkg' が正常に作成されました。
```
確かに、モジュールのルートフォルダに .nupkgファイルが生成されている。拡張子を.zipに変更すると中身を確認できる。

## PowerShellGalleryにアップロード

nuget pushコマンドで、PowerShellGalleryにアップロード成功！
```
C:\Users\username\Documents\PowerShell\Modules\QuickAccess> nuget push QuickAccess.1.0.0.nupkg -Source https://www.powershellgallery.com/api/v2/package -ApiKey xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Pushing QuickAccess.1.0.0.nupkg to 'https://www.powershellgallery.com/api/v2/package'...
PUT https://www.powershellgallery.com/api/v2/package/
Created https://www.powershellgallery.com/api/v2/package/ 1873ms
Your package was pushed.
```
実際は、.nuspecファイルが正しく記載されてなかったことによる警告とエラーが頻発しており、一つ、一つ原因を潰しながらのアップロード。とにかく本家情報に忠実に従うことが問題解決の近道だと学んだ。

## QuickAccess for PowerShell について
ファイルエクスプローラーのクイックアクセス、お気に入り機能をPowerShell環境で再現！
PowerShellGallery(https://www.powershellgallery.com/packages/QuickAccess/)
github.comリポジトリ(https://github.com/June-10-cloudy/QuickAccess)