あるプロジェクトではNode.jsを使い、別のプロジェクトではPythonを使う…。最近の開発では、異なる言語を行き来するのが当たり前になってきました😫。目的に応じて最適な言語を選びたいものですが、それに伴う「環境管理の悩み」も増えてきます。
例えば…
例えば、こんな悩みがありませんか?
- 「このプロジェクトはPython 3.8だけど、あっちは3.10じゃないと動かない…」 😩:プロジェクトごとにバージョンが違うと、切り替えが面倒!
- 「pyenv、nodenv、rbenv…管理ツールが多すぎる!」 😵:言語ごとに別の管理ツールを入れると、設定や更新が大変。
- 「あれ?このコマンドはpyenvだっけ?nodenvだっけ?」 🤔:ツールごとに微妙に違うコマンドを覚えるのも一苦労。
更に、新しいパソコンを買ったときやチームで開発環境を揃えようとすると、この悩みがさらに大きくなります💦
anyenvとは何か
調べてみると、anyenvがこの問題を解決してくれそうでした。
anyenvには、開発環境を快適にする魅力がたくさんあります。
- 【一元管理が可能】 Python用のpyenv、Node.js用のnodenvなど、言語ごとの環境管理ツールを一つにまとめられます。
- 【統一されたコマンド体系】 すべての言語環境を、似たようなコマンドで操作できるので、覚えることが少なくなります。
- 【簡単に追加できる】 「あ、このプロジェクトでPHPが必要になった!」そんなときも、anyenv経由で**phpenv**を簡単に追加できます。
- 【まとめて更新できる】 全ての*envツールを一度に更新できるので、メンテナンスが楽チン😊
anyenvを使用することで、複数言語を扱う日々の開発がスムーズになりそうです。
anyenvの基本
anyenvの仕組み
anyenvは、さまざまな言語用の*envツールを一元管理するためのフレームワークですが、具体的にどんな仕組みで動いているのでしょうか?
anyenvの仕組みは実はシンプルです。anyenvは上位のバージョンマネージャとして各言語のバージョン管理ツール(pyenv、nodenvなど)をインストールして管理します。これらのツールは共通の設計思想に基づいているため、一元管理が可能になっています。
anyenvはインストールすると、~/.anyenv/envs/ というディレクトリが作成され、ここに各言語の*envツールがインストールされます。ディレクトリツリー構造としては以下のようになっています。
~/.anyenv/
└── envs/
├── pyenv/ # Pythonのバージョン管理
└── nodenv/ # Node.jsのバージョン管理
anyenvのインストール後、各ツールへのパスを設定することで、各言語の管理が可能になります。
*envツールとの関係性
anyenvはこれらの各言語の管理ツール(以降*envとします)を内包しているわけではなく、それぞれを別個にインストールして管理するためのフレームワークとなっています。
そのため、anyenvをインストールした後は、anyenv install pyenvのようなコマンドで必要な*envツールを追加できます。
主要な機能と特徴
anyenvには、開発環境を容易にする様々な機能があります。
一貫したインターフェース: すべての*envツールに対して同じコマンド体系を使用できます。例えば、どの言語でも
xxx installでバージョンをインストールし、xxx globalでグローバルバージョンを設定できます。プラグインシステム: anyenv-updateなどのプラグインを追加して機能を拡張できます。例えば…
- anyenv-update: すべての*envツールを一度に更新できる
- anyenv-git: Gitリポジトリ内で自動的に言語バージョンを切り替える
ローカルバージョン管理:
.python-versionや.node-versionなどを使用することで、プロジェクトごとにバージョンを指定する事が可能にです
このようにして、anyenvを使うことで、複数の言語環境を使う開発者は環境管理の煩わしさから解放され、実際のコーディングに集中できるようになります。
anyenvのセットアップ
anyenvのインストールはとても簡単です。基本的には、GitHubリポジトリをクローンし、PATHを設定するだけで使えるようになります。
事前設定
anyenvそのもののインストールには関係ありませんが、以下のインストールを行わないと管理下にあるpyenvなどを動作できないので必ずインストールをしてください。
$ sudo apt update $ sudo apt install -y build-essential # pyenv使用時には以下も必要 $ sudo apt install -y build-essential libssl-dev zlib1g-dev libbz2-dev \ libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev \ libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev \ python3-openssl libssl-dev libbz2-dev libffi-dev liblzma-dev \ libncursesw5-dev libsqlite3-dev libdb-dev libgdbm-dev libnss3-dev \ libexpat1-dev libpcre3-dev python3-dev
Gitでanyenvをクローン
https://github.com/anyenv/anyenv?tab=readme-ov-file#manual-git-checkout
まず、anyenvのリポジトリをホームディレクトリにクローンします。
$ git clone https://github.com/anyenv/anyenv ~/.anyenv

