TES Blog

株式会社テクニカルエンジニアリングサポートに所属する社員が、自身が携わるテクノロジーやイベントに関する情報を発信しています。

fish shell と anyenv で楽にマルチ開発環境を整えよう for Mac

こんにちは。
Web エンジニアの Hayato Yamashita です。

昨今、Docker が大きな盛り上がりを見せており、ネイティブな開発環境を整える機会が少なくなってきました。

少なくなってきましたが、まだあります。

そんな Docker を使わない/使えない場合に備えて、ネイティブでマルチな開発環境を楽に整えるため、fish shell と anyenv の導入方法について紹介します。

本記事のポイント

fish shell で anyenv を使うにあたって、公式サイトに書いてある導入方法は bash や zsh 向けになっています。

そのため、一部書き方が異なっていて詰まってしまう可能性があります。

本記事では、そうしたところで詰まらないよう動作確認した上でのコマンド、設定内容を記載していますので、参考にしてください。

fish shell とは

bash や zsh に並ぶ、コマンドラインシェルを扱うためのツールです。

fishshell.com

個人的な感想ですが、以前は bash を使っていたところ、コマンドラインシェルを使う頻度が上がってくるにつれ、辛く感じるようになってきました。

最低限のことができる bash ではあるのですが、高機能にしたければ、しっかりカスタマイズしないといけません。
しかし、カスタマイズしすぎると環境が汚れていく感じがしましたし、あとみんな高機能なコマンドラインシェルを使っているのに「俺だけ bash か……」という感覚が辛かったです。笑

移行先として代表的なのは zsh ですが、高機能ではあるものの、細く大量の設定が必要そうで、なかなか手が出ませんでした。

そこで手を出したのが fish shell です。

非常に簡単な設定のみで高機能なコマンドラインシェルの恩恵を受けられるので、とても便利でした。

anyenv とは

rbenv を代表とする、*env をまとめて扱うための env です。
ゲシュタルト崩壊しそうですね。

github.com

各プログラミング言語のバージョン管理をする *env は大変便利なのですが、1つの言語に対して複数のツールが用意されていることがあり、どれを使うか迷うことがあります。

具体的には、以下のような感じです。

  • Node.js のためのバージョン管理ツールは ndenv や nodenv などがある
  • PHP のためのバージョン管理ツールは phpbrew や phpenv などがある
  • Ruby のためのバージョン管理ツールは rvm や rbenv などがある

*env だったり *vm だったり *brew だったりするので、どの言語がどの suffix で管理していたのか忘れてしまうことがありそうです。

また、複数案件を掛け持ちする場合、言語ごとに *env を導入するので、環境が煩雑になりがちです。

そこで便利なのが anyenv。

上記のような言語のバージョン管理ツールを *env で統一し、それらのバージョン管理をするためのツールになっています。

2018年10月現在、anyenv では以下の *env ツールが扱えます。

Available **envs:
  Renv
  crenv
  denv
  erlenv
  exenv
  goenv
  hsenv
  jenv
  luaenv
  ndenv
  nenv
  nodenv
  phpenv
  plenv
  pyenv
  rbenv
  sbtenv
  scalaenv
  swiftenv

fish shell の導入

前提条件

  • macOS High Sierra 10.13.6
  • Homebrew をインストール済み

インストール

以下のコマンドで簡単にインストールできます。
楽ですね。

brew install fish

インストール先の確認

インストール後、fish shell のインストール先を確認します。

この後、fish shell を扱えるよう /etc/shells に対して追記するために必要な情報です。
Homebrew でインストールしたので、大体は /usr/local/bin/fish のはずです。

which fish

/etc/shells に追記

fish shell を扱えるように、以下のコマンドを実行し、先ほど取得した fish shell の実行ファイル PATH を追記します。
パスワードを聞かれると思いますので、管理者ユーザのパスワードを入力してください。

sudo -e /etc/shells

デフォルトのコマンドラインシェルに設定

デフォルトのコマンドラインシェルを fish shell に変更するため、以下のコマンドを実行します。
ここでもパスワードを聞かれると思いますので、管理者ユーザのパスワードを入力してください。

chsh -s /usr/local/bin/fish

以下のようなメッセージが出てきたら、無事に fish shell を扱えるようになります。

Changing shell for hayato-yamashita.

fish shell のカスタマイズ方法などは公式サイトなどをご覧ください。
本記事では、続いて anyenv の導入に移ります。

anyenv の導入

前提条件

  • macOS High Sierra 10.13.6
  • git をインストール済み

インストール

以下のコマンドで簡単にインストールできます。
こちらも楽ですね。

git clone https://github.com/riywo/anyenv ~/.anyenv

anyenv の PATH を通す

次に anyenv の PATH を通すため、以下のコマンドを実行して、fish shell の config に追記してください。
fish shell の config の場所が違うようであれば、適宜読み替えてくださいね。

echo 'set -x PATH $HOME/.anyenv/bin $PATH' >> .config/fish/config.fish
exec fish -l

anyenv のサイトに書いてあるコマンドとは違うので、注意してください。
fish shell 向けのコマンドに変えてあります。

各 *env のインストール

ここでは nodenv, phpenv, rbenv をインストールします。

Node.js を扱うための *env は複数ありますが、ここでは開発が活発な nodenv を対象とします。
nenv や ndenv ですと、fish shell と相性が悪く、うまく動作しない可能性がありますので、ご注意ください。

インストールは、anyenv の install コマンドを使います。

anyenv install nodenv
anyenv install phpenv
anyenv install rbenv

profile に設定を追記

各 *env のインストールが終わったので、それらを扱えるようにしましょう。

以下のコマンドを実行して、fish shell の config に追記をします。

echo 'eval (anyenv init - | source)' >> .config/fish/config.fish
exec fish -l

ここも anyenv のサイトに書いてあるコマンドとは違うので、注意してください。
fish shell 向けのコマンドに変えてあります。

インストール後の確認

以下のコマンドを実行して、インストールおよび設定反映ができたか確認しましょう。

anyenv versions

実行結果として、以下のようにインストールした各 *env の名前が表示されたら大丈夫です。

nodenv:
* system (set by ~/.anyenv/envs/nodenv/version)
phpenv:
* system (set by ~/.anyenv/envs/phpenv/version)
rbenv:
* system (set by ~/.anyenv/envs/rbenv/version)

お疲れ様でした。

これで anyenv を通して各 *env を扱えるようになりました。

あとは、各 *env で好きな言語のバージョンをインストールし、使用していただければと思います。

おわりに

以上で、fish shell と anyenv の導入は完了です。

Docker も楽ですが、使えなくてもこんな感じで開発環境の下準備ができるので楽ですね。

本記事の内容が、お役に立てれば幸いです。