anyenvでtfenvを使うときのエラーを抑止する


どんな問題の記事?

以下のような症状の方のための記事です。

  • tfenvanyenv経由でインストールしている。
  • 新しいシェルを起動したとき、以下のような出力がある。
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 を作ってしまうことで対処しています。

またanyenvplugins には実行パスが通ります。
そこで対処法1では tfenv-init を内蔵させた anyenv-tfenv-init というanyenvのプラグインをインストールしました。

長期的には?

upstreamの tfenvanyenv のリポジトリに、この問題を議論するIssueはすでにあります。
しかし動きがないまま1〜2年ほど経っています。

https://github.com/tfutils/tfenv/issues/53
https://github.com/anyenv/anyenv/pull/81

解決したらanyenv-tfenv-init側は「このプラグインを消すのだ。」というアラートを出そうと思っています。