LoginSignup
4

More than 3 years have passed since last update.

posted at

updated at

Organization

PowerShell でも名前空間を作りたい

本記事は PowerShell Advent Calendar 2019 の 12 日目です。

はじめに

C# では namespace キーワードで名前空間を定義することができますが、
PowerShell ではそういった構文が提供されておらず、全ての変数、関数などの要素は
いわゆるグローバル名前空間に定義されています。

規模が小さいスクリプト群なら特に問題ないですが、
規模が大きくなると名前の衝突がしやすくなり、命名が面倒になってきます。

例えば、 Scoop の scoop-install.ps1 - Scoop - GitHub の箇所では、
他のファイルで定義された関数をドットソースで読み込んでいますが、
読み込んでいるスクリプトファイル間で同じ関数名を定義してしまうと、
意図しない関数を使ってバグが起きる危険性が潜んでいます。

PowerShell Module の Prefix で疑似的に名前空間を作る

名前空間単位にモジュール化させ、それぞれのモジュールに Prefix を指定することで、
名前空間の宣言と似たようなことができます。

図でいうと以下です。

ps_module_prefix.png

Import-Module-Prefix に MyModule を指定することで、
Get-Something の名詞部分に接頭辞が付き、 Get-MyModuleSomething で呼び出すことができるようになります。

また、PowerShell モジュールマニフェストファイルで
DefaultCommandPrefix を指定することでも同じように Prefix を指定することができます。

この記事での説明はここまでですが、 DockerCompletion でそういう実装がされているので、参考にしてみてください。

おわりに

クラス構文だとこういうのできないので、どうすればよいものか。
C#書いて、 Add-Type するしかないのかな。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
4