GNU Stowによるローカルパッケージ管理
GNU Stowによるローカルパッケージ管理方法を記す。
導入
何か新しいソフト(パッケージ)をパソコンにインストールするとき,方法がいろいろある。例えば,インストーラーを使ったり,ソースコードから自分でインストールしたりだ。こうしたパッケージのインストールを管理するために,OSごとにパッケージマネージャーが存在する。
WindowsであればNuGetやChocolatey,LinuxであればAPT (Debian系),yum/DNF (RedHat 系),MacであればMacportsやhomebrew,FreeBSDであればports,Cygwinであればapt-cygなどが該当する。
これらのパッケージマネージャーを使えば,コマンド一発で必要なソフトをインストールできて楽だ。しかし,以下のような欠点もある。
客先のパソコンや,レンタルサーバーでの利用を考えると,特に管理者権限が必要なのがネックになる。
これらの問題を解決するために,ローカルでパッケージ管理する方法がある。ローカルでパッケージを管理するとは,ソースコードから自分でソフトをビルドしてインストールすることだ。
単純に自分でビルド・インスト―ルすると,どのパッケージがインストールされているかの把握や,アンインストール方法などけっこう煩雑である。これを簡単にするために,ローカルパッケージマネージャーが存在する。
具体的にはstowとporg (旧: paco) が存在する。それぞれで同じようなことができるのだが,porgには以下の欠点がある。
そのため,stowを使ったローカルパッケージ管理がオススメだ。
stowはPerlで作られており,Perlがインストールされていれば使うことができる。また,C++で作られている xstowも存在する。こちらはオプションが多く,stowのほぼ上位互換でもある。ただし,xstow自身のインストールにC++コンパイラー (g++) が必要であるため,stowのほうがインストールは楽だ。
2014年頃から,自分でソースコードからビルドしたソフトはstowで管理している。今後もそうするつもりでいる。そこで,stowのインスト―ル方法と簡単な使い方を解説する。
なお,stowという英単語には「ものをしまい込む」といった意味がある。
インストール
GNU Stowのインストールは「インストール: GNU Stow | ポータブルなローカルパッケージマネージャー – senooken.jp」を参考に行う。
インストールが完了したら,パスの設定をしておく。以下の内容を~/.profile
や~/.bashrc
などに記述しておく。
LOCAL=~/.local
PATH="$LOCAL/bin:$PATH"
LD_LIBRARY_PATH="$LOCAL/lib64:$LOCAL/lib:$LD_LIBRARY_PATH"
LDFLAGS="-L$LOCAL/lib64 -L$LOCAL/lib"
CPATH="$LOCAL/include:$CPATH"
PKG_CONFIG_PATH="$LOCAL/lib/pkgconfig:$PKG_CONFIG_PATH"
ACLOCAL_PATH="$LOCAL/share/aclocal"
MANPATH="$LOCAL/share/man:$MANPATH"
MANDATORY_MANPATH="$MANPATH:$MANDATORY_MANPATH" # for Busybox
INFOPATH="$LOCAL/share/info:$INFOPATH"
export PATH LD_LIBRARY_PATH CPATH PKG_CONFIG_PATH LDFLAGS
export MANPATH MANDATORY_MANPATH INFOPATH ACLOCAL_PATH
使い方
stowの大まかな構成と使い方について説明する。
stowは,stowディレクトリーに一度自力でビルドしたソフトをインストールし,そこからシンボリックリンクを貼り,通常利用するbin
やlib
ディレクトリーにパスを通すことでローカルパッケージ管理を実現している。
そのため,違うバージョンのソフトへの差し替えはシンボリックリンクを差し替えるだけでよく,簡単にバージョンを切り替えられる。
stowの使い方について解説したスライドがあるので,以下に掲載しておく。
上記のフロー図を踏まえて,stowでのローカルパッケージ管理フローは以下のとおりとなる。
なお,stowコマンドでパッケージのシンボリックリンクを貼るときに,ディレクトリーが存在しない場合,stowが自動でディレクトリーを作成する。また,パッケージが一つも存在しない場合は自動的にディレクトリーを削除してくれるので,自分でディレクトリーを用意する必要はない。
エラー対応
stowでいくつかのパッケージを管理しているとエラーが起きてしまうことがある。
senooken% 2-0: stow readline-7.0
WARNING! stowing readline-7.0 would cause conflicts: * existing target is stowed to a different package: share/info/dir => ../../stow/stow-2.2.0/share/info/dir All operations aborted.
これは,stowで展開しようとしたとき,share/info/dir
ファイルが複数のパッケージで競合したために発生する。
この問題を回避するには,stowのオプションに--ignore=dir
を指定する。–ignoreオプションで競合したときに無視するファイルを指定できる。値にはPCRE形式の正規表現も利用可能であり,dir
以外にも競合した場合に指定すれば回避できる。
毎回オプションを手動で指定するのが面倒であれば,以下のようなalias
を~/.profile
や~/.bashrc
などに記述してやれば以後はひとまず問題ない。
alias stow="stow --ignore='dir|gschemas.compiled|icon-theme.cache'"
なお,xstowにはこの競合時の対応方法が用意されている。こちらは余裕があれば調査して記事にする。
ローカルパッケージの管理場所
stowでローカルパッケージ管理する場所について記述しておく。
基本的にstowでローカルパッケージ管理する場所はユーザーの自由だが,標準として推奨されているディレクトリーがあるのでそちらに準拠しておくのがよい。
標準としては,FHS (File Hierarchy Standard) とfreedesktop.orgのDesktop base directory specの2種類が存在する。FHSはUNIX系OSで標準的なディレクトリー構成を定めたものであり,freedesktop.orgはUNIX系OSのデスクトップ環境について仕様を定めている。
それらで定義されているパッケージ管理と関連するディレクトリーを以下にまとめる。
ディレクトリー | 標準 | 説明 |
---|---|---|
/ | FHS | OSに必要なものを管理している場所。 |
/usr | FHS | パッケージマネージャーやOSが管理している場所。 |
/opt | FHS | 追加のソフトウェアパッケージの管理場所。 |
/usr/local | FHS | システム管理者が自分でインストールする場所。 |
$HOME/.local | freedesktop.org | ユーザー個別のデータファイルのインストール場所。 |
標準に従うと,ユーザーやシステム管理者が自分でインストール場所として選べるのは,/opt
, /usr/local
, $HOME/.local
の3箇所のみとなる。
これらの使い分けは以下の通りに行うのがよいだろう。
- システム全体で使いたい場合:
/usr/local
にインストール。 - 特定のユーザーだけが使う場合:
$HOME/.local
にインストール。 /opt
には,BlueGriffon,JavaFXのGUI BuilderであるSceneBuilderなど特定のパッケージを配置。
/usr/local
はアクセスに管理者権限が必要なので,ユーザー権限だけでインストールする場合,$HOME/.local
一択となる。
これらのパッケージは自分の名前のディレクトリーを持っており,/opt/パッケージ名
のディレクトリー構成となっている。パッケージの内のディレクトリー構成もばらばらであることがある。stowで管理するパッケージはAutotoolsで作られるようなディレクトリー構成({bin,lib,share}
など)に適しているため,これらのサードパーティ製のパッケージの管理は,全体で使いたい場合は/opt
,ある特定のユーザーだけが使う場合は$HOME/.local/opt
などに配置するのがよいだろう。
$HOME/.local
はあまりみなれないかもしれないが,このディレクトリーはPythonやRubyのパッケージマネージャーpipとgemがローカルにパッケージをインストールする際に使っている。そのため,既存のツールとの親和性も高く,余計なディレクトリーを作る必要がなくなるので,このディレクトリーで管理するのが望ましい。
まとめ
stowによるローカルパッケージ管理について解説した。レンタルサーバーや最新版,開発版を試したい場合など,パッケージマネージャーに頼らず自分でインストールする必要になることがある。そうしたときに,stowで管理しておくと統一的に扱えて効率がいい。
実際にはApach HTTP ServerなどAutotoolsの形式に準拠していないパッケージもあるので全てでstowの管理が使えるとは限らない。しかし,stowによりかなりのパッケージに対応できる。
今後,このブログでソフトのインストールには,stowを使うので,初見の人はこの記事を参照してもらうことになるだろう。
“GNU Stowによるローカルパッケージ管理” に対して2件のコメントがあります。