[PowerShell] Oh My PoshのPowerShellモジュールが廃止されていたので移行してみた

2022.08.11

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

しばたです。

以前の記事で紹介した様に私はWindows TerminalでPowerShellを扱う際にOh My Poshを使っています。

記事を公開した時はOh My PoshのバージョンがV2系からV3系への過渡期だったのですが、その後V3からはPowerShell以外のシェルもサポートする様になり頻繁にメジャーバージョンが上る方針に切り替わりました。

私も定期的にバージョンアップに追従する様にしており、本日久しぶりにアップデートしたところ以下のメッセージが表示されPowerShellモジュールを使ったインストールが廃止された旨が通知されました。

Hey friend

In an effort to grow oh-my-posh, the decision was made to no
longer support the PowerShell module. Over the past year, the
added benefit of the module disappeared, while the burden of
maintaining it increased.

However, this doesn't mean oh-my-posh disappears from your
terminal, it just means that you'll have to use a different
tool to install it.

All you need to do, is follow the migration guide here:

https://ohmyposh.dev/docs/migrating

Oh My Poshをバージョンアップする

更新前はVer.7.41.0を使っていました。
Update-Moduleを使い、最終的に更新されたバージョンはVer.7.85.2でこのバージョンがPowerShellモジュールをサポートしていた最終バージョンとなります。

先述のメッセージ通りPowerShellモジュールを廃止した後の移行方法は以下のドキュメントに記載されています。

基本的には

  1. 旧バージョンバイナリの削除
  2. 新バージョンのインストールと起動方法の更新
  3. PowerShellモジュールの削除

を行う形となります。
今回私は動作確認しながら試したので、

  1. 旧バージョンバイナリの削除
  2. PowerShellモジュールの削除
  3. 新バージョンのインストール
  4. 起動方法の更新

の順序で作業を行っています。
環境に応じて適切な順序を選んでください。

1. $env:POSH_PATH の削除

PowerShellモジュールベースでOh My Poshを使っている場合POSH_PATH環境変数が有効で、このパスに実行バイナリなどが保存されているはずです。
私の場合は"ユーザープロファイル"\AppData\Local\oh-my-posh\に設定されていました。

# POSH_PATH 環境変数が指すディレクトリ
C:\> dir $env:POSH_PATH

    Directory: C:\Users\shibata\AppData\Local\oh-my-posh

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----           3/17/2022  1:52 PM                themes
-a---           3/17/2022  1:52 PM       18855936 oh-my-posh.exe

こちらの内容を確認し保存しておく必要があるファイルが無ければディレクトリごと削除します。

# 環境変数が設定されている場合は削除
#
# ※環境変数が設定されていない場合に誤ってカレントディレクトリを消してしまわない様に注意!
# 
if (-not ($null -eq $env:POSH_PATH)) {
    Remove-Item $env:POSH_PATH -Force -Recurse
}

2. PowerShellモジュールのアンインストール

次にPowerShellモジュールをアンインストールします。

# PowerShellモジュールのアンインストール
Uninstall-Module oh-my-posh -AllVersions

3. 新バージョンのインストール

現在のOh My PoshはWindows環境だとWindows Package Manager (WinGet)Scoopを使いインストールする仕組みになっています。

今回はWinGetを使いインストールしてやります。
WinGet自体のインストール方法は割愛します。

# WinGetで oh-my-posh をインストール
winget install JanDeDobbeleer.OhMyPosh -s winget

今回はVer.8.29.5がインストールされました。
インストール後コンソールを再起動すれば以下の様にoh-my-poshのバイナリが見つかるはずです。

# Get-Commandで oh-my-posh の実行バイナリが見つかればOK
C:\> Get-Command oh-my-posh | Format-List Name, Path

Name : oh-my-posh.exe
Path : C:\Users\shibata\AppData\Local\Programs\oh-my-posh\bin\oh-my-posh.exe

なお、新しいバージョンではPOSH_PATH環境変数はありません。

4. 起動方法の更新

最後に従来の起動方法から新しい方法に切り替えてやります。

もしPowerShellのプロファイルにImport-Moduleを書いている場合はその記述を削除します。
そしてプロンプトをカスタマイズするSet-PoshPromptの呼び出しを以下の記述に置き換える必要があります。

# Set-PoshPromptの代わりに以下の様に oh-my-posh init pwsh を実行する
oh-my-posh init pwsh --config "設定ファイルのパス" | Invoke-Expression

# 標準のテーマを使っている場合はこんな感じで実行する
oh-my-posh init pwsh --config "$env:POSH_THEMES_PATH\jandedobbeleer.omp.json" | Invoke-Expression

以前の記事で書いた例を出すと以下の様に書き換えてやります。
こちらは環境に応じてよしなに変えてください。

# 過去の書き方
if ($env:WT_PROFILE_ID) {
    # Windows Terminalから実行されたときだけ変更する設定をここに記述する
    Import-Module oh-my-posh
    Set-PoshPrompt -Theme agnosterplus
}

# ↓ 

# 新しいバージョンでの書き方
if ($env:WT_PROFILE_ID) {
    # Windows Terminalから実行されたときだけ変更する設定をここに記述する
    oh-my-posh init pwsh --config "$env:POSH_THEMES_PATH\agnosterplus.omp.json" | Invoke-Expression
}

今後のバージョンアップ方法

新しいバージョンをインストールした方法(WinGet, Scoop)の流儀に従ってバージョンアップします。
WinGetの場合であれば以下の様な感じでwinget upgradeコマンドを実行してやります。

# WinGetでバージョンアップ
winget upgrade JanDeDobbeleer.OhMyPosh -s winget

最後に

以上となります。

思った以上に簡単に切り替えることができました。
更新前のバージョンによっては設定ファイルの記述に互換性が無い場合もあるかもしれません。
その場合は起動方法と併せて設定ファイルのマイグレーションを行うことになるでしょう。