LoginSignup
31
21

More than 3 years have passed since last update.

asdf-vmを使おう

Last updated at Posted at 2020-03-15

asdf-vmとは?

プログラミング言語及びツールのバージョン管理ツールです。類似ツールに anyenv があります。 anyenv と比較すると、下記の点で優れています。

  • direnvsops 等のツールもプロジェクトごとにバージョン管理できる→READMEに記載するインストールセクションをすっ飛ばせる
  • バージョン管理したいツールはプラグインにより拡張できる
    • プラグインはURL指定できるので、
  • asdf global コマンドを使うと、ユーザーグローバルにツールのバージョン管理ができる ($HOME/.tool-versionsに永続化されているので、dotfilesと相性がいい)

使い方

インストール

基本的に https://asdf-vm.com/#/core-manage-asdf-vm を読んでインストールすればOK。 macOSでhomebrew を使っている場合は

brew install asdf

でインストールできます。

Gitのみでもインストールできて

git clone https://github.com/asdf-vm/asdf.git ~/.asdf
cd ~/.asdf
git checkout "$(git describe --abbrev=0 --tags)"

としましょう。

shellに読み込ませる

asdf環境をセットアップするため、homebrewを使っていてbashを使っているユーザーであれば下記を叩きましょう。

echo -e "\n. $(brew --prefix asdf)/asdf.sh" >> ~/.bash_profile
echo -e "\n. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash" >> ~/.bash_profile

zshやfishをお使いの場合は上記のリンクにまとまっているのでそちらを参照してください。

プラグイン共通で使うパッケージ

opensslcurlなど、プラグイン共通で使うパッケージがあるので下記をインストールしましょう。

brew install \
  coreutils automake autoconf openssl \
  libyaml readline libxslt libtool unixodbc \
  unzip curl

プラグインの追加/削除

利用可能なプラグインの一覧は

asdf plugin list all

で確認できます。例えばrubyの場合、anyenvと違って内部的に rbenv を使っているわけではありません。プラグインごとに必要な依存ツール等あるので、適宜プラグインのREADMEを参考にしてください。

例: nodejs pluginの場合

内部ではgpgを使って問題のあるバージョンではないことを検証しています。そのため、

brew install gpg

と叩いてgpgをインストールしておきましょう。

asdf plugin add nodejs
bash ~/.asdf/plugins/nodejs/bin/import-release-team-keyring

というように、nodejsのプラグインをインストールした後、nodejsのリリースチームのキーリングを取り込む必要があります。

ツールのインストール

asdf install <plugin> <version> と叩くと指定したツールのバージョンがインストールされます。

利用したいディレクトリで

asdf local <plugin> <version>

とすると、そのディレクトリ配下に .tool-versions ファイルが生成され、プラグインとバージョンが保存されます。

.tool-versions vs .node-version etc

最近のバージョンの asdf.tool-versions ファイルに利用するツールとバージョンを記述するようになりました。もし .node-version.ruby-version など他のツールとの互換性を大事にする場合は

$HOME/.asdfrc
legacy_version_file = yes

と設定しましょう。

プラグインの作成方法

調査がてら、fzfのプラグインがなかったので作成してみました。

kompiro/asdf-fzf

公式ドキュメントはこちらです。

さて、プラグインの実態は特定のファイルを含んだ Git リポジトリです。プラグインを追加するとき

asdf plugin add <plugin-name> <git-url>

というようにplugin-name の他 git-url を指定できますが、ユーザーがcloneできればよいのでプライベートリポジトリも利用できます。

実装すべき内容は下記の2つです。

  1. bin/list-all: list-all はインストール時に指定可能なバージョンを指定するためのスクリプトです。バージョン番号をスペース区切りで標準出力すると、呼び出し元のプロセスが良しなに開業して表示します。
  2. bin/install: install は実際のインストールスクリプトです。 downloadスクリプトを別に分離することもできるようですが、多くのプラグインでは install 内でダウンロードも行っています。

GitHubを利用しているのであれば、GitHub API 経由でタグやリリースの一覧を取得し、それに添付されている成果物をダウンロード後、ソースしかなければビルドする、という流れをとっているものが多いです。

まとめ

asdf を使うと、プロジェクトごとに異なるバージョンのツールを切り替えながら使えます。コンテナ化によりプロジェクト専用の環境を用意することもできますが、コンテナにはまだまだなれないメンバーもいる状況では、asdfは非常に便利ではないでしょうか。

31
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
21