メインコンテンツまでスキップ

PowerShellプロファイルの肥大化

· 約4分
mebiusbox
engineer

PowerShellが便利なので、さまざまな関数やコマンドレットをプロファイルに追加していったら、肥大化して少し問題になりました. ここでは、それに関する備忘録を残しておきます.

PowerShellでも色んなことができるので、ちょっとしたことは可能ならPowerShellで処理するようにしています. そういったものはスクリプトとして作成せずに、関数やコマンドレットとして作成していました. ところが、PowerShellプロンプトを開くたびにコマンドが打てるまでの時間が長くなってしまいました. プロファイルの読み込み時間が表示されるので確認してみると10秒以上かかっています. さすがに長く感じてきたので、対処することにしました.

具体的には、もともといくつかのモジュールに分けていて、プロファイルですべてをインポートしていたのですが、それをやめて必要最小限にとどめました. そして、必要であればモジュールをインポートする形に変更しました.結果、プロファイルの読み込みが2秒ぐらいになり、快適になりました. その反面、必要になるたびにモジュールを手動でインポートする手間が発生するようになりました. もちろん、インポートを手軽にできるように工夫してこの手間も最小限にしています.

機能ごとにスクリプトを1つ作成して呼び出すのは、結局管理が大変になりそうなので、今はこのやり方で落ち着いています.

2025-03-28 追記

いくつかのモジュールを分けることで大分速くなったのですが、それでも遅い部分がありました.以下、2つの点で改善できたので書いておきます.

Oh My Posh が遅い

初期化に1秒以上かかっていました.ターミナル上でいろいろ確認できるので便利なのですが、どのターミナルでも必要というわけではなかったので、標準で実行しないようにしました.かわりに、initコマンドレットを作って、その中で実行するようにしました.

スクリプトモジュール化

モジュールを分けていたのですが、Import-Module で指定する形になっていました.これらのモジュールをスクリプトモジュール準拠にして、$PSModulePath の場所に登録することで、そもそも Import-Module を呼ぶ必要がなくなりました.PowerShellは $PSModulePath パスから自動でコマンドレットを検索してくれます.私の場合、$PSModulePath にパスを追加して管理しています.

以上です.