Glide Note

glidenote's blog

Stowを利用してソースからビルドしたソフトウェアを効率的に管理する

同じチームの@lamanotramaさんと話していて、 これから一部パッケージはRPMを作らず、@hirose31さんの方式 (ソースから自前ビルドしたソフトウエアの効率的な管理方法 - (ひ)メモ) を採用するとのことで、「なるほど!!」と思いながら上記記事のはてブコメント を眺めてたらStowというものを発見。

早速検証してみた。検証環境はCentOS 6.3です。

Stowの概要

  • Perlで書かれている
  • ソースからビルドしたソフトウェアを管理するソフト
  • 任意のディレクトリ/usr/local/stowなどにパッケージ一式をインストール
  • インストールしたパッケージから/usr/lib/{bin,lib,share}にリンクを貼って利用。
  • バージョンの切り替えはリンク張り直しで行う(ファイルの上書きはしない)
  • zsh-4.3.17zsh-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

Comments