Powershell Coreをビルドしてデバッグする。
前置き
最近Powershellを使うことが多かったのですが、なかなか使いこなすのが難しいので、内部仕様を見て理解を深めようと思ったのでやってみます。
※Powershell CoreはWindows Powershellコードベースにフォークされたプロジェクトです。
ビルドはwindows-core.mdにそってやります。
環境
Windows 10 (1909)
Visual Studio Community 2019 (16.7.2)
ビルド
■visual studioの設定
[ツール] -> [ツールと機能を取得] -> [ワークロード]
[.NET デスクトップ開発]と[.NET Coreクロスプラットフォームの開発]にチェックしてインストールする。
■リポジトリのクローン
今回は現在の最新のタグ(v7.1.0-preview.6)でやろうと思います。
(各種タグについての説明はここで確認できます)
$git clone https://github.com/PowerShell/PowerShell.git $git checkout v7.1.0-preview.6
■.NET Core SDKのインストール(またはglobal.jsonの書き換え)
現在.NET SDK 5.0以降をインストールしていない人はこのセクションの手順は実施不要です。
後述する「Powershell Coreのビルド」で自動的に.NET SDKがインストールされます。
.NET Core SDKをすでにインストール済みの人は、この手順が必要です。
- インストールされている.NET SDKのバージョン確認
$dotnet --list-sdks 3.1.301 [C:\Program Files\dotnet\sdk] 3.1.401 [C:\Program Files\dotnet\sdk] 5.0.100-preview.7.20366.6 [C:\Program Files\dotnet\sdk]
自分の場合は5.0.100-preview.7.20366.6
ですね。
\global.json
を書き換え
cloneしたPowershell
直下の.\global.json
を下記のように書き換えます。
$type global.json { "sdk": { "version": "5.0.100-preview.7.20366.6" } }
■Powershell Coreのビルド
cloneしたPowershell
直下で実行してください。 Powershellまたはpwshで実行してください。
Powershellのプロンプトってどう表現すればいいか分からなかったので、ここでは
PS>
としています 。
以下のコマンドで.NET SDKをインストールします。すでにインストール済みの場合はdotnet is already installed. Skipping installation.
のようなメッセージが出ます。
PS>Import-Module .\build.psm1 PS>Start-PSBootstrap
以下のコマンドでPowershell Coreをビルドします。
Start-PSBuild
正常終了されればOKです。
実行ファイルへのパスは下記のコマンドで確認できます。
PS>Get-PSOutput C:\develop\global_reps\PowerShell\src\powershell-win-core\bin\Debug\net5.0\win7-x64\publish\pwsh.exe
Visul Studioでデバッグ
cloneしたPowershell
直下の.\PowerShell.sln
を開きます。 f5
キーで実行します。
プロンプトが表示されるので、試しにGet-ChildItem
コマンドレットをたたいてみます。
PS C:\develop\global_reps\PowerShell\src\powershell-win-core\bin\Debug\net5.0> Get-ChildItem Directory: C:\develop\global_reps\PowerShell\src\powershell-win-core\bin\Debug\net5.0 Mode LastWriteTime Length Name ---- ------------- ------ ---- d---- 2020/08/22 10:07 cs d---- 2020/08/22 10:07 de d---- 2020/08/22 10:07 en-US d---- 2020/08/22 10:07 es d---- 2020/08/22 10:07 fr d---- 2020/08/22 10:07 it d---- 2020/08/22 10:07 ja d---- 2020/08/22 10:07 ko d---- 2020/08/22 10:07 Modules d---- 2020/08/22 10:07 pl d---- 2020/08/22 10:07 preview d---- 2020/08/22 10:07 pt-BR d---- 2020/08/22 10:07 ru d---- 2020/08/22 10:07 runtimes d---- 2020/08/22 10:07 Schemas d---- 2020/08/22 10:07 tr d---- 2020/08/21 16:19 win7-x64 d---- 2020/08/22 10:07 zh-Hans d---- 2020/08/22 10:07 zh-Hant -a--- 2020/08/21 16:13 8933 Install-PowerShellRemoting.ps1 -a--- 2020/08/21 16:13 2908 InstallPSCorePolicyDefinitions.ps1 -a--- 2020/08/21 16:13 1095 LICENSE.txt -a--- 2020/04/18 16:34 403456 Markdig.Signed.dll -a--- 2020/04/22 16:37 350072 Microsoft.ApplicationInsights.dll -a--- 2020/07/25 4:15 5437320 Microsoft.CodeAnalysis.CSharp.dll ....... PS C:\develop\global_reps\PowerShell\src\powershell-win-core\bin\Debug\net5.0>
大丈夫そうですね。
コマンドの実行エントリ
.\src\Microsoft.PowerShell.ConsoleHost\host\msh\ConsoleHost.cs
の2583行目当たりの
_exec.ExecuteCommand(line, out e, Executor.ExecutionOptions.AddOutputter | Executor.ExecutionOptions.AddToHistory);
からコマンドを実行します。引数のline
には(よく確認してないけどたぶん、、)プロンプトからの入力がそのまま入る感じですね。
ブレイクポイント
プロンプトの実行、コマンドの実行等の主要なポイントでブレイクポイントを用意しました。
ここからダウンロードしてVisual Studioのブレイクポイントウィンドウからインポートして下さい。
読んでいただきありがとうございました。