🛠️

様々なツールチェーンに対応したバージョンマネージャのprotoを紹介

2024/01/09に公開

最近までNode.jsのバージョン管理ツールにVoltaを使用していたのですが、あんまり更新も活発ではないようですし使い続けていると色々不便を感じ始めたので、何かないかと探していたところprotoというものを見つけたので紹介記事として残しておこうと思います。

protoとはなんぞや

ランタイムやパッケージマネージャ、CLIなどのツールチェーンのバージョン管理を担ってくれるバージョンマネージャーの一つです。

  • クロスプラットホーム対応のツールチェーン用バージョンマネージャー
  • プラグインによって拡張可能だよ
    • プラグインはTOMLまたはWasmを使うことで作成可能
  • v1はリリースされていないけど、開発は進んでいるようなので今後に期待できそう

特徴は以上の点が上げられそうです。より詳しい詳細は公式サイトを見ると良いでしょう。

インストール

公式サイトを参照してください。

https://moonrepo.dev/docs/proto/install

プラグイン

protoに様々なツールのバージョン管理をさせるためには、プラグインが必須です。必要に応じてインストールしましょう。

ビルトインでNode.jsやBun、DenoのようなJavaScript向けのランタイムだけではなく、RustやGoなど様々なプログラミング言語用に管理を担ってくれるプラグインが入っているようです。

https://moonrepo.dev/docs/proto/tools#built-in

サードパーティ製にはZigやkubectlのようなツールもあります。

https://moonrepo.dev/docs/proto/tools#third-party

普段用にツールチェーンをインストールする

私は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に書き込まれます。)

https://moonrepo.dev/docs/proto/commands/install

実際のプロジェクトを想定して使ってみる

適当に検証用のフォルダを作成して、カレントディレクトリを変更します。

$ 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というファイルがカレントディレクトリの中に作成されます。

.prototools
node = "21.5.0"
pnpm = "8.13.1"

プロジェクトで使用されているツールチェーンをインストールする

proto useを実行するだけです。

.prototools等を読み取って適切なツールをインストールしてくれます。

ツールを自動インストールする

一々proto useって打つのが面倒だと感じる方は、settings.auto-installtrueにしてみてください。

.prototools
[settings]
auto-install = true

上記の設定を加えることで、proto useを使用せずとも自動でツールチェーンのインストールが行われ実行できるようになります。

.prototoolsについて

使うツールチェーンのバージョンが書かれていたり、protoの設定を書き込めるファイルです。
記法はTOMLそのままです。

.prototools
node = "16.16.0"
npm = "9"
go = "~1.20"
rust = "stable"

[settings]
auto-install = true
...(以下省略)...

https://moonrepo.dev/docs/proto/config

Version Detection と .prototools

protoにはVersion Detectionと呼ばれる機能が存在します。
Node.jsを使用しているプロジェクトであれば.nvmrcpackage.jsonから使用されているNode.jsのバージョンを割り出してくれる機能です。

ここで考えるわけです。protoは.prototoolsに記述されたバージョンか、Version Detectionで検出されたバージョンどちらを使用するのか?

正解は、.prototoolsが優先されます。

.prototoolsの解決順序

https://moonrepo.dev/docs/proto/config#resolution-order

公式によるとカレントディレクトリにある.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では確認も更新もできないのがちょっと残念かもしれません...

https://moonrepo.dev/docs/proto/commands/outdated

未使用ツールをクリーンアップできる

当然ですが、volta installするとどんどん~/.voltaが肥大化していくのですが、使われなくなったツールが残ったときのお掃除が手動になってしまうのでちょっと面倒という点があります。

protoではproto cleanコマンドで楽々お掃除が可能です。

https://moonrepo.dev/docs/proto/commands/clean

終わり

どうでしょう。まだv1がリリースされてないとはいえ良さそうなバージョンマネージャーに見えませんか?
雑に紹介してしまったので、詳細は公式サイトを是非ご覧になってください。

https://moonrepo.dev/docs/proto

以上

Discussion