扱う言語も増え,**env 系ツールを一括管理したいなと思い,anyenv を導入することにしました。 本記事では,anyenv の導入手順と,それを用いた環境構築手順を紹介します。

実行環境 : macOS Mojave (Version 10.14.4)

目次

anyenv とは

Linux において,複数のバージョンの実行環境を管理するツールとして,**env (pyenv, goenv, etc.) があります。 この **env を一元管理するツールが anyenv です。

手順

インストール

Git を用いてインストールします。

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

セットアップ

.bashrc (Zsh なら .zshrc) に以下を追記します。

export ANYENV_ROOT="$HOME/.anyenv"
export PATH="$ANYENV_ROOT/bin:$PATH"
eval "$(anyenv init -)"

次に,この変更をシェルに適用させましょう。

$ source ~/.bashrc # Zsh なら .zshrc

**env をインストール

インストール可能な **env を確認します。

$ anyenv install -l
  crenv
  ...
  goenv
  ...
  pyenv
  ...
  swiftenv

今回は,goenv と pyenv をインストールします。

$ anyenv install goenv
$ anyenv install pyenv

インストールした goenv と pyenv を有効化します。

$ eval "$(anyenv init -)"

goenv を用いて Go をインストール

インストール可能なバージョンを確認します。

$ goenv install -l
Available versions:
  1.2.2
  1.3.0
  ...
  1.12.1

ここでは 1.12.1 をインストールします。

$ goenv install 1.12.1
Downloading go1.12.1.darwin-amd64.tar.gz...
-> https://dl.google.com/go/go1.12.1.darwin-amd64.tar.gz
Installing Go Darwin 64bit 1.12.1...
Installed Go Darwin 64bit 1.12.1 to /Users/[アカウント名]/.anyenv/envs/goenv/versions/1.12.1

インストールした 1.12.1 をグローバルに設定します。

$ goenv global 1.12.1
$ goenv rehash 1.12.1

pyenv を用いて Python をインストール

goenv と同様にしてインストール(ここでは 3.7.3)しようとすると,以下のエラーが発生します。

$ pyenv install 3.7.3
  ...
  zipimport.ZipImportError: can't decompress data; zlib not available
  make: *** [install] Error 1

macOS Mojave の場合,xcode-select の最新バージョン(2354)に Mojave 用の macOS SDK header がデフォルトで入っていないため,マニュアルでインストールする必要があるようです。

$ sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /

次にインストールコマンドを実行すると,きちんと成功します。

$ pyenv install 3.7.3
Downloading openssl-1.1.0j.tar.gz...
-> https://www.openssl.org/source/openssl-1.1.0j.tar.gz
Installing openssl-1.1.0j...
Installed openssl-1.1.0j to /Users/[アカウント名]/.anyenv/envs/pyenv/versions/3.7.3

Downloading readline-8.0.tar.gz...
-> https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz
Installing readline-8.0...
Installed readline-8.0 to /Users/[アカウント名]/.anyenv/envs/pyenv/versions/3.7.3

Downloading Python-3.7.3.tar.xz...
-> https://www.python.org/ftp/python/3.7.2/Python-3.7.3.tar.xz
Installing Python-3.7.3...
Installed Python-3.7.3 to /Users/[アカウント名]/.anyenv/envs/pyenv/versions/3.7.3

インストールした 3.7.3 をグローバルに設定します。

$ pyenv global 3.7.3
$ pyenv rehash

所感

anyenv の初期化には結構時間がかかります。 計測してみたら,2.5 秒近くかかってますね。(マシンスペックが貧弱なせいかもしれませんが。。。)

$ time (eval "$(anyenv init -)")
( eval "$(anyenv init -)"; )  0.41s user 0.66s system 44% cpu 2.414 total

シェルを起動するたびにこんなに時間がかかるのはさすがに勘弁してほしいので,以下のような工夫をすると良いかもしれません。

  • --no-rehash オプションを付ける
  • anyenv init - の出力をファイルに書き出し直接読み込む

上記のような欠点?はあるかもしれないが,やはり **env 一元管理出来る点は非常に魅力的だと感じました。 ひとまずは使っていこうかなと思います。