Posted at

direnvからSCLを利用する

More than 3 years have passed since last update.


はじめに:SCLの説明と利用方法

RHELや、CentOSなどのRHELクローンは標準リポジトリから提供される一部のパッケージのバージョンが古いことで知られるが、しばらく前よりSoftware Collections(SCL)リポジトリから標準リポジトリよりは多少新しいバージョンのパッケージが提供されるようになった。

SCLから提供されるバイナリは最新というわけではないが、公式に提供されyumでインストールできるので利用はし易いだろう。

CentOSでは6および7のx86_64版でSCLリポジトリを利用することができる。

SCLリポジトリから供給されるパッケージは標準のものとは違うディレクトリ/opt/rhにインストールされ、scl enableコマンドなどで環境変数を切り替えることにより利用する形を採る。

例えばPython 3.4は以下のようにインストールする。

# yum install centos-release-scl

# yum install rh-python34

rh-python34はパッケージ名だが、SCLの場合特にコレクション名と呼んだりする。

インストールしているコレクション名の一覧は「scl -l」で取得できる。

また、SCLパッケージのインストール先は"/opt/rh/(コレクション名)"である。

環境変数を切り替えてコマンドを実行するには「scl enable (コレクション名) (実行したいコマンド)」とする。

$ scl enable rh-python34 'python -V' # 環境変数を切り替えてコマンドを実行する

Python 3.4.2
$ scl enable rh-python34 bash # 環境変数を切り替えたbashを起動して実行しても良い
$ python -V
Python 3.4.2

大元のシェル起動時からSCLから提供されるバイナリを使用したい場合は、 https://access.redhat.com/solutions/527703 に書かれている通り「source scl_source enable (コレクション名)」を/etc/profile.d内のシェルスクリプトから呼び出すようにしておけば良い。

# cat <<EOD > /etc/profile.d/enablepython34.sh

#!/bin/bash
source scl_source enable rh-python34
EOD

source scl_source enableコマンドはその場で環境変数を切り替えるのにも使用できる。

$ source scl_source enable rh-python34

$ python -V
Python 3.4.2

scl enableコマンドやsource scl_source enableコマンドがセットする環境変数は以下である。


  • /opt/rh/(コレクション名)/enable に書かれたもの

  • X_SCLS(値はコレクション名)

なお、複数のSCLリポジトリからのパッケージをインストールしている場合、複数回scl enableコマンドやsource scl_source enableコマンドを実行すれば、実行したすべての分使用可能となるような仕組みになっているようだ。


direnvからSCLを利用する

SCLの利用方法が上記の通り環境変数を用いるものであるため、cdなど(pushdやautojumpなどでも良い)で特定のディレクトリに入った時に環境変数をセットし、出た時に環境変数をアンセットして元に戻してくれるdirenvとSCLとは相性が良い。

direnvのインストール。

# curl -L https://github.com/direnv/direnv/releases/download/v2.6.0/direnv.linux-amd64 -o /usr/sbin/direnv

# chmod +x /usr/sbin/direnv

direnvを使用したいユーザは、bashでcd等をフックさせるために.bashrcに以下のように1行を追加してやる必要がある。bash以外にもzsh, fish, tcshで似た方法で利用できる。

$ echo 'eval "$(direnv hook bash)"' >> $HOME/.bashrc

追加した行を反映させるため「exec bash -l」を実行しておく。

(一旦ログアウトしてログインし直す、とかでも良いが)

ディレクトリを作ってdirenvにセットさせたい環境変数などを"(ディレクトリ)/.envrc"に書いて「direnv allow (ディレクトリ名)」するとdirenvの準備完了である。

ここでは環境変数のセットに前述のsource scl_source enableコマンドを使用してやれば良い。

$ mkdir p34

$ cat <<EOD > p34/.envrc
source scl_source enable rh-python34
layout python3 /opt/rh/rh-python34/root/usr/bin/python
EOD
$ direnv allow p34

ちなみに、layoutで呼んでいるpythonバイナリのあるディレクトリ /opt/rh/rh-python34/root/usr/bin/ は /opt/rh/rh-python34/root/bin/ にシンボリックリンクが張られているが、includeディレクトリを../includeで探しているっぽく前者で指定しないとエラーになった。

(つまり、 /opt/rh/rh-python34/root/usr/include/ は /opt/rh/rh-python34/root/include/ にシンボリックリンクがないのである)

ディレクトリに出入りすればこの通り、想定通りに動いてくれる。

$ python -V

Python 2.7.5
$ cd p34
direnv: loading .envrc
Already using interpreter /opt/rh/rh-python34/root/usr/bin/python3
Using base prefix '/opt/rh/rh-python34/root/usr'
New python executable in /home/test1/p34/.direnv/python-3.4.2/bin/python3
Also creating executable in /home/test1/p34/.direnv/python-3.4.2/bin/python
Installing setuptools, pip...done.
direnv: export +LD_LIBRARY_PATH +MANPATH +PKG_CONFIG_PATH +VIRTUAL_ENV +XDG_DATA_DIRS +X_SCLS ~PATH
$ python -V
Python 3.4.2
$ cd
direnv: unloading
$ python -V
Python 2.7.5