chefやansible等が流行ったことで、rubyやpython等のインストール作業の機会が増えていますね。そこでxxxenvという、軽量で簡単に言語をインストールでき、バージョンの切り替えも簡単な仕組みがあるので、一挙にまとめてみようと思います。
インストールに纏わる様々な問題
インストールの方法は様々
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 4月 25 10:26 /home/vagrant/.phpenv drwxrwxr-x. 14 vagrant vagrant 4096 4月 25 10:48 /home/vagrant/.plenv drwxrwxr-x. 12 vagrant vagrant 4096 4月 25 09:57 /home/vagrant/.pyenv drwxrwxr-x. 12 vagrant vagrant 4096 4月 25 10:06 /home/vagrant/.rbenv
全部ホームディレクトリに .xxxenv という名前で存在します。
[vagrant@cap ~]$ ll .*env .phpenv: 合計 36 -rw-rw-r--. 1 vagrant vagrant 1058 4月 25 12:09 LICENSE -rw-rw-r--. 1 vagrant vagrant 15082 4月 25 12:09 README.md drwxrwxr-x. 2 vagrant vagrant 53 4月 25 12:09 bin drwxrwxr-x. 2 vagrant vagrant 56 4月 25 12:09 completions drwxrwxr-x. 2 vagrant vagrant 4096 4月 25 12:09 libexec drwxrwxr-x. 3 vagrant vagrant 22 4月 25 12:09 plugins drwxrwxr-x. 3 vagrant vagrant 17 4月 25 12:09 rbenv.d drwxrwxr-x. 2 vagrant vagrant 4096 4月 25 12:20 shims drwxrwxr-x. 2 vagrant vagrant 87 4月 25 12:09 src drwxrwxr-x. 3 vagrant vagrant 4096 4月 25 12:09 test -rw-rw-r--. 1 vagrant vagrant 6 4月 25 12:20 version drwxrwxr-x. 3 vagrant vagrant 18 4月 25 12:10 versions .plenv: 合計 52 -rw-rw-r--. 1 vagrant vagrant 3399 4月 25 10:42 Changes -rw-rw-r--. 1 vagrant vagrant 18359 4月 25 10:42 LICENSE -rw-rw-r--. 1 vagrant vagrant 546 4月 25 10:42 Makefile -rw-rw-r--. 1 vagrant vagrant 12243 4月 25 10:42 README.md drwxrwxr-x. 2 vagrant vagrant 31 4月 25 10:42 author drwxrwxr-x. 2 vagrant vagrant 18 4月 25 10:42 bin drwxrwxr-x. 3 vagrant vagrant 29 4月 25 10:45 build drwxrwxr-x. 2 vagrant vagrant 33 4月 25 10:45 cache drwxrwxr-x. 2 vagrant vagrant 56 4月 25 10:42 completions drwxrwxr-x. 2 vagrant vagrant 4096 4月 25 10:42 libexec drwxrwxr-x. 3 vagrant vagrant 19 4月 25 10:42 plenv.d drwxrwxr-x. 3 vagrant vagrant 23 4月 25 10:42 plugins drwxrwxr-x. 2 vagrant vagrant 4096 4月 25 10:48 shims drwxrwxr-x. 2 vagrant vagrant 19 4月 25 10:42 test -rw-rw-r--. 1 vagrant vagrant 8 4月 25 10:48 version drwxrwxr-x. 3 vagrant vagrant 20 4月 25 10:48 versions .pyenv: 合計 64 -rw-rw-r--. 1 vagrant vagrant 13406 4月 25 09:32 CHANGELOG.md -rw-rw-r--. 1 vagrant vagrant 7477 4月 25 09:32 COMMANDS.md -rw-rw-r--. 1 vagrant vagrant 1092 4月 25 09:32 LICENSE -rw-rw-r--. 1 vagrant vagrant 285 4月 25 09:32 Makefile -rw-rw-r--. 1 vagrant vagrant 13154 4月 25 09:32 README.md drwxrwxr-x. 2 vagrant vagrant 42 4月 25 09:32 bin drwxrwxr-x. 2 vagrant vagrant 56 4月 25 09:32 completions drwxrwxr-x. 2 vagrant vagrant 4096 4月 25 09:32 libexec drwxrwxr-x. 3 vagrant vagrant 42 4月 25 09:32 plugins drwxrwxr-x. 3 vagrant vagrant 17 4月 25 09:32 pyenv.d drwxrwxr-x. 2 vagrant vagrant 4096 4月 25 10:44 shims drwxrwxr-x. 2 vagrant vagrant 87 4月 25 09:32 src drwxrwxr-x. 3 vagrant vagrant 4096 4月 25 09:32 test -rw-rw-r--. 1 vagrant vagrant 6 4月 25 09:57 version drwxrwxr-x. 3 vagrant vagrant 18 4月 25 09:52 versions .rbenv: 合計 32 -rw-rw-r--. 1 vagrant vagrant 1058 4月 25 09:58 LICENSE -rw-rw-r--. 1 vagrant vagrant 15082 4月 25 09:58 README.md drwxrwxr-x. 2 vagrant vagrant 40 4月 25 09:58 bin drwxrwxr-x. 2 vagrant vagrant 56 4月 25 09:58 completions drwxrwxr-x. 2 vagrant vagrant 4096 4月 25 09:58 libexec drwxrwxr-x. 3 vagrant vagrant 23 4月 25 09:58 plugins drwxrwxr-x. 3 vagrant vagrant 17 4月 25 09:58 rbenv.d drwxrwxr-x. 2 vagrant vagrant 78 4月 25 10:44 shims drwxrwxr-x. 2 vagrant vagrant 87 4月 25 09:58 src drwxrwxr-x. 3 vagrant vagrant 4096 4月 25 09:58 test -rw-rw-r--. 1 vagrant vagrant 6 4月 25 10:06 version drwxrwxr-x. 3 vagrant vagrant 18 4月 25 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 4月 25 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)
- 作者: 吉羽龍太郎,安藤祐介,伊藤直也,菅井祐太朗,並河祐貴
- 出版社/メーカー: 技術評論社
- 発売日: 2014/05/22
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (19件) を見る
入門Chef Solo - Infrastructure as Code
- 作者: 伊藤直也
- 出版社/メーカー: 伊藤直也
- 発売日: 2013/03/11
- メディア: Kindle版
- 購入: 16人 クリック: 1,027回
- この商品を含むブログ (19件) を見る
Jenkins、Chef、Redmine、Dockerで業務効率アップ 10倍速の開発・運用ツール (日経BPムック)
- 作者: 日経SYSTEMS
- 出版社/メーカー: 日経BP社
- 発売日: 2015/05/14
- メディア: ムック
- この商品を含むブログ (2件) を見る