Stow はLinuxなどで手動でパッケージをインストールする際、 なるべく汚さずにインストール出来る様にしてくれるコマンドです。
stow-get
はこのStowを使ってyum
やapt-get
などで管理しづらいパッケージを
まとめて管理するパッケージマネージャーです。
stow
stowを利用するには、まず$HOME/usr/local/stow等のstowディレクトリを作り、 その中にパッケージを分けてインストールしていきます。
パッケージをconfigureとかする際、--prefix
などでインストール先を決めたりしますが、
これを
$ configure --prefix=$HOME/usr/local/stow/<package>-<veresion>
みたいな感じにしてインストールを行います。
そして
$ cd $HOME/usr/local/stow/
$ stow <package>-<veresion>
とすると、**
新しいバージョンと入れ替えたい場合は、新しいversion
を使ったディレクトリにインストールし、
元のパッケージについては
$ cd $HOME/usr/local/stow/
$ stow -D <package>-<veresion_old>
とすることで$HOME/usr/local/bin/等からシンボリックリンクが削除されるので、
$ stow <package>-<veresion_new>
と新しいバージョンのものを貼り付けてあげればOK。
古いものもstowディレクトリに残しておけば上の様な感じで簡単に入れ替える事も出来ます。
stow-get
特に想定してるのは、管理者権限を持ってない様なシステムで、 個人のホームディレクトリにVimとかGNU Screenとか必要な(バージョンの)物を入れたい、 と言った場合。
加えて管理者としてyum
やapt-get
が使える場合でも、
それらで管理されてるパッケージのバージョンが古かったり
オプションが必要なものが入ってなかったりで手動で入れる必要がある場合にも使えます。
この辺で色々書いてますが、VimとかGNU screenと言ったものは 最新版で結構機能が違うので新しいものを使いたいのですが、 システムのアップデートだとなかなか最新のものにならなかったりします。
そんな時に自分用に自分のホームディレクトリに色々インストールしたりするのですが、 パッケージのコンパイルやインストール方法は大体似たような感じなので ある程度同じ作業としてまとめ上げる事が出来ます。
stow-get
はそれをスクリプト化して、さらに外部のパッケージごとのconfiguration file
を用意することで様々なパッケージをまとめてインストール出来る様にしたものです。
インストール
インストールはcURLでスクリプトを呼ぶことで出来ます。
$ curl -fsSL https://raw.github.com/rcmdnk/stow-get/install/install.sh| bash
これだと$HOME/usr/localをトップディテクトリとして $HOME/usr/local/stowがstowディレクトリになります。
stow-get
コマンドが$HOME/usr/local/stow-getに入ります。
ので、
export STOW_TOP=$HOME/usr/local
export PATH=$STOW_TOP/bin:$PATH
export LD_LIBRARY_PATH=$STOW_TOP/lib64:$STOW_TOP/lib:$LD_LIBRARY_PATH
export PYTHONPATH=$STOW_TOP/lib64:$STOW_TOP/lib:$PYTHONPATH
といった感じの設定を.bashrcなり.zshrcなりで行ってください。
もし違うディレクトリにしたい場合は、
$ curl -fsSL https://raw.github.com/rcmdnk/trash/install/install.sh| prefix=/usr/local bash
みたいな感じでprefix
を指定してください。
余談ですが、cURLを使ったスクリプトの実行は時に危ないこともあるので気をつけてください。
基本的な使い方
Vimをインストールしたい場合は
$ stow-get install vim
とすればOK。
アンインストールは
$ stow-get uninstall vim
このコマンドではstowディレクトリにある実体の方も削除します。
また、インストール出来るパッケージは
$ stow-get packages
Mercurial autoconf automake bzip2 curl expat git lua m4 ncurses python
readline screen stow-get stow termcap texinfo unzip vim wget
で確認出来ます。 stow-get/share/stow-get にconfiguration fileが用意されているパッケージです。
$ stow-get info vim
####################################################################
Configuration for vim
####################################################################
version=8.0.0586
inst_type=github
configure_options="--enable-luainterp=yes --enable-perlinterp=yes --enable-pythoninterp=yes --enable-python3interp=yes --enable-rubyinterp=yes --enable-cscope --enable-multibyte"
lib_dep=(libreadline readline libtermcap termcap liblua lua)
みたいにするそのパッケージのconfiguration fileの内容が見れます。
ここでlib_dep
という設定がありますが、
依存するライブラリが入っています。
lib_dep
の指定の仕方は2つ一組で最初にライブラリーの名前(.aや.soは除いてもOK。libreadline*
という感じで検索する)、
2つ目がパッケージの名前になります。
検索する場所はLD_LIBRARY_PATH
に入っているディレクトリです。
ここで見つからないとそのパッケージも入れる事になります。
stow-get
でインストールして無くても他の所にあればインストールは行いません。
同様にbin_dep
という設定もあり、こちらは実行ファイルに関する依存です。
bin_dep=(autoconf autoconf)
の様な。こちらも2つ一組で最初が実行ファイル名、2つめがパッケージ名。
GNU Projectのパッケージに関しては 上のリストになくても
$ stow-get install -t gnu wdiff
と、-t gnu
オプションを付けるとインストールすることが出来ます。
また、GNU Projectのパッケージの 最新バージョンが知りたい場合、
$ stow-get get_latest wdiff
wdiff 1.2.2 updated at: 2014-04-14 16:17 1.4M
の様にget_latest
を使うとWebから情報を取ってきて最新バージョンを教えてくれます。
この辺でやったことです。
ユーザー設定ファイル
stow-get
のユーザー設定ファイルは
$HOME/.stow-getになります。
基本的には.bashrcの様にシェルスクリプトとして書いてください。
もし、インストールするディテクトリを変更したい場合は
set_inst_dir /home/USER/usr/local
の様にset_inst_dir
という関数に指定したいディレクトリを与えてください。
また、パッケージのconfiguration fileのデフォルトの場所は /PATH/TO/stow-get/../share/stow-getになりますが、 自分でconfiguration fileを作成して使いたい場合は、
conf_dir=(/PATH/TO/YOUR/CONFIGURATION/DIRECTORY ${conf_dir[@]})
の様にconf_dir
という配列の先頭に自分のディレクトリを追加してください。
予めインストールするパッケージが決まっている場合、
packages=(git screen vim)
の様に書いておくと
$ stow-get install
とinstall
サブコマンドだけでpackages
で指定された
パッケージをインストールすることが出来ます。
この機能が割と今回やりたかったことの大きな部分を占めるところだったりもします。
パッケージconfiguration file
各パッケージの設定ファイルは<package>.sh
の様な名前にする必要があります。
中身は
Parameter | Description | Default |
---|---|---|
inst_type | Type of installation. Available types are: gnu , tarball , github or github_direct . This parameter is mandatory. |
- |
version | Version of th package. | - |
tarball | tarball name. | <package>-<version>.tar.gz |
url_prefix | URL where tarball file is placed. | For gnu: http://ftp.gnu.org/gnu/<package> . For github: https://github.com/<package>/<package>/archive |
configure | Configure command. Most of packages have configure file to be executed first. |
./configure |
config_options | Options for configure command.Note: --prefix="$stow_dir/$target/" (where the package substance is installed) option is automatically added if configure is executed. |
"" |
before_configure | This is function. Commands executed before configure .If configure doesn’t have --prefix but it set prefix in other way, then set configure="" and write configure command in before_configure . |
function before_configure { : } |
make_cmd | This is function for make command. | function make_cmd { make all && make install } |
bin_dep | Array of executable packages on which the package depending on. One dependency must be a set of executable name and package name like lib_dep=(libcurl curl libexpat expat) |
() |
lib_dep | Array of library packages on which the package depending on. One dependency must be a set of library name and package name like bin_dep=(automake automake autoconf autoconf) |
() |
な感じ。
inst_type
でインストール方法の大筋を決めて、後はbefore_configure
や
make_cmd
と言った関数を自分で変更することで
基本的にどんなタイプのインストールも出来る様になっています。
GNU Projectパッケージの場合は単純なので
inst_type=gnu
とだけ書いておけば基本的にインストール出来る様になります。
その他細かいinst_type
の話についてはREADMEにて。
まとめ
というわけで、ターミナル環境で、 マニュアルインストールで 自分用パッケージを管理するスクリプトを作ってみました。
毎回なんとなくその場その場で必要な物を手でコンパイルしてましたが、 これで新しい環境に移ってもぱっと必要なものが揃えられます。
stow-get/share/stow-get に用意してあるパッケージは基本的に自分で必要そうなものだけを入れてるので、 もし他のパッケージとか追加したいものがあれば GitHubの方でPull RequestなりIssueでパッケージ名を言うなりしてもらえれば、と。