⛓️

JSのツールチェーン管理ツール「proto」を使ってみる

2024/03/22に公開

はじめに

個人的に使ってみた所感です。
記載してある情報には誤りがある場合があります。ご了承ください 🙇‍♂️

ツールチェーンってなに?

自分も初めて聞いたので ChatGPT に聞いてみました。

ツールチェインとは、ソフトウェア開発において、プログラムを作成するために必要な一連のツールの集合のことです。

なるほど。
JavaScript を例にすると、Node.js や Deno, npm や yarn などのツール群を総じてツールチェーンと表現するみたい。勉強になります。

最近、分からない単語が登場した時は Google さんよりも ChatGPT さんに聞きがちです。web の知識をまとめた上で噛み砕いて教えてくれるので理解が捗ります。もちろん情報の精査はしますが。

JavaScript のツールチェーン管理ツール「proto」

https://moonrepo.dev/docs/proto

今回自分が見つけたのがprotoという Rust 製の JavaScript のツールチェーン管理ツールです。

このツールを使用することで Node.js や npm, pnpm などのツールを一元管理することができます。

JavaScript 以外にも Python や Go なども対応しており、サードパーティー製のプラグインを使用することで、Biome や Terraform、.NET 等も管理できるらしいです。

使ってみる

インストール

では実際に使っていきたいと思います。
まずはインストールから。

自分は Mac に入れるアプリケーションや CLI はすべてHomebrewで管理したい人間です。
ですがInstall Protoを見てみても brew でのインストール方法が記述されていません。
なので今回はbrew tapコマンドを使用して、brew で管理できるように頑張ってみたいと思います。

brew tap とは公式以外のリポジトリをフォーミュラとして Homebrew に追加するもので、brew のもとで install,uninstall,update などが行えます。もちろん自分が公開しているものも簡単に追加できます。

brew tap とは - Qiitaより引用
(とても分かりやすかったです。ありがとうございました mm)

まずは、brew tapを使い、proto のリポジトリを Homebrew に追加していきます。

zsh
brew tap moonrepo/proto https://github.com/moonrepo/proto

そうするとbrew installで proto がインストールできるようになっています。

zsh
brew install proto

自分の環境ではproto setupを実行しないと動かなかったので実行します。
(公式のインストール方法に従って導入すれば問題ないのかな?)

zsh
proto setup

導入できました!!

zsh
proto --version
# proto 0.31.5

alt text

Node.js をインストールしてみる

proto がインストールできたので実際に Node.js を入れてみます。
インストールするにはinstallコマンドを使います。

zsh
# iはinstallのエイリアス
proto i node #  version指定したい場合はnode 20のように指定する
# [ INFO 2024-03-10 04:21:49.703] proto::commands::install:install  Node.js has been installed to ~/.proto/tools/node/21.7.1!

実際にインストールされたか確認してみます。

zsh
node --version
# v21.7.1

これで proto 経由で Node.js をインストールすることができました。

バージョン固定してみる

pinコマンドを使用します。

zsh
proto pin node 21 --global
# [ INFO 2024-03-10 04:38:23.501] proto::commands::pin:pin  Set the Node.js version to ~21

ディレクトリ毎に使用するバージョンを変えたい時は--globalオプションを削除し使用したいディレクトリでpinコマンドを実行します。
--globalオプションを外すとコマンドを実行したディレクトリに.prototoolsが生成され、そこに固定したツールとバージョンが記載されます。

~/hoge
proto pin node 21
~/hoge
cat .ptorotools
───────┬─────────────────────────────────────────────────────────────────────────
       │ File: .prototools
───────┼─────────────────────────────────────────────────────────────────────────
   1node = "~21"
───────┴─────────────────────────────────────────────────────────────────────────

終わりに

これでディレクトリ、プロジェクト毎に使用するツールのバージョンを自由に固定できるようになりました。

今回は実際の使用頻度が高いであろう最低限の機能の紹介に留めておきます。(というか自分がまだ触れていないだけです。。。)

他の管理ツール(asdfとか)でも似たようなことはできそうなのであえて周りと違ったものを使いたい!なんて方は試してみるといいかもしれません。

「protoは〇〇ができてasdfだと△△ができない!」だとか、「そもそもprotoと他のツールでは役割が全然違う!」みたいな知見をお持ちの方がいらっしゃったら是非コメントにて教えていただきたいですmm

拙い記事ですがご覧いただきありがとうございました!!

おまけ(エイリアス機能について)

想定した使い方ができなかったのでおまけとして残しておきます。

The proto alias <tool> <label> <version> (or proto a) command will define a custom alias that maps to a specific version for the provided tool. Aliases can be used anywhere a version is accepted.

fmfm
ひょっとしてnode --versiontest-node --versionみたいに実行できちゃうのかな?なんて思ったのでやってみました。

pinコマンドと同様に--globalをつけずに実行すると実行したディレクトリのみで設定したエイリアスが使えるらしいです。

zsh
proto alias node test-node 21 --global
# [ INFO 2024-03-10 04:44:00.409] proto::commands::alias:alias  Added alias test-node (~21) for Node.js

これでエイリアスが設定できたはず。。。!!
あれ。。。

zsh
test-node --version
# zsh: command not found: test-node

おかしいですね。。。もしかしたらこのエイリアスはnodeコマンドのエイリアスって訳ではないのかもしれません🤔

ひょっとしたらprotoを開発しているmoonrepoの別プロダクトであるmoonで使えたりするのかもしれません。(完全に憶測です)

GitHubで編集を提案
SMARTCAMP Engineer Blog

Discussion