文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

rbenv,pyenv,plenv,phpenvで統一した言語のインストールとバージョン切り替えを行う

chefやansible等が流行ったことで、rubyやpython等のインストール作業の機会が増えていますね。そこでxxxenvという、軽量で簡単に言語をインストールでき、バージョンの切り替えも簡単な仕組みがあるので、一挙にまとめてみようと思います。


f:id:treeapps:20180424102046p:plain

インストールに纏わる様々な問題

インストールの方法は様々

yumやapt-get等のパッケージマネージャからインストールするか、ソースをコンパイルしてインストールするか、シェルスクリプトからインストールするか。インストール方法は様々です。これらがバラバラだと嫌ですね。

また、言語のバージョンのアップデートをしたい時に、どうやってやったらいいのか?この言語はyumから入れたんだっけ?rpmからだっけ?コンパイルしたんだっけ?と悩みたくありませんね。

インストールした言語のバージョン切り替えの問題

バージョンの切り替えは非常に頭が痛い問題です。最新バージョンをインストールしたいけど、何か有った時元に戻したい。アンインストール→インストール、等の作業はしたくありませんね。

特にpythonのように、v2系とv3系で言語のバージョンに互換性が無い場合、両バージョンで試したくなる事もあるので、そういう時フットワークが重いと非常に非効率で煩わしいです。

初期インストールされている言語をいじりたくない

初期インストールされているものは極力さわりたくありませんね。できれば別の場所にインストールして、パスをそちらに向けて新バージョンを使いたいです。


そんな様々な問題を解決してくれる。
そう、xxxenvならね。


前置きが長ったですね。では早速各言語のxxxenvでの言語のインストールを行ってみましょう。

検証環境

Vagrant上にCentOS7をインストールし、git v2.3.5をインストールした状態で行います。

xxxenvで言語のインストール

gitが必要になる場合が多いので、インストールしておいて下さい。

ruby - rbenv

rubyの場合はruby-buildというものが別途必要になります。

# rubyenvのインストール
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
# ruby-buildのインストール
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
# .bash_profileの設定
vi ~/.bash_profile
export RBENV_HOME="$HOME/.rbenv"
export PATH="$RBENV_HOME/bin:$PATH"
eval "$(rbenv init -)"
# .bash_profileのリロード
. ~/.bash_profile
# shimsをrehash(ヘルプにinstall後に行えと書いています)
rbenv rehash
# シェル再起動
exec $SHELL -l
# 安定バージョンの一覧を表示
rbenv install -l | tr -d ' ' | egrep '^[0-9.]+$'
# バージョンを指定してインストール
rbenv install 2.2.2
# グローバル設定を確定
rbenv global 2.2.2
# バージョン確認
[vagrant@cap ~]$ ruby --version
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux]

python - pyenv

# pyenvのインストール
git clone git://github.com/yyuu/pyenv.git ~/.pyenv
# .bash_profileの設定
vi ~/.bash_profile
export PYENV_HOME="$HOME/.pyenv"
export PATH="$PYENV_HOME/bin:$PATH"
eval "$(pyenv init -)"
# .bash_profileのリロード
. ~/.bash_profile
# shimsをrehash(ヘルプにinstall後に行えと書いています)
pyenv rehash
# シェル再起動
exec $SHELL -l
# 安定バージョンの一覧を表示
pyenv install -l | tr -d ' ' | egrep '^[0-9.]+$'
# バージョンを指定してインストール
pyenv install 3.4.3
# グローバル設定を確定
pyenv global 3.4.3
# バージョン確認
[vagrant@cap ~]$ python -V
Python 3.4.3

perl - plenv

perlの場合はperl-buildというものが別途必要になります。

# plenvのインストール
git clone git://github.com/tokuhirom/plenv.git ~/.plenv
# perl-buildのインストール
git clone git://github.com/tokuhirom/Perl-Build.git ~/.plenv/plugins/perl-build/
# .bash_profileの設定
vi ~/.bash_profile
export PLENV_HOME="$HOME/.plenv"
export PATH="$PLENV_HOME/bin:$PATH"
eval "$(plenv init -)"
# .bash_profileのリロード
. ~/.bash_profile
# shimsをrehash(ヘルプにinstall後に行えと書いています)
plenv rehash
# シェル再起動
exec $SHELL -l
# 安定バージョンの一覧を表示
plenv install -l | tr -d ' ' | egrep '^[0-9.]+$'
# バージョンを指定してインストール
plenv install 5.21.11
# グローバル設定を確定
plenv global 5.21.11
# バージョン確認
[vagrant@cap ~]$ perl -v

This is perl 5, version 21, subversion 11 (v5.21.11) built for x86_64-linux

php - phpenv

phpのインストールは一筋縄ではいきません。沢山の依存ライブラリと、公式リポジトリには無いライブラリのインストールが別途必要になります。一部の依存ライブラリのためepelをインストールしています。

# phpenvのインストール
curl -L https://raw.github.com/CHH/phpenv/master/bin/phpenv-install.sh | bash
# php-buildのインストール
git clone git://github.com/CHH/php-build.git ~/.phpenv/plugins/php-build
# .bash_profileの設定
vi ~/.bash_profile
export PHPENV_HOME="$HOME/.phpenv"
export PATH="$PHPENV_HOME/bin:$PATH"
eval "$(phpenv init -)"
# .bash_profileのリロード
. ~/.bash_profile
# shimsをrehash(ヘルプにinstall後に行えと書いています)
phpenv rehash
# シェル再起動
exec $SHELL -l
# 依存ライブラリのインストール1
sudo yum install -y bison readline-devel libxslt-devel libxml2-devel libjpeg-devel libpng-devel freetype-devel
# 依存ライブラリのインストール2
sudo yum install -y epel-release
sudo yum --enablerepo=epel install -y libmcrypt-devel libtidy-devel
# 安定バージョンの一覧を表示
phpenv install -l | tr -d ' ' | egrep '^[0-9.]+$'
# バージョンを指定してインストール
phpenv install 5.6.8
# グローバル設定を確定
phpenv global 5.6.8
# バージョン確認
[vagrant@cap ~]$ php -version
PHP 5.6.8 (cli) (built: Apr 25 2015 12:17:17)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies
    with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2015, by Zend Technologies
    with Xdebug v2.3.2, Copyright (c) 2002-2015, by Derick Rethans

フォルダ構造を見てみる

[vagrant@cap ~]$ ls -lad ~/.*env
drwxrwxr-x. 12 vagrant vagrant 4096  425 10:26 /home/vagrant/.phpenv
drwxrwxr-x. 14 vagrant vagrant 4096  425 10:48 /home/vagrant/.plenv
drwxrwxr-x. 12 vagrant vagrant 4096  425 09:57 /home/vagrant/.pyenv
drwxrwxr-x. 12 vagrant vagrant 4096  425 10:06 /home/vagrant/.rbenv

全部ホームディレクトリに .xxxenv という名前で存在します。

[vagrant@cap ~]$ ll .*env
.phpenv:
合計 36
-rw-rw-r--. 1 vagrant vagrant  1058  425 12:09 LICENSE
-rw-rw-r--. 1 vagrant vagrant 15082  425 12:09 README.md
drwxrwxr-x. 2 vagrant vagrant    53  425 12:09 bin
drwxrwxr-x. 2 vagrant vagrant    56  425 12:09 completions
drwxrwxr-x. 2 vagrant vagrant  4096  425 12:09 libexec
drwxrwxr-x. 3 vagrant vagrant    22  425 12:09 plugins
drwxrwxr-x. 3 vagrant vagrant    17  425 12:09 rbenv.d
drwxrwxr-x. 2 vagrant vagrant  4096  425 12:20 shims
drwxrwxr-x. 2 vagrant vagrant    87  425 12:09 src
drwxrwxr-x. 3 vagrant vagrant  4096  425 12:09 test
-rw-rw-r--. 1 vagrant vagrant     6  425 12:20 version
drwxrwxr-x. 3 vagrant vagrant    18  425 12:10 versions

.plenv:
合計 52
-rw-rw-r--. 1 vagrant vagrant  3399  425 10:42 Changes
-rw-rw-r--. 1 vagrant vagrant 18359  425 10:42 LICENSE
-rw-rw-r--. 1 vagrant vagrant   546  425 10:42 Makefile
-rw-rw-r--. 1 vagrant vagrant 12243  425 10:42 README.md
drwxrwxr-x. 2 vagrant vagrant    31  425 10:42 author
drwxrwxr-x. 2 vagrant vagrant    18  425 10:42 bin
drwxrwxr-x. 3 vagrant vagrant    29  425 10:45 build
drwxrwxr-x. 2 vagrant vagrant    33  425 10:45 cache
drwxrwxr-x. 2 vagrant vagrant    56  425 10:42 completions
drwxrwxr-x. 2 vagrant vagrant  4096  425 10:42 libexec
drwxrwxr-x. 3 vagrant vagrant    19  425 10:42 plenv.d
drwxrwxr-x. 3 vagrant vagrant    23  425 10:42 plugins
drwxrwxr-x. 2 vagrant vagrant  4096  425 10:48 shims
drwxrwxr-x. 2 vagrant vagrant    19  425 10:42 test
-rw-rw-r--. 1 vagrant vagrant     8  425 10:48 version
drwxrwxr-x. 3 vagrant vagrant    20  425 10:48 versions

.pyenv:
合計 64
-rw-rw-r--. 1 vagrant vagrant 13406  425 09:32 CHANGELOG.md
-rw-rw-r--. 1 vagrant vagrant  7477  425 09:32 COMMANDS.md
-rw-rw-r--. 1 vagrant vagrant  1092  425 09:32 LICENSE
-rw-rw-r--. 1 vagrant vagrant   285  425 09:32 Makefile
-rw-rw-r--. 1 vagrant vagrant 13154  425 09:32 README.md
drwxrwxr-x. 2 vagrant vagrant    42  425 09:32 bin
drwxrwxr-x. 2 vagrant vagrant    56  425 09:32 completions
drwxrwxr-x. 2 vagrant vagrant  4096  425 09:32 libexec
drwxrwxr-x. 3 vagrant vagrant    42  425 09:32 plugins
drwxrwxr-x. 3 vagrant vagrant    17  425 09:32 pyenv.d
drwxrwxr-x. 2 vagrant vagrant  4096  425 10:44 shims
drwxrwxr-x. 2 vagrant vagrant    87  425 09:32 src
drwxrwxr-x. 3 vagrant vagrant  4096  425 09:32 test
-rw-rw-r--. 1 vagrant vagrant     6  425 09:57 version
drwxrwxr-x. 3 vagrant vagrant    18  425 09:52 versions

.rbenv:
合計 32
-rw-rw-r--. 1 vagrant vagrant  1058  425 09:58 LICENSE
-rw-rw-r--. 1 vagrant vagrant 15082  425 09:58 README.md
drwxrwxr-x. 2 vagrant vagrant    40  425 09:58 bin
drwxrwxr-x. 2 vagrant vagrant    56  425 09:58 completions
drwxrwxr-x. 2 vagrant vagrant  4096  425 09:58 libexec
drwxrwxr-x. 3 vagrant vagrant    23  425 09:58 plugins
drwxrwxr-x. 3 vagrant vagrant    17  425 09:58 rbenv.d
drwxrwxr-x. 2 vagrant vagrant    78  425 10:44 shims
drwxrwxr-x. 2 vagrant vagrant    87  425 09:58 src
drwxrwxr-x. 3 vagrant vagrant  4096  425 09:58 test
-rw-rw-r--. 1 vagrant vagrant     6  425 10:06 version
drwxrwxr-x. 3 vagrant vagrant    18  425 10:01 versions

各フォルダの中身も似通っています。

別versionのinstallと切り替え

全部同じやり方でできるので、ここではpythonでやってみましょう。先ほど最新のv3系をインストールしたので、別途2系をインストールし、2系をグローバルに設定してみます。

バージョン2系を別途インストールして2系に切り替える
# 現在インストール済みのバージョンを確認
[vagrant@cap ~]$ pyenv versions
  system
* 3.4.3 (set by /home/vagrant/.pyenv/version)
# 2系の最新バージョンを確認
pyenv install -l | tr -d ' ' | egrep '^[0-9.]+$'
# 2.7.9が2系の最新版なのでインストール
pyenv install 2.7.9
# インストールされた一覧を表示
[vagrant@cap ~]$ pyenv versions
  system
  2.7.9
* 3.4.3 (set by /home/vagrant/.pyenv/version)
# グローバル設定を確定
pyenv global 2.7.9
# 再度インストールされたバージョンを確認
[vagrant@cap ~]$ pyenv versions
  system
* 2.7.9 (set by /home/vagrant/.pyenv/version)
  3.4.3
# バージョン確認
[vagrant@cap ~]$ python -V
Python 2.7.9

アンインストール

先ほどインストールしたv2系が不要になったので、アンインストールしてみます。

# 現在インストール済みのバージョンを確認
[vagrant@cap ~]$ pyenv versions
  system
* 2.7.9 (set by /home/vagrant/.pyenv/version)
  3.4.3
# バージョンを指定してアンインストール
[vagrant@cap ~]$ pyenv uninstall 2.7.9
pyenv: remove /home/vagrant/.pyenv/versions/2.7.9? y
# .pyenv/versions の中身を確認
[vagrant@cap ~]$ ll ~/.pyenv/versions
drwxr-xr-x. 6 vagrant vagrant 52  425 09:54 3.4.3
# 現在インストール済みのバージョンを確認
[vagrant@cap ~]$ pyenv versions
pyenv: version `2.7.9' is not installed
  system
  3.4.3
# グローバル設定を確定
pyenv global 3.4.3
# 現在インストール済みのバージョンを確認
[vagrant@cap ~]$ pyenv versions
  system
* 3.4.3 (set by /home/vagrant/.pyenv/version)
# バージョン確認
[vagrant@cap ~]$ python -V
Python 3.4.3

アンインストール時は「2.7.9削除するぞ?いいか?」と対話式で聞いてきました。

また、現在グローバル設定中のバージョンを削除すると、pyenv versionsした時に「2.7.9はインストールされてないよ」と警告が表示されました。

アンインストール後に物理ファイルはどうなっているかと確認すると、pyenv/versions配下にインストールされていた2.7.9フォルダがごっそり削除されており、非常にシンプルな構造・挙動である事が解りますね。

雑感

大体同じやり方で言語のインストールができ、インストール済みのバージョン一覧も確認でき、バージョン切り替えもアンインストールも同じやり方で行えちゃいます。これは非常に便利ですね。

node.js・io.jsをnvmでインストールするような感じですが、xxxenvとはコマンドやオプションが異なるので、いちいちhelp確認したいと覚えられません。

ちなみにjavaにはjavaenvはありません。alternativesという仕組みで切り替えるのですが、仕組みとしては大分古いです。


しかしですねえ・・・・


phpのインストールは大変でした。依存ライブラリでエラーが大量発生して、phpをぶっ◯ろしたくなりました。

その依存ライブラリの一部が公式repoに含まれてないっていうね・・・もうね・・・

Chef実践入門 ~コードによるインフラ構成の自動化 (WEB+DB PRESS plus)

Chef実践入門 ~コードによるインフラ構成の自動化 (WEB+DB PRESS plus)

入門Chef Solo - Infrastructure as Code

入門Chef Solo - Infrastructure as Code