しばたテックブログ

PowerShellを中心に気分で書いている技術ブログです。

PowerShell 6.0をデバッグ実行する

PowerShell Advent Calendar 2017、11日目です。

qiita.com

PowerShell 6.0のGAリリースも間近となりビルド・デバッグ手順も固まってきたと思えたので本エントリを書きます。

はじめに

PowerShellがオープンソース化した時点でPowerShellのビルドはVisual Studio 2015で行われており、ソリューションの構成で、

  • .NET Frameworkで動作するWindows PowerShell
  • NET Coreで動作するPowerShell Core

をそれぞれ個別にビルドできる様になっていました。

その後PowerShell 6.0がPowerShell Coreのみをリリースする方針となってからは、Windows PowerShell専用の処理を削除しつつ、Visual Studio 2017とVisual Studio Codeでビルド・デバッグができる様に変更されています。
(ただ、Visual Studio 2017でのビルドについては現在も目下修正中の様で手元の環境ではうまくいきませんでした。)

細かい話はGitHub上の、

PowerShell/docs/building at master · PowerShell/PowerShell · GitHub

PowerShell/docs/debugging at master · PowerShell/PowerShell · GitHub

のドキュメントに記載されていますので興味があればご覧ください。

PowerShellをデバッグ実行する

本エントリではWindows環境、64bit Windows 10(1709)でVisual Studio Codeを使用した場合の手順を紹介します。
他のOSについては先述のGihHubのドキュメントに手順がありますのでそちらをご覧ください。

1. Gitのインストール

ソースコードをCloneするのにGitクライアントが必要です。
適当にインストールしてgitコマンドが使える様にしておいてください。

git-for-windows.github.io

2. Visual Studio Codeのインストール

Visual Studio Codeを適当にインストールしてください。

code.visualstudio.com

今回は64bit版のVer.1.18.1をインストールします。
また、以下の拡張が必要になるのでインストールしておいてください。

  • C#拡張 (現時点のバージョンは1.13.1)
  • PowerShell拡張 (現時点のバージョンは1.5.1)

f:id:stknohg:20171206162748p:plain

f:id:stknohg:20171206162759p:plain

3. ソースコードのClone

PowerShellのリポジトリよりソースコードをCloneします。

ソースコードを修正したい、Pull Requestを送りたいといった場合であればForkしてからのCloneとなるでしょうが、今回はとりあえずデバッグ実行できれば良いのでリポジトリを直接Cloneします。

任意のディレクトリで以下の様に--recursiveオプションを付けてgit cloneしてください。

git clone --recursive https://github.com/PowerShell/PowerShell.git

実行後PowerShellディレクトリが作成されソースコードがCloneされているはずです。

4. その他必要ツールのインストール

PowerShellをビルド・デバッグ実行するには上記の他に

が必要となります。

これらのツールを個別にインストールしても構わないのですが、PowerShellのソースコードにはビルトのための専用モジュールがあり、このモジュールの機能を利用することで必要なツールをまとめてインストールすることができます。

ソースコードのルートディレクトリにbuild.psm1というモジュールがあるので、これをインポートしStart-PSBootstrap関数を実行すると必要なツールをまとめてインストールしてくれます。

# cd [PowerShellのルートディレクトリ]
cd .\PowerShell\
Import-Module .\build.psm1
Start-PSBootstrap

f:id:stknohg:20171209195521p:plain

このStart-PSBootstrapでは$env:LOCALAPPDATA\Microsoft\配下のフォルダに必要なツールをインストールします。
現時点では、

  • .NET Core SDK : Ver.2.0.2
  • PowerShell 6.0 : Ver.6.0.0-rc
  • RCEdit : Ver.0.2.0

がインストールされます。
(今後インストールされるバージョンは上がっていくでしょう)

ここで、仕様なのかバグなのか不明なのですが、.NET Core SDKをインストールした後にdonetコマンドのパス($env:LOCALAPPDATA\Microsoft\dotnet)がPATH環境変数に永続して登録されませんでした。
このため、手動でPATHに登録するかビルド・デバッグ実行の都度PATHに追加しておく必要があります。

5. ビルドとデバッグ実行

最後にVisual Studio Codeを起動し、PowerShellをデバッグ実行してみます。

# dotnetコマンドのPATHを通してからVisual Studio Codeを実行
$env:PATH += ";$env:LOCALAPPDATA\Microsoft\dotnet"
code

PowerShellにはC++のソースも一部含まれているため、初回起動時に以下の様なダイアログが出ますが放置して大丈夫です。

f:id:stknohg:20171206162852p:plain

ここでデバッグの構成をみると、下図の様に、

  • .NET Core Launch
  • .NET Core Attach

が登録されており、.NET Core Launchを実行すればPowerShellのビルトとデバッグ実行が可能です。
F5キー実行でも構いません。

f:id:stknohg:20171206162911p:plain

最初のビルドにはしばらく時間がかかりますので焦らず待ちます。
ビルドエラーが出る様であれば適宜対処してください。

f:id:stknohg:20171206162944p:plain

最終的には下図の様にPowerShellをデバッグ実行することができます。

f:id:stknohg:20171206163006p:plain

【補足】PowerShellをビルドする

PowerShellをビルドするだけであればVisual Studio Codeが無くても先述のbuild.psm1モジュールを使い、Start-PSBuildコマンドで可能です。

# Start-PSBuildのパラメーターはこの例の他にもいろいろあります
Import-Module .\build.psm1
Start-PSBuild -Configuration Release

最後に

とりあえずこんな感じです。
PowerShellをデバッグ実行することでソースの修正はもちろんですが、怪しいと思った挙動の詳細を細かく追うことも可能になります。

みなさんも是非トライしてみてください。