本記事は PowerShell Advent Calendar 2019 の 12 日目です。
はじめに
C# では namespace
キーワードで名前空間を定義することができますが、
PowerShell ではそういった構文が提供されておらず、全ての変数、関数などの要素は
いわゆるグローバル名前空間に定義されています。
規模が小さいスクリプト群なら特に問題ないですが、
規模が大きくなると名前の衝突がしやすくなり、命名が面倒になってきます。
例えば、 Scoop の scoop-install.ps1 - Scoop - GitHub の箇所では、
他のファイルで定義された関数をドットソースで読み込んでいますが、
読み込んでいるスクリプトファイル間で同じ関数名を定義してしまうと、
意図しない関数を使ってバグが起きる危険性が潜んでいます。
PowerShell Module の Prefix で疑似的に名前空間を作る
名前空間単位にモジュール化させ、それぞれのモジュールに Prefix を指定することで、
名前空間の宣言と似たようなことができます。
図でいうと以下です。
Import-Module
の -Prefix
に MyModule を指定することで、
Get-Something
の名詞部分に接頭辞が付き、 Get-MyModuleSomething
で呼び出すことができるようになります。
また、PowerShell モジュールマニフェストファイルで
DefaultCommandPrefix
を指定することでも同じように Prefix を指定することができます。
この記事での説明はここまでですが、 DockerCompletion でそういう実装がされているので、参考にしてみてください。
おわりに
クラス構文だとこういうのできないので、どうすればよいものか。
C#書いて、 Add-Type
するしかないのかな。