2026-03-15

PowerShell Local Resource Manager Part 2

krymtkts/pslrm の開発をした。

Invoke-Build のような task runner 経由であればそういうことができるようにした。 この対応、個人的にかなり難しく GitHub Copilot の導く方向もちょいちょい間違ってたので、要所要所手作りの温もりで調整したつもり。

このへんのコミットがそうなんだが、入れ子で呼び出される場合に Host の取り扱いが良くなかったみたい。 Write-Host が実行されたら null reference で落ちてしまってた。 GitHub Copilot は独自 Host 実装を作ればいいと言ってたが、んなあほな...ということで階層が深い場合は一番上の Host が使われるように調整して、いけるようになった。

GitHub Actions 上に CI も整備して cross platform のテストを回してみた。 Windows & PowerShell は問題なし。 Windows PowerShell の方は互換性を維持して置き換えたら動くようになった。 Ubuntu & PowerShell の方は成功するけどたまに Host 周りが失敗してるから、 flaky ぽい。 local で nektos/act で動かした限りは Ubuntu でも問題なく動いてそうなんやが。 macOS はまだ成功してるところを見たことないが、どうだろう。 このテストは GitHub Copilot サンに書いてもらってるので理解浅いから、後追いで理解していかんと。 特に、今回は背視したような入れ子の Host 問題みたいなケースで本質を追うのは GitHub Copilot サンには難しいから、自力でしか解決できんしな。

まだ結構イマイチな箇所が多いけど、 pslrm の開発で使うレベルでは徐々に Pester, PSScriptAnalyzer, Invoke-Build の実行はできるようになった。

例えば Pester v6 のように独自提供の型を使って設定を組み上げるようなケースは、煩雑だが以下のようにできる。

Invoke-PSLResource Invoke-Pester -Arguments @('-Configuration', (Invoke-PSLResource New-PesterConfiguration))

PSResourceGet しか入ってない Windows PowerShell でも動いてるので多分うまくいってるんじゃないかな。 さらにいいところは以下。

pslrm/.github/actions/restore-and-test/action.yml at 0eb5c4d62508c80f6704feb404e69c61d56cc508 · krymtkts/pslrm

- name: Restore modules from PSGallery
shell: ${{ inputs.shell }}
run: |
Set-PSResourceRepository PSGallery -Trusted
Import-Module ./pslrm.psd1 -Force
Restore-PSLResource

こんな風に依存関係の restore が Restore-PSLResource 一発で済んで simple になってるのでとてもいいなと思ってる。 もうちょっといい感じになったら PowerShell Gallery へ publish しよう。