銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

PowerShell Cmdlet のデバッグを楽にする、 OpenForPSCmdlet VS拡張

PowerShell Cmdlet のバイナリモジュールを作ったことがある方はわかるとおもうのですが、バイナリモジュールを実際にPowerShellで実行して動作を確認するためには、ビルドしたdllをImport-Moduleで読みこむ必要があります*1。さらに、一度 Import-Module すると、そのPowerShell ConsoleなりISEのプロセスが dll をファイルロックするため、一度 Consoleを閉じないと、リビルドできません*2

そのため、バイナリモジュールをデバッグするときは、ビルドする、PowerShell Console開く、Import-Moduleする、デバッグする。Console閉じる、という流れを繰り返す必要があります。これはめんどい!っていうのを前から思っていたのですが、ようやくVisual Studio拡張として作成しました。

作成したCmdletを継承した自分のクラスを開いたエディタを右クリックすると、「Open for PSCmdlet」というメニューが出るのでクリックします。

f:id:tanaka733:20150203010609p:plain

すると、そのクラスが含まれるプロジェクトをアクティブなビルド構成でビルドした後で、PowerShell Consoleを開き、プロジェクトのビルド成果物である dllをImport-Moduleしてくれます(Import-Moduleしたコマンドは表示されませんが、実際にImportされています)。こんな風に、デフォルトとは異なるアセンブリ名や出力先フォルダを指定していても、

f:id:tanaka733:20150203011012p:plain

f:id:tanaka733:20150203011015p:plain

この設定を読み取って、dll を Importしてくれます。

f:id:tanaka733:20150203011143p:plain

現在リリースしている最新のバージョンはこの機能だけになります。

コードはGitHubで公開しているので、バグ報告や機能要望もこちらにお願いします。

処理は、OpenForPSCmdletPackage.cs で完結しているのでここを読んでもらえると、Visual Studio拡張の中でビルドする方法や、csproj の設定を読む方法などがわかると思います。

*1:所定のフォルダに配置すればImport-Moduleは必要ないですが、開発中はプロジェクトディレクトリのbin以下に出力することが多いでしょう

*2:閉じずにリビルドやクリーンすると、dllを削除できないためエラーになる