Pwshのビルド方法
Windows環境におけるdotnet Pwshのビルド方法を書きます。
公式では分かりづらい、説明不足気味なので。
準備
プロジェクトのclone
# forkしてるならフォーク元
gh repo clone Powershell/Powershell
適当なタグにチェックアウト
とりあえず、正しい動作を先に見ましょう。
rec2は大体動きます。previewは怪しい。
ぶっちゃけ動作確認するだけなら、previewじゃなくて、rc見ましょう。
それが無いなら、リリースのバージョン使いましょう。
面倒くさいこと考えなくてすみます。
# タグ一覧
git tag
git checkout v7.3.6
IDE or editor
Powershell.slnとVisual studio用のプロジェクトファイルがあるが、
Visual studioは別になくてもビルド、テストはできる。
Visual studioとvscodeと慣れているほうでよい。
ただ、テストでかなり重い処理になるのでvscodeの方がいいかな?
環境構築
windows
dotnet sdk
ビルドにpreview版のdotnet sdkがいる。
Start-PSBootstrapでもインストールできるが、
これにバグがあるらしく、Start-PSBootstrap経由でインストールすると
"C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\7.0.0-preview.7.22375.6"
に必要なライブラリがインストールされないため、ビルドに失敗する。
winget 経由でインストールしてください。
winget install Microsoft.DotNet.SDK.Preview
dotnetの powershell
最新(プレビューでない)のdotnet のpowershellをインストールしてください。
winget install Microsoft.PowerShell
依存しているPowershellのモジュールをインストール
指定のモジュールをnugetのglobal-packagesに置く必要があります。
nugetで直接インストールできないので、
powershellでインストールした後にnugetのglobal-packagesにパスを通す形で、
処理します。
以下のコマンドはすべてdotnetのpowershellで行ってください。
モジュールのインストール
管理者権限で行ってください。
# module 下記のモジュールはすべてPSGallery経由のため、PSGalleryを信用できるとしておく。
Set-PSRepository -Name PSGallery -InstallationPolicy Trusted
# 指定のバージョンのモジュールをインストールします。
# 必要なバージョンが上がった場合はビルド時に失敗するのでその時にアップデートしてください。
Install-Module -Name PowerShellGet -RequiredVersion 2.2.5 -Force
Install-Module -Name PackageManagement -RequiredVersion 1.4.8.1 -Force
Install-Module -Name Microsoft.Powershell.Archive -RequiredVersion 1.2.5 -Force
Install-Module -Name PSReadLine -RequiredVersion 2.2.6 -Force
Install-Module -Name ThreadJob -RequiredVersion 2.0.3 -Force
パスを通す
yournameは使っているユーザー名に置き換えること。
New-item -type SymbolicLink -Value "C:\Users\yourname\Documents\PowerShell\Modules\PowerShellGet" -Path "C:\Users\yourname\.nuget\packages\PowershellGet"
New-item -type SymbolicLink -Value "C:\Users\yourname\Documents\PowerShell\Modules\PackageManagement" -Path "C:\Users\yourname\.nuget\packages\PackageManagement"
New-item -type SymbolicLink -Value "C:\Users\yourname\Documents\PowerShell\Modules\Microsoft.PowerShell.Archive" -Path "C:\Users\yourname\.nuget\packages\Microsoft.PowerShell.Archive"
New-item -type SymbolicLink -Value "C:\Users\yourname\Documents\PowerShell\Modules\PSReadLine" -Path "C:\Users\yourname\.nuget\packages\PSReadLine"
New-item -type SymbolicLink -Value "C:\Users\yourname\Documents\PowerShell\Modules\ThreadJob" -Path "C:\Users\yourname\.nuget\packages\ThreadJob"
ビルド
Import-Module ./build.ps1
# build
Start-PSBuild
docker
windowsより、こっちの方が簡単です。
Import-Module ./build.ps1
# powershellのモジュールやらプロジェクト似合った妥当なdotnet のバージョンをとってくる。
Start-PSBootstrap
## ビルド
Start-PSBuild
ビルド先は
プロジェクト名\src\powershell-win-core\bin\Debug\net7.0\win7-x64\publish\pwsh.exe
となっている。
resource generator
resxファイルを追加、修正した場合は下のように実行して
csファイルを作成する。
Start-PSBuild -ResGen
試しに使ってみる
# shell にログイン
プロジェクト名\src\powershell-win-core\bin\Debug\net7.0\win7-x64\publish\pwsh.exe
# バージョンを見ると確かに今ビルドしたやつになっているはず。
echo $PSVersiontable
テスト実行
# 全テスト
# テスト実行 たくさんpoweshellのウィンドウが開いてテストを行います。
# かなりメモリ食うので注意。
Start-PSPester
# 一部のみテスト
# たいていこっちのほうを使うと思う。
# 書いたテストへのパスを書く。
Start-PSPester -Path .\test\powershell\Modules\Microsoft.PowerShell.Management\Set-Location.Tests.ps1
参考
まとめ
面倒臭い...
windowsユーザーあまりdotnetのshell使って無いんじゃないかな...?
なので、.Net Frameworkのpowershell開くとdotnetのpowershell
紹介するという感じな気がする。
windowsにはStart-PSBootstrapなんてものは無かった。いいね(2023年7月現在では治っているかも)?
Discussion