同じチームの@lamanotrama さんと話していて、
これから一部パッケージはRPMを作らず、@hirose31 さんの方式
(ソースから自前ビルドしたソフトウエアの効率的な管理方法 - (ひ)メモ )
を採用するとのことで、「なるほど!!」と思いながら上記記事のはてブコメント
を眺めてたらStow というものを発見。
早速検証してみた。検証環境はCentOS 6.3です。
Stowの概要
Perlで書かれている
ソースからビルドしたソフトウェアを管理するソフト
任意のディレクトリ/usr/local/stow
などにパッケージ一式をインストール
インストールしたパッケージから/usr/lib/{bin,lib,share}
にリンクを貼って利用。
バージョンの切り替えはリンク張り直しで行う(ファイルの上書きはしない)
zsh-4.3.17
やzsh-5.0.0
などバージョンの切り替えが容易になる(同じようなソフトのpaco と違う点)
Stowの導入
epelにあるのでyum
で導入。cpanm
でも入ります。
1
sudo yum -y install stow
Stow用のディレクトリを用意
パッケージインストール用のディレクトリを作成
1
sudo mkdir -p /user/local/stow/
Stowを利用してzsh-5.0.0を導入
試しにzsh-5.0.0
を利用してみる。
configure
のときに--prefix=/usr/local/stow/zsh-5.0.0
といった感じで、
--prefix=/usr/local/stow/{name}-{version}
というような感じでインストール先を指定し、
/usr/local/stow/
以下に一式インストールする。これにより/usr/local/{bin,lib,share}
以下が汚れずに済むし、管理も楽になる。
1
2
3
4
5
6
7
8
mkdir ~/src
cd ~/src
curl -Lo zsh-5.0.0.tar.gz http://sourceforge.net/projects/zsh/files/zsh/5.0.0/zsh-5.0.0.tar.gz/download
tar zxvf zsh-5.0.0.tar.gz
cd zsh-5.0.0
./configure --prefix= /usr/local/stow/zsh-5.0.0
make
sudo make install
stow
コマンドを用いて、/usr/local/{bin,lib,share}
にsymlinkを貼る。
-v
,--verbose
をつけると詳細が見えるので良い感じです。
1
2
cd /usr/local/stow
sudo stow -v zsh-5.0.0
symlinkを貼ろうとした際に既にファイルが存在すると下記のようなエラーが発生する。
1
2
3
4
5
[ akira@dev001] $ sudo stow
WARNING! stowing bin would cause conflicts:
* existing target is neither a link nor a directory: zsh
* existing target is neither a link nor a directory: zsh-5.0.0
All operations aborted.
既存ファイルの待避。マニュアルは入らないから一式削除
1
2
3
4
5
sudo mv /usr/local/bin/zsh{ ,.org}
sudo mv /usr/local/bin/zsh-5.0.0{ ,.org}
sudo mv /usr/local/share/zsh{ ,.org}
sudo mv /usr/local/lib/zsh{ ,.org}
sudo rm -rf /usr/local/share/man/man1/zsh*
再度stow
コマンドを実行。
1
2
cd /usr/local/stow
sudo stow -v zsh-5.0.0
下記のような形でlinkが貼られる。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
LINK: bin/zsh-5.0.0 = > ../stow/zsh-5.0.0/bin/zsh-5.0.0
LINK: bin/zsh = > ../stow/zsh-5.0.0/bin/zsh
LINK: share/man/man1/zshtcpsys.1 = > ../../../stow/zsh-5.0.0/share/man/man1/zshtcpsys.1
LINK: share/man/man1/zshparam.1 = > ../../../stow/zsh-5.0.0/share/man/man1/zshparam.1
LINK: share/man/man1/zshcontrib.1 = > ../../../stow/zsh-5.0.0/share/man/man1/zshcontrib.1
LINK: share/man/man1/zshoptions.1 = > ../../../stow/zsh-5.0.0/share/man/man1/zshoptions.1
LINK: share/man/man1/zsh.1 = > ../../../stow/zsh-5.0.0/share/man/man1/zsh.1
LINK: share/man/man1/zshroadmap.1 = > ../../../stow/zsh-5.0.0/share/man/man1/zshroadmap.1
LINK: share/man/man1/zshexpn.1 = > ../../../stow/zsh-5.0.0/share/man/man1/zshexpn.1
LINK: share/man/man1/zshmisc.1 = > ../../../stow/zsh-5.0.0/share/man/man1/zshmisc.1
LINK: share/man/man1/zshzle.1 = > ../../../stow/zsh-5.0.0/share/man/man1/zshzle.1
LINK: share/man/man1/zshbuiltins.1 = > ../../../stow/zsh-5.0.0/share/man/man1/zshbuiltins.1
LINK: share/man/man1/zshcalsys.1 = > ../../../stow/zsh-5.0.0/share/man/man1/zshcalsys.1
LINK: share/man/man1/zshmodules.1 = > ../../../stow/zsh-5.0.0/share/man/man1/zshmodules.1
LINK: share/man/man1/zshcompctl.1 = > ../../../stow/zsh-5.0.0/share/man/man1/zshcompctl.1
LINK: share/man/man1/zshzftpsys.1 = > ../../../stow/zsh-5.0.0/share/man/man1/zshzftpsys.1
LINK: share/man/man1/zshcompsys.1 = > ../../../stow/zsh-5.0.0/share/man/man1/zshcompsys.1
LINK: share/man/man1/zshall.1 = > ../../../stow/zsh-5.0.0/share/man/man1/zshall.1
LINK: share/man/man1/zshcompwid.1 = > ../../../stow/zsh-5.0.0/share/man/man1/zshcompwid.1
LINK: share/zsh = > ../stow/zsh-5.0.0/share/zsh
LINK: lib/zsh = > ../stow/zsh-5.0.0/lib/zsh
ls
で/usr/local/{bin,lib,share}
を確認
1
2
3
4
5
6
7
8
9
10
11
12
13
[ akira@dev001] $ ll /usr/local/bin/ | grep zsh
lrwxrwxrwx 1 root root 25 Aug 9 12:42 zsh -> ../stow/zsh-5.0.0/bin/zsh
lrwxrwxrwx 1 root root 31 Aug 9 12:42 zsh-5.0.0 -> ../stow/zsh-5.0.0/bin/zsh-5.0.0
-rwxr-xr-x 1 root root 690064 Jul 23 11:00 zsh-5.0.0.org
-rwxr-xr-x 1 root root 687144 Mar 29 13:06 zsh.old
[ akira@dev001] $ ll /usr/local/lib/ | grep zsh
lrwxrwxrwx 1 root root 25 Aug 9 12:42 zsh -> ../stow/zsh-5.0.0/lib/zsh
drwxr-xr-x 4 root root 4096 Jul 23 11:00 zsh.org
[ akira@dev001] $ ll /usr/local/share | grep zsh
lrwxrwxrwx 1 root root 27 Aug 9 12:42 zsh -> ../stow/zsh-5.0.0/share/zsh
drwxr-xr-x 5 root root 4096 Jul 23 11:00 zsh.dist
Stowを利用してzshバージョンの切り替え
zsh-4.3.17を導入して、zsh-5.0.0から切り替えをしてみる。
1
2
3
4
5
6
7
cd ~/src
curl -Lo zsh-4.3.17.tar.gz http://sourceforge.net/projects/zsh/files/zsh-dev/4.3.17/zsh-4.3.17.tar.gz/download
tar zxvf zsh-4.3.17.tar.gz
cd zsh-4.3.17
./configure --prefix= /usr/local/stow/zsh-4.3.17
make
sudo make install
この状態で/usr/local/stow
配下に2つのバージョンがある。
1
2
3
4
[ akira@dev001] $ ll /usr/local/stow
total 8
drwxr-xr-x 5 root root 4096 Aug 9 12:12 zsh-4.3.17
drwxr-xr-x 5 root root 4096 Aug 9 11:27 zsh-5.0.0
zsh-5.0.0
へのリンクを削除(stow -D
)して、zsh-4.3.17
にリンクを貼る。
1
2
3
cd /usr/local/stow/
sudo stow -Dv zsh-5.0.0
sudo stow -v zsh-4.3.17
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[ akira@dev001] $ sudo stow -v zsh-4.3.17
LINK: bin/zsh-4.3.17 = > ../stow/zsh-4.3.17/bin/zsh-4.3.17
LINK: bin/zsh = > ../stow/zsh-4.3.17/bin/zsh
LINK: share/man/man1/zshtcpsys.1 = > ../../../stow/zsh-4.3.17/share/man/man1/zshtcpsys.1
LINK: share/man/man1/zshparam.1 = > ../../../stow/zsh-4.3.17/share/man/man1/zshparam.1
LINK: share/man/man1/zshcontrib.1 = > ../../../stow/zsh-4.3.17/share/man/man1/zshcontrib.1
LINK: share/man/man1/zshoptions.1 = > ../../../stow/zsh-4.3.17/share/man/man1/zshoptions.1
LINK: share/man/man1/zsh.1 = > ../../../stow/zsh-4.3.17/share/man/man1/zsh.1
LINK: share/man/man1/zshroadmap.1 = > ../../../stow/zsh-4.3.17/share/man/man1/zshroadmap.1
LINK: share/man/man1/zshexpn.1 = > ../../../stow/zsh-4.3.17/share/man/man1/zshexpn.1
LINK: share/man/man1/zshmisc.1 = > ../../../stow/zsh-4.3.17/share/man/man1/zshmisc.1
LINK: share/man/man1/zshzle.1 = > ../../../stow/zsh-4.3.17/share/man/man1/zshzle.1
LINK: share/man/man1/zshbuiltins.1 = > ../../../stow/zsh-4.3.17/share/man/man1/zshbuiltins.1
LINK: share/man/man1/zshcalsys.1 = > ../../../stow/zsh-4.3.17/share/man/man1/zshcalsys.1
LINK: share/man/man1/zshmodules.1 = > ../../../stow/zsh-4.3.17/share/man/man1/zshmodules.1
LINK: share/man/man1/zshcompctl.1 = > ../../../stow/zsh-4.3.17/share/man/man1/zshcompctl.1
LINK: share/man/man1/zshzftpsys.1 = > ../../../stow/zsh-4.3.17/share/man/man1/zshzftpsys.1
LINK: share/man/man1/zshcompsys.1 = > ../../../stow/zsh-4.3.17/share/man/man1/zshcompsys.1
LINK: share/man/man1/zshall.1 = > ../../../stow/zsh-4.3.17/share/man/man1/zshall.1
LINK: share/man/man1/zshcompwid.1 = > ../../../stow/zsh-4.3.17/share/man/man1/zshcompwid.1
LINK: share/zsh = > ../stow/zsh-4.3.17/share/zsh
LINK: lib/zsh = > ../stow/zsh-4.3.17/lib/zsh
下記でバージョンが切り替わっているか確認。バージョン切り替えが楽。
1
2
3
4
exec zsh
zsh --version
zsh 4.3.17 ( x86_64-unknown-linux-gnu)
Stow関連の情報は全体的に古いものが多くて、ググっているとオワコン的な雰囲気が漂ってるんですが
2012年現在もちゃんとメンテされているので、ソースからビルドするならStowを利用するのが良いかもしれない。
運用としてはwebistranoなどを利用して、
ビルドサーバでビルドしたものをデプロイ
各サーバでstow
コマンドを実行してバージョン切り替え
という感じになるかなーと考え中。
もう少し突っ込んで検証してみよう。
参考URL