様々なツールチェーンに対応したバージョンマネージャのprotoを紹介
最近までNode.jsのバージョン管理ツールにVoltaを使用していたのですが、あんまり更新も活発ではないようですし使い続けていると色々不便を感じ始めたので、何かないかと探していたところprotoというものを見つけたので紹介記事として残しておこうと思います。
protoとはなんぞや
ランタイムやパッケージマネージャ、CLIなどのツールチェーンのバージョン管理を担ってくれるバージョンマネージャーの一つです。
- クロスプラットホーム対応のツールチェーン用バージョンマネージャー
- プラグインによって拡張可能だよ
- プラグインはTOMLまたはWasmを使うことで作成可能
- v1はリリースされていないけど、開発は進んでいるようなので今後に期待できそう
特徴は以上の点が上げられそうです。より詳しい詳細は公式サイトを見ると良いでしょう。
インストール
公式サイトを参照してください。
プラグイン
protoに様々なツールのバージョン管理をさせるためには、プラグインが必須です。必要に応じてインストールしましょう。
ビルトインでNode.jsやBun、DenoのようなJavaScript向けのランタイムだけではなく、RustやGoなど様々なプログラミング言語用に管理を担ってくれるプラグインが入っているようです。
サードパーティ製にはZigやkubectlのようなツールもあります。
普段用にツールチェーンをインストールする
私はVoltaと置き換えるためにprotoを選択したので、この記事では試しにNode.jsとパッケージマネージャーだけインストールしてみようと思います。
# Node.jsのLTSに指定されている最新のバージョンをインストールする
$ proto install node lts --pin
# pnpmの最新バージョンをインストール
$ proto install pnpm --pin
# npmjs.comにあるvercelパッケージをグローバルインストールする場合
$ proto install-global node vercel@latest
proto install
時に--pin
オプションを付けることで、プロジェクトごとに何も指定がない場合にデフォルトで使われるバージョンとして固定することができます。(設定は~/.proto/.prototools
に書き込まれます。)
実際のプロジェクトを想定して使ってみる
適当に検証用のフォルダを作成して、カレントディレクトリを変更します。
$ mkdir -p ~/work/try-proto
$ cd ~/work/try-proto
プロジェクトで使用したいツールチェーンのバージョンを固定する
$ proto pin node 21.5.0
[ INFO 00:00:00.000] proto::commands::pin:pin Set the Node.js version to 21.5.0
$ proto pin pnpm 8.13.1
[ INFO 00:00:00.000] proto::commands::pin:pin Set the pnpm version to 8.13.1
正しく実行できると.prototools
というファイルがカレントディレクトリの中に作成されます。
node = "21.5.0"
pnpm = "8.13.1"
プロジェクトで使用されているツールチェーンをインストールする
proto use
を実行するだけです。
.prototools
等を読み取って適切なツールをインストールしてくれます。
ツールを自動インストールする
一々proto use
って打つのが面倒だと感じる方は、settings.auto-install
をtrue
にしてみてください。
[settings]
auto-install = true
上記の設定を加えることで、proto use
を使用せずとも自動でツールチェーンのインストールが行われ実行できるようになります。
.prototools
について
使うツールチェーンのバージョンが書かれていたり、protoの設定を書き込めるファイルです。
記法はTOMLそのままです。
node = "16.16.0"
npm = "9"
go = "~1.20"
rust = "stable"
[settings]
auto-install = true
...(以下省略)...
.prototools
Version Detection と protoにはVersion Detectionと呼ばれる機能が存在します。
Node.jsを使用しているプロジェクトであれば.nvmrc
やpackage.json
から使用されているNode.jsのバージョンを割り出してくれる機能です。
ここで考えるわけです。protoは.prototools
に記述されたバージョンか、Version Detectionで検出されたバージョンどちらを使用するのか?
正解は、.prototools
が優先されます。
.prototools
の解決順序
公式によるとカレントディレクトリにある.prototools
から上に向かって~/.prototools
にたどり着いてから~/.proto/.prototools
を最後に解決する仕組みになって、最優先される設定はカレントディレクトリにある.prototools
の設定であり、それ以外の.prototools
の設定をフォールバックとして利用するようです、
つまり、以下のような構成のプロジェクトがあったとすると:
~/work/try-proto/
├── .prototools
└── apps
├── docs
│ └── .prototools
└── web
└── .prototools
一つのプロジェクトでサブディレクトリごとに.prototools
を配置して、それぞれ全然違うバージョンのツールを利用するなんてことも可能です。
ただカレントディレクトリを間違えると全然違うバージョンのツールを実行してしまう可能性もありえそうなので、よく確認はした方がいいでしょう。
個人的にVoltaと比較して嬉しいところ
ツールの更新チェックと実行が楽
Voltaには更新を確認できる機能自体存在しませんが、protoにはproto outdated
という更新の確認と更新して.prototools
をアップデートできるコマンドが備わっています。
グローバルインストールしているものくらいは理由がない限り常に最新にしたい人間なので、この機能は私にとって非常に嬉しかったですね。
ただ、proto install-global
で入れたものはproto outdated
では確認も更新もできないのがちょっと残念かもしれません...
未使用ツールをクリーンアップできる
当然ですが、volta install
するとどんどん~/.volta
が肥大化していくのですが、使われなくなったツールが残ったときのお掃除が手動になってしまうのでちょっと面倒という点があります。
protoではproto clean
コマンドで楽々お掃除が可能です。
終わり
どうでしょう。まだv1がリリースされてないとはいえ良さそうなバージョンマネージャーに見えませんか?
雑に紹介してしまったので、詳細は公式サイトを是非ご覧になってください。
以上
Discussion