これで、~/.anyenvフォルダにanyenvがインストールされました 🙌

PATHの設定
次に、anyenvを使えるようにするため、PATHを設定します。以下のコマンドを実行して、シェル設定ファイル(.bashrc、.zshrc、.bash_profileなど)に設定を追加してください。WSLの場合には.bashrcが良かったようです。[設定の参照] (GitHub - anyenv/anyenv: All in one for **env)
$ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.bashrc $ echo 'eval "$(anyenv init -)"' >> ~/.bashrc
その後、設定を反映するために以下のコマンドを実行してください。
$ source ~/.bashrc # または ~/.bash_profileや~/.zshrc など
初期化
インストールと設定が完了したら、次のコマンドでanyenvを初期化します。
$ anyenv install --init
このコマンドを実行すると、必要なディレクトリが作成され、anyenvが使用可能になります。途中で「自動的にマニフェストディレクトリをセットアップしますか?(英語です)」と質問されたら、yを入力します。

これで、anyenvのセットアップは完了です。動作確認のため、次のコマンドを実行します。
$ anyenv --version

バージョン情報の表示されれば、インストールは成功です。
対応しているツールは以下のようになっています。

既存の*envツールからの移行
すでにpyenvなどを使用している場合はどうすればいいでしょうか?筆者もpyenvを導入していたため、移行を検討しました。
移行手順
1. 既存の設定のバックアップ
まず、現在の*envディレクトリをバックアップします。 例えば、pyenvの場合は次のコマンドを実行します。
例えばpyenvの場合には…
$ cp -r ~/.pyenv ~/.pyenv.bak
2. PATH設定の修正
.bashrcや.zshrcなどの設定ファイルから、既存の*env関連の記述をコメントアウトまたは削除します。
例えば、pyenvの場合は以下の行を対象にします。
# 以下の行をコメントアウトまたは削除 # export PATH="$HOME/.pyenv/bin:$PATH" # eval "$(pyenv init -)"
3. anyenvのインストールと初期化
前述の方法でanyenvをインストールして初期化まで行います。
既存の*envツールをそのまま利用するか、新しくインストールするかの2つの選択肢があります。
- 方法1: 既存ディレクトリを移動して使用
$ mv ~/.pyenv ~/.anyenv/envs/pyenv
- 方法2: クリーンインストール
# 既存の環境を削除または退避
$ mv ~/.pyenv ~/.pyenv.old
# anyenv経由で新しくインストール
$ anyenv install pyenv

4. シェルの再起動
設定を適用するため、次のコマンドを実行してください。あるいは新しくシェルを開き直すことでも同様です。
$ exec $SHELL -l
5. 動作確認
移行が正しく完了したかを確認するため、次のコマンドを実行します。
$ pyenv --version

移行時の注意点
- インストール済みの言語バージョン:方法1で移行した場合、既存の言語バージョンはそのまま使えます。方法2では再インストールが必要です。
- バージョン設定ファイル:プロジェクトディレクトリにある
.python-versionなどの設定ファイルは、anyenv経由でも正しく認識されます。 - プラグイン:*envツールのプラグインを使用している場合は、そちらも移行しましょう。
既存環境からの移行は、慎重に!重要なプロジェクトがある場合は、移行前にバックアップを取っておくことをお忘れなく!
以上で、anyenvのセットアップは完了です。
anyenv環境下での活用について
つづいてanyenvを使って実際に各言語環境をセットアップする方法を確認します。(どちらかというと*envの使用方法担ってます。)
グローバル設定とローカル設定
anyenvでは、複数のレベルでバージョン設定が可能です。
1. グローバル
システム全体のデフォルトバージョン
# pyenv install 3.10.4 でインストールを行った前提で $ pyenv global 3.10.4
2. ローカル
特定のディレクトリとその下のサブディレクトリで有効なバージョン
# pyenv install 3.8.12 でインストールを行った前提で $ pyenv local 3.8.12
3. シェル
現在のシェルセッションのみで有効なバージョン
# pyenv install 3.9.10 でインストールを行った前提で $ pyenv shell 3.9.10
これらのオプションは優先順位があり、シェル > ローカル > グローバルの順で適用されます。個人的にはローカル・グローバルあたりを使用する形かなとは思います。
プロジェクト別のバージョン管理
anyenvは異なる言語バージョンを簡単に切り替えられる点が非常に助かる機能です。
ローカルバージョンの設定
特定のディレクトリで使用する言語バージョンを指定するには、localコマンドを使います。
# Pythonの場合 pyenv install 3.9.10 でインストールを行った前提で $ cd ~/projects/my-python-project $ pyenv local 3.9.10 # Node.jsの場合 nodenv install 16.14.2 でインストールを行った前提で $ cd ~/projects/my-node-project $ nodenv local 16.14.2


これらのコマンドを実行すると、それぞれのディレクトリに.python-versionや.node-versionというファイルが作成されます。これらのファイルには指定したバージョン番号が記録され、そのディレクトリに入ると自動的にバージョンが切り替わります。
グローバルバージョンの設定
システム全体のデフォルトとして使用する言語バージョンを指定するには、globalコマンドを使います。
# Pythonの場合 pyenv install 3.9.10 でインストールを行った前提で $ pyenv global 3.9.10 # Node.jsの場合 nodenv install 16.14.2 でインストールを行った前提で $ nodenv global 16.14.2
グローバル設定を行うと、特定のディレクトリでローカル設定がされていない限り、システム全体でこのバージョンが使用されます。この設定は、anyenvの管理ディレクトリ(通常は~/.anyenv/envs/pyenv/versionや~/.anyenv/envs/nodenv/version)にバージョン番号を記録したファイルとして保存されます。
バージョン確認方法
現在使用しているバージョンを確認するには:
# Pythonの場合 $ pyenv version # Node.jsの場合 $ nodenv version
設定されているすべてのバージョン(global, local, shell)を確認するには以下のように実行します。。
$ pyenv versions $ nodenv versions
複数バージョンの同時指定
pyenvでは、複数のバージョンを同時に指定することも可能です:
$ pyenv global 3.10.4 2.7.18
この場合、最初に指定したバージョン(3.10.4)がpythonコマンドとして使用され、2番目に指定したバージョン(2.7.18)はpython2やpython2.7として使用できます。
anyenvのメリットとデメリット
とても便利なanyenvですがメリットとデメリットが存在します。
長所と短所の比較
| 長所 | 短所 |
|---|---|
| 一元管理 - 複数の言語環境バージョン管理ツールを一箇所で管理可能 | 追加の抽象レイヤー - デバッグが複雑になることがある |
| 統一されたインターフェース - すべての*envツールで同じコマンド体系 | 初期設定の手間 - 最初のセットアップに時間がかかる |
| 環境の分離 - プロジェクトごとに異なるバージョンを使用可能 | パフォーマンスへの影響 - シェルの起動時間がわずかに遅くなる可能性 |
| 導入の簡易さ - 新しい言語環境を簡単に追加できる | 依存関係 - 各*envツールの依存パッケージをインストールする必要がある |
| シンプルな更新管理 - 全ての*envツールを一度に更新可能 | バージョン不一致の可能性 - 最新の*envツールがすぐに利用できないことがある |
単独*envツールとの比較
| 観点 | anyenv | 単独*env |
|---|---|---|
| セットアップの手軽さ | 初期設定は少し複雑だが、追加言語は簡単 | 最初は簡単だが、複数言語になると管理が複雑に |
| 更新管理 | 一括更新が可能 | 個別に更新が必要 |
| パフォーマンス | わずかに遅くなる可能性あり | 直接実行でわずかに速い |
| 学習コスト | 最初は高いが長期的には低減 | 言語ごとに異なるコマンドを覚える必要あり |
| 適した用途 | 複数言語を扱う開発者向け | 単一言語のみを使う開発者向け |
複数の言語環境を扱う開発者にとっては、anyenvの長所が際立ちますが、単一の言語しか使わない場合には、直接その言語専用の環境管理ツールを使用する方がシンプルかもしれません。
おわりに
プログラミングする場合、anyenvはとても便利です。
例えば…
- 異なるバージョンの言語を試してみたいとき
- 新しい言語に挑戦するとき
- 古いバージョンに依存するチュートリアルを試すとき
自分の開発環境を汚すことなく、様々な環境を試せます。
また、チーム開発する場合、複数人でのプロジェクト開発でも環境の統一が重要になるのでこんな場面でも便利です。
.python-versionや.node-versionファイルをリポジトリに含めることで、チームメンバー全員が同じバージョンを使用できる- 新しいメンバーも、Gitクローンを行うことすぐ環境を整えて開発を始められる
今回anyenvを試してみて多言語の環境が快適になりました! 💪😎