📌

Pwshのビルド方法

2022/09/08に公開

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 Build方法

まとめ

面倒臭い...
windowsユーザーあまりdotnetのshell使って無いんじゃないかな...?

なので、.Net Frameworkのpowershell開くとdotnetのpowershell
紹介するという感じな気がする。

windowsにはStart-PSBootstrapなんてものは無かった。いいね(2023年7月現在では治っているかも)?

Discussion