Node.jsのバージョン管理をどうやって行うかなーと考えてて、nvmかnodebrewか?などと呟いていたら、anyenvとndenvの組み合わせを教えてもらいました。anyenvは*env系のものを一緒に扱えるので、rbenvを入れるのも簡単そうだし、よさそう!と思って採用してみることに。最初はbashで作業していたのですが、やはりfishにしたいな〜と思い、fishにしたところ、ここに罠が待っていました。
fishでndenvが動かない
anyenv経由で入れたndenvが動きません。rbenvは動きます。
同様のことにハマっている人がいたので、追っていきました。
.config/fish/config.fishでanyenvの初期化処理を流すところで、ndenvがfishに対応していないようです…。
初期化処理を修正する
初期化処理をrbenvのようにfishに対応させればいけるんじゃないか?と思い、やってみることにしました。調査していたら、すでにそのようにしている方の記事を見つけたので、それに倣って修正していきました。
事前処理
まずは、anyenvへPATHを通します。config.fishに以下を書きます。
set -x PATH $HOME/.anyenv/bin $PATH
一旦保存して、shellを再読み込みします。
exec fish -l
その後、anyenvでrbenvとndenvを入れます。
anyenv install rbenv ndenv
config.fishの修正
次に、rbenv, ndenvへの設定をconfig.fishに書いていきます。通常ならば、
eval (anyenv init - fish)
のみでよかったのですが、ndenvがこの引数のfishを理解できずにbashで処理を行おうとするため、文法エラーになって落ちていました。
rbenv
先ほどのブログを参考にしながら、まずはrbenvの設定を行っていきます。config.fishに追記します。
# rbenv set -x RBENV_ROOT "$HOME/.anyenv/envs/rbenv" set -x PATH $PATH "$RBENV_ROOT/bin" # ここから下に、terminalで"rbenv init - fish"と打ったものを書き込む ...
ターミナルで、
rbenv init - fish
と打つと、rbenvの初期化スクリプトがfish形式で表示されます。それをconfig.fishに追記します。
これで、rbenvは終わりです。
ndenv
同様に、ndenvをやっていきましょう。
# ndenv set -x NDENV_ROOT "$HOME/.anyenv/envs/ndenv" set -x PATH $PATH "$NDENV_ROOT/bin"
ターミナルで、
ndenv init - fish
と打つと、ndenvの初期化スクリプトがbash形式で表示されます。bash形式なので、fish形式に変更しなくてはなりません。rbenv側で出力されたものと同じになるように修正していくだけなので、そんなに難しくはありません。
完成品
で、完成品がこちらになります。rbenv, ndenv以外のものをいれた場合は、個別に**env init - fishを実行して追記していく形になると思います。うん、面倒ですねぇ…。あと、~/.config/fish/conf.d/以下にファイルを置いたら自動でロードされるので、anyenv.fishという名前に変えて置くことにしました。
その後、シェルを再読み込みするなりして、rbenv, ndenvと打ってみましょう。ちゃんと出ると思います。