patorashのブログ

方向性はまだない

fishでanyenvを無理やり動かす

Node.jsのバージョン管理をどうやって行うかなーと考えてて、nvmかnodebrewか?などと呟いていたら、anyenvとndenvの組み合わせを教えてもらいました。anyenvは*env系のものを一緒に扱えるので、rbenvを入れるのも簡単そうだし、よさそう!と思って採用してみることに。最初はbashで作業していたのですが、やはりfishにしたいな〜と思い、fishにしたところ、ここに罠が待っていました。

fishでndenvが動かない

anyenv経由で入れたndenvが動きません。rbenvは動きます。

同様のことにハマっている人がいたので、追っていきました。

ja.stackoverflow.com

.config/fish/config.fishでanyenvの初期化処理を流すところで、ndenvがfishに対応していないようです…。

初期化処理を修正する

初期化処理をrbenvのようにfishに対応させればいけるんじゃないか?と思い、やってみることにしました。調査していたら、すでにそのようにしている方の記事を見つけたので、それに倣って修正していきました。

nemu-sou.hatenablog.com

事前処理

まずは、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という名前に変えて置くことにしました。

fish and anyenv(rbenv, ndenv)

その後、シェルを再読み込みするなりして、rbenv, ndenvと打ってみましょう。ちゃんと出ると思います。