どんな問題の記事?
以下のような症状の方のための記事です。
-
tfenv
をanyenv
経由でインストールしている。 - 新しいシェルを起動したとき、以下のような出力がある。
No such command 'init'
Usage: tfenv <command> [<options>]
Commands:
install Install a specific version of Terraform
use Switch a version to use
uninstall Uninstall a specific version of Terraform
list List all installed versions
list-remote List all installable versions
対処法は?
以下の2つからお好みの方法で対処できます。
対処法1. anyenv-tfenv-init
を使う
簡単に対処したいなら(拙作で申し訳ないのですが) anyenv-tfenv-init をインストールすることで対処できます。
これは以下の手順で実行できます。
mkdir -p $(anyenv root)/plugins
git clone https://github.com/rugamaga/anyenv-tfenv-init.git $(anyenv root)/plugins/anyenv-tfenv-init
対処法2. PATH
の通ったディレクトリに tfenv-init
を作る
もしくは PATH
の通ったディレクトリにtfenv-init
というシェルスクリプトを配置することで対処できます。
たとえば ~/bin
にパスを通しているなら
echo '#!/usr/bin/env bash' > ~/bin/tfenv-init
chmod +x ~/bin/tfenv-init
とすることで対処できます。
なぜこれが起きているの?
anyenv
は、そこで取り扱うことができる各 .*env
に、 init
というサブコマンドがあることを期待する作りになっています。
これはシェルの起動に伴って tfenv init
というコマンドが呼び出されることを意味しています。
ところが tfenv
側には init
サブコマンドがありません。
そのため tfenv init
がエラーとなり、起動時に問題の表示(=tfenvのusage)が出てしまいます。
なぜこれが対処になるの?
実は tfenv
のサブコマンドは利用者で拡張することができます。
そのためには PATH
の通ったディレクトリに tfenv-(作りたいサブコマンド)
という形式の実行ファイルを置きます。
今回は init
というサブコマンドを実装してしまえばよいです。そこで対処法2では tfenv-init
を作ってしまうことで対処しています。
またanyenv
の plugins
には実行パスが通ります。
そこで対処法1では tfenv-init
を内蔵させた anyenv-tfenv-init
というanyenv
のプラグインをインストールしました。
長期的には?
upstreamの tfenv
や anyenv
のリポジトリに、この問題を議論するIssueはすでにあります。
しかし動きがないまま1〜2年ほど経っています。
https://github.com/tfutils/tfenv/issues/53
https://github.com/anyenv/anyenv/pull/81
解決したらanyenv-tfenv-init
側は「このプラグインを消すのだ。」というアラートを出そうと思っています。