はじめに
最近シェルをfishに変えました。
普段はnode.jsのバージョン管理にnvmを使っていたのですが、この機に乗じてanyenv+nodenvを使うようにしました。
(最初はanyenv+ndenvにしてましたが、ndenvがdeprecatedになっていたのでnodenvにしています。)
fishにanyenvをセットアップする方法を調べると、たとえば↓の記事がヒットします。
https://qiita.com/sea_ship/items/996ebb228e4eafa48c11
すると、下のように書いてあります。
~/.config/fish/config.fishを編集してndenvのパスを通します。
anyenv init -の実行結果からndenvのROOTPATHとPATHを通すためのコマンドをコピーします。
anyenv init -
とすれば良いだけのはずが、anyenvのバグ(?)のため手作業でパスを通す必要があるとのこと。
これでは**env
を新たにインストール/アンインストールするたびにパスを更新する必要があり、非常に面倒です。
そこで、手作業に頼らずにanyenv init
する方法を探しました。
2019/01/08 追記
コメントにて、anyenvがfish対応されていることをご指摘いただきました。
anyenvにpathを通した状態で、
$ anyenv init
した結果をconfig.fishに追記するだけで良いようです。
ただし、私が確認した限りでは、ndenv
をインストールしている場合にはこの方法だとエラーになりました。
ndenv
とnenv
をdeprecatedにする動きもありますので、これらを使っている場合はnodenv
に乗り換えるのが良いかと思われます。
ちなみに、上記確認したときの環境は以下の通りです。
- fish v3.0.0
- anyenv (commit 25ed0d8a4fdfa6cdd6832f3c6feb9ee713c8e887の時点)
追記終わり
手順
現状の問題
anyenvのREADMEを見ると、以下のようなInstall手順が書いてあります。
$ git clone https://github.com/riywo/anyenv ~/.anyenv
$ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.your_profile
$ echo 'eval "$(anyenv init -)"' >> ~/.your_profile
$ exec $SHELL -l
このとき、anyenv init -
を実行すると、実行中のシェル用のイニシャライズスクリプトが吐き出されるはずなのですが、fishの場合はbashの文法が混ざってしまうというバグがあります。
解決方法
そこで、fishのプラグインedc/bassを使うことを考えました。
このプラグインは、bashのスクリプトをfishで実行できるようにしてくれるものです。
私はfisherman(v3)を使ってfishのプラグインを管理しているので、以下のコマンドでインストールしました。
fisher add edc/bass
その後、config.fishに以下を追記します。
set -x PATH $PATH $HOME/.anyenv/bin
bass 'eval "$(anyenv init - bash)"'
anyenv init
の第二引数にはシェルの種類を渡すことができます。
anyenv init - bash
とすることで、bash用のイニシャライズスクリプトを吐き出させることができます。
bash用のスクリプトをbass
に渡すことで、bashスクリプトをfishで実行することが可能になります。
まとめ
おそらくanyenvのバグだと思うので、こういったハックをせずとも動くようになるといいですね。