0.16.0にアップグレードする
asdfはバージョン0.15.0以前まではBashで書かれており、asdf関数がシェルにロードされたBashスクリプトのセットとして配布されていました。バージョン0.16.0はasdfをGoで完全に書き直したものです。完全に書き直したことによって多くの破壊的変更があり、現在ではスクリプトのセットではなくバイナリになっています。
インストール
バージョン0.16.0のインストールは、以前のバージョンのasdfよりもはるかに簡単です。 たったの3ステップで完了します:
- お使いのオペレーティングシステム/アーキテクチャの組み合わせに適した
asdfバイナリをダウンロードし、$PATHのディレクトリに配置する。 $PATHの前に$ASDF_DATA_DIR/shimsを追加する。- 以前にasdfのデータの保存場所をカスタマイズしていた場合は、
ASDF_DATA_DIRに旧バージョンのプラグイン、バージョン、Shimをインストールしていたディレクトリを設定する(オプション)。
オペレーティングシステムのパッケージマネージャがすでにasdf 0.16.0を提供している場合は、それをインストールするのがおそらく最良の方法です。asdfのアップグレードはOSのパッケージマネージャーと手動インストールでのみ可能です。セルフアップグレード機能はありません。
データを失わずにアップグレードする
既存のインストールデータを失うことなく、asdfの最新バージョンにアップグレードできます。上記の手順と同じです。
1. お使いのオペレーティングシステムとアーキテクチャに適したasdfバイナリをダウンロードする
バイナリをダウンロードして、パスの通ったディレクトリに配置します。以下ではasdfのバイナリを$HOME/binに配置し、$HOME/binを$PATHの先頭に追加します:
# In .zshrc, .bashrc, etc...
export PATH="$HOME/bin:$PATH"2. ASDF_DATA_DIR を設定する
asdf infoを実行し、変数ASDF_DATA_DIRを含む行をコピーします:
...
ASDF_DATA_DIR="/home/myuser/.asdf"
...シェルのRCファイル(Zshの場合は.zshrc、Bashの場合は.bashrcなど)で、ASDF_DATA_DIRを設定してエクスポートします:
export ASDF_DATA_DIR="/home/myuser/.asdf"3. $ASDF_DATA_DIR/shimsを$PATHの前に追加する。
シェルのRCファイル(手順2と同じファイル)で、パスの前に$ASDF_DATA_DIR/shimsを追加します:
export ASDF_DATA_DIR="/home/myuser/.asdf"
export PATH="$ASDF_DATA_DIR/shims:$PATH"4. Shimを再生成する
asdf --helpを実行して、シェルセッションのasdfコマンドのバージョンが0.16.0以上であることを確認してください。まだ古いバージョンが表示されている場合は、新しいシェルセッションを開始する必要があります。
asdfコマンドが新しいバージョンであることを確認したら、asdf reshimを実行してすべてのShimを再生成します。この手順は、古いShimが古いバージョンのBashを参照している可能性があるため必要となります。
テスト
0.16.0へのアップグレードで問題が発生するかどうか確信が持てない場合は、「データを失わずにアップグレードする」で説明したように、既存のバージョンに加えて0.16.0をインストールしてテストすることができます。0.16.0へのアップグレードで不具合が生じることがわかったら、シェルのRCファイルに追加した行を削除してください。
破壊的変更
ハイフン付きバージョンのコマンドは削除されました
asdfバージョン0.15.0およびそれ以前では、特定のコマンドのハイフン付きバージョンとハイフンなしバージョンがサポートされていました。バージョン 0.16.0 では、ハイフンなしバージョンのみがサポートされます。影響を受けるコマンドは以下です:
asdf list-all->asdf list allasdf plugin-add->asdf plugin addasdf plugin-list->asdf plugin listasdf plugin-list-all->asdf plugin list allasdf plugin-update->asdf plugin updateasdf plugin-remove->asdf plugin removeasdf plugin-test->asdf plugin testasdf shim-versions->asdf shimversions
asdf global と asdf local コマンドが asdf set に変更されました
asdf global と asdf local は削除されました。「グローバル」と「ローカル」という用語は誤りで、誤解を招く恐れがありました。asdf は、実際にはあらゆる場所に適用される「グローバル」バージョンをサポートしていません。asdf globalで指定したバージョンは、カレントディレクトリにある .tool-versions ファイルで簡単に上書きすることができました。これはユーザーを混乱させていました。 新しいasdf setはデフォルトではasdf localと同じように動作しますが、ユーザーのホームディレクトリ (--home) や親ディレクトリ (--parent) にある既存の .tool-versions ファイルにバージョンを設定するためのフラグも用意されています。 この新しいインターフェイスは、asdfがどのようにバージョンを解決するかをよりよく理解し、同等の機能を提供することを期待しています。
asdf updateコマンドが削除されました
この方法ではアップデートを実行できなくなりました。OS のパッケージマネージャを使用するか、手動で最新のバイナリをダウンロードしてください。さらに、バージョン 0.15.0 以前のasdf updateコマンドは、インストールプロセスが変更されたため、バージョン 0.16.0 にアップグレードできません。 asdf updateを使用して最新のGo実装にアップグレードすることはできません。
asdf shellコマンドが削除されました
このコマンドは実際にユーザーの現在のシェルセッションに環境変数を設定していました。これはasdfが実行可能ファイルではなく、実際にはシェル関数であったために可能でした。新しい実装では、asdfからすべてのシェルコードが削除され、シェル関数ではなくバイナリになったので、シェルで直接環境変数を設定することはできなくなりました。
asdf currentが変更されました
これまで出力されていた3つのカラムの代わりに、最後のカラムはバージョンが設定されている場所か、バージョンを設定またはインストールするために実行可能な推奨コマンドのいずれかが表示されるようになりました。3番目のカラムが2つのカラムに分割されています。3番目のカラムは、バージョンが設定されている場合(通常、バージョンファイルか環境変数のいずれか)のみ、バージョンのソースを示すようになり、4番目は、指定されたバージョンが実際にインストールされているかどうかを示すブール値です。インストールされていない場合は、インストールコマンドの候補が表示されます。
プラグイン拡張コマンドの前にcmdを付ける必要があります
以前のプラグイン拡張コマンドは次のように実行できました:
asdf nodejs nodebuild --version現在では、組み込みコマンドと混同するのを避けるために、cmdをプレフィックスとして付ける必要があります:
asdf cmd nodejs nodebuild --version拡張コマンドが再設計されました
プラグイン拡張コマンドにはいくつかの変更点があります:
- 拡張コマンドは
execシステムコールで実行可能でなければなりません。拡張コマンドがシェルスクリプトの場合、execで実行するためには適切なshebang行で始まる必要があります。 - 拡張コマンドはバイナリでもスクリプトでも、どの言語でも実行できるようになりました。もはや
.bashという拡張子を要求するのは誤解を招くので意味がありません。 - 実行権限が設定されていなければなりません。
- 実行権限がない場合、asdfによってBashスクリプトとしてソースされなくなりました。
さらに、プラグイン名の後の最初の引数のみが、実行する拡張コマンドを決定するために使用されます。これは、プラグイン名の後の最初の引数にマッチするコマンドが見つからない場合にasdfがデフォルトで実行するcommand拡張コマンドが存在することを意味します。たとえばこのようになります:
foo/
lib/commands/
command
command-bar
command-bat-man以前は、これらのスクリプトはこのように動作していました:
$ asdf cmd foo # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command`
$ asdf cmd foo bar # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bar`
$ asdf cmd foo bat man # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat-man`現在はこのようになります:
$ asdf cmd foo # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command`
$ asdf cmd foo bar # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bar`
$ asdf cmd foo bat man # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat man`実行可能なShimはsyscall.Execによって実行できる必要があります
asdf 0.15.0以前はBashで実装されていたので、Bashで実行できる実行ファイルであれば実行することができました。つまり、shebang行がないスクリプトでもasdf execで実行することができました。しかし、asdf 0.16.xがGoで実装されたことで、Goのsyscall.Exec関数を使って実行ファイルを呼び出すようになり、shebangがないスクリプトは扱えなくなりました。
実際には、これはあまり問題ではありません。ほとんどのシェルスクリプトはshebang行を含んでいます。asdfによって管理されるツールがshebang行を持たないスクリプトを提供する場合、shebang行を追加する必要があります。
カスタムShimテンプレートはサポートされなくなりました
これはめったに使われない機能でした。コアチームがメンテナンスしているプラグインでこの機能を使用していたのはElixirプラグインだけで、もう必要ありません。この機能はもともと、実行されるのではなくプログラムによって評価されるShimが、特定のプログラム(Elixir の場合はiexシェル)による評価に適したコードを含むように追加されました。さらに調べてみると、この機能は実行可能ファイルのPATHが不適切に設定され、選択されたバージョンの実行可能ファイルではなく、Shimを含むように設定されていたために存在していたようです。