技術メモ、Tips、忘備録

技術系のメモ、試してみたこと、その他

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のブレイクポイントウィンドウからインポートして下さい。

読んでいただきありがとうございました。

・免責事項

当方は、当記事にコンテンツを掲載するにあたって、その内容、機能等について細心の注意を払っておりますが、コンテンツの内容が正確であるかどうか、最新のものであるかどうか、安全なものであるか等について保証をするものではなく、何らの責任を負うものではありません。また、当方は通知することなく当記事に掲載した情報の訂正、修正、追加、中断、削除等をいつでも行うことができるものとします。また、当記事、またはコンテンツのご利用により、万一、ご利用者様に何らかの不都合や損害が発生したとしても、当方は何らの責任を負うものではありません。