どんな問題の記事?
以下のような症状の方のための記事です。
-
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側は「このプラグインを消すのだ。」というアラートを出そうと思っています。