Up / English / Japanese / ChangeLog / tinypackage-0.1.0.tar.gz / tinypackage-bootstrap-0.1.0.tar.gz
tinypackage は UNIX 系システム向けの軽量なソフトウェアパッケージ管理システムです。計算機を利用する一般ユーザが、自分のホームディレクトリの中だけでソフトウェア管理を行いたい場合などに有用です。
以下に挙げるようなものと同様に、ディレクトリとソフトウェアを1対1に対応させ、シンボリックリンクを通じて実行ファイルや共有ライブラリにアクセスする方法を採用しています。
Ruby 1.6.4 以上 ( http://www.ruby-lang.org/ ) が必要です。
Ruby が無い環境でもすぐに導入できるように、ブートストラップパッケージも用意しています。これは、パッケージルート下に自動的に Ruby をコンパイルしてインストールします。
まず、パッケージルートと呼ばれるディレクトリを決める必要があります。 tinypackage はこのディレクトリの下でソフトウェアを管理します。
ここではパッケージルートを /opt と仮定します。 tinypackage をシステム全体で使用する場合、ここをパッケージルートとすることを推奨します。一般ユーザなら ~/opt が良いでしょう。
パッケージルートとなるディレクトリを作成して下さい。
# mkdir -p /opt
tinypackage のソースを展開し、 tinypkg スクリプトをパッケージルートにコピーして下さい。
$ gunzip < tinypackage-0.1.0.tar.gz | tar -xf - # cp tinypackage-0.1.0/tinypkg /opt/
パッケージルートとなるディレクトリを作成して下さい。
# mkdir -p /opt
ブートストラップパッケージを展開し、その中身をパッケージルートにコピーして下さい。
$ gunzip < tinypackage-bootstrap-0.1.0.tar.gz | tar -xf - # cp tinypackage-bootstrap-0.1.0/* /opt/
bootstrap スクリプトを実行して下さい。
# /opt/bootstrap
パッケージルートが決まったら、次は環境変数を設定します。 /etc/profile (自分だけに設定する場合は ~/.profile ) に以下の文を記述して下さい。
eval `/opt/tinypkg profile`
また、普段 C シェル (csh,tcsh) を使用している場合は、加えて /etc/csh.login (自分だけに設定する場合は ~/.login ) に以下の文を記述します。
eval `/opt/tinypkg profile -c`
以上の設定が終ったら、一旦ログアウトして再びログインして下さい。これで以降、ログイン時に以下のような環境変数の設定が行われ、 tinypackage 下のソフトウェアが提供する実行ファイル等が利用可能になります。
export PATH="/opt/.bin:$PATH"; export LD_LIBRARY_PATH="/opt/.lib:$LD_LIBRARY_PATH"; export LIBRARY_PATH="/opt/.lib:$LIBRARY_PATH"; export MANPATH="/opt/.man:$MANPATH"; export INFOPATH="/opt/.info:$INFOPATH"; export C_INCLUDE_PATH="/opt/.include:$C_INCLUDE_PATH"; export RUBYLIB="/opt/.libruby:$RUBYLIB"; export PERLLIB="/opt/.libperl:$PERLLIB"; export PYTHONPATH="/opt/.libpython:$PYTHONPATH";
なお、このような環境変数が利用できない状況( CGI など)から tinypackage 下のソフトウェアを利用するには、後述するマージモードと呼ばれる機能を使用します。
ここでは、 tinypackage でソフトウェアをインストールする方法を紹介します。インストールには以下の2つの方法がありますが、順番に紹介していきます。
それでは、例として GNU Hello というプログラムをインストールしてみます。
まず、 http://www.gnu.org/software/hello/hello.html から hello-2.1.1.tar.gz をダウンロードし、展開して下さい。
$ gunzip < hello-2.1.1.tar.gz | tar -xf -
展開されたディレクトリでビルドとインストールを行います。この時、インストール先がパッケージルート直下のサブディレクトリとなるよう、 prefix に /opt/hello と指定して下さい。
$ cd hello-2.1.1 $ ./configure --prefix=/opt/hello $ make # make install
これで /opt/hello に GNU Hello がインストールされました。
ひとつのソフトウェアのインストールが完了したら、 tinypkg スクリプト を実行してシンボリックリンクを更新します。
# /opt/tinypkg update Updating: bin lib man info include libruby libperl libpython emacs-lisp
これで、シェルが /opt/hello/bin/hello コマンドにアクセスできるようになります。確認してみましょう。
$ which hello /opt/.bin/hello
これで GNU Hello を実行する準備が整いました。実行してみましょう。
$ hello Hello, world!
また、 man ページや info も見ることができます。
$ man hello $ info hello
この時点で、ディレクトリ構造はこのようになっています。
/opt /opt/tinypkg /opt/hello /opt/hello/info /opt/hello/info/hello.info /opt/hello/share /opt/hello/share/locale /opt/hello/bin /opt/hello/bin/hello /opt/hello/man /opt/hello/man/man1 /opt/.bin /opt/.bin/hello -> /opt/hello/bin/hello /opt/.lib /opt/.man /opt/.man/man1 /opt/.man/man1/hello.1 -> /opt/hello/man/man1/hello.1 /opt/.info /opt/.info/hello.info -> /opt/hello/info/hello.info /opt/.include /opt/.libruby /opt/.libperl /opt/.libpython /opt/.emacs-lisp
他のソフトウェアをインストールする場合も、以上のような手順を踏んで下さい。
(作成中)
インストールしたソフトウェアを完全に削除するのは簡単です。パッケージのディレクトリを削除して、また tinypkg update を実行します。
# rm -rf /opt/hello # /opt/tinypkg update Updating: bin lib man info include libruby libperl libpython emacs-lisp
tinypkg purge にパッケージ名を指定して実行すると同じ結果が得られます。
# /opt/tinypkg purge hello P hello Updating: bin lib man info include libruby libperl libpython emacs-lisp
インストールされたソフトウェアを表示するには、 tinypkg list を実行します。( ls /opt でも望みの結果が得られるでしょう。)
# /opt/tinypkg list + ruby + fcgi + hello - ruby-1.8.0
先頭のマークは以下の意味を表します。
そのソフトウェアのコマンド等が利用可能であることを表します。
そのソフトウェアのコマンド等が一時的に利用不能であることを表します。インストールしたものの、別のソフトウェアと競合するなどの理由で使用したくない場合にこの状態にします。この状態になると、そのソフトウェアのコマンド等にはシンボリックリンクが貼られません。
あるパッケージを利用不能状態にするには、 tinypkg unavail にパッケージ名(ソフトウェアをインストールしたディレクトリの名前)を指定して実行します。
# /opt/tinypkg unavail hello - hello Updating: bin lib man info include libruby libperl libpython emacs-lisp
利用可能状態に復帰させるには、 tinypkg avail を実行します。
# /opt/tinypkg avail hello + hello Updating: bin lib man info include libruby libperl libpython emacs-lisp
通常、 tinypackage はパッケージルート直下に .bin や .lib といったディレクトリを作成し、そこにシンボリックリンクを作成します。このディレクトリのコマンドを利用するためには、そこにパスを通すための環境変数を設定します。
しかし、 CGI などでは実行前に環境変数が一旦クリアされてしまうため、これらのディレクトリにパスが通りません。また、一部のプログラムはセキュリティ上の理由から LD_LIBRARY_PATH などをクリアしてしまいます。
環境変数によるパスの指定がうまくいかない例があります。 GNU Emacs などは環境変数 EMACSLOADPATH により Emacs Lisp の場所へのパスが指定できますが、これはデフォルトのパスを上書きしてしてしまうという問題があります。(このため、 tinypkg profile は EMACSLOADPATH を設定しません。)
そこで、既にパスが通っているディレクトリにシンボリックリンクを作成するマージモードという機能を使用します。これを使うと、例えば /usr/bin の中にシンボリックリンクを混ぜることができるので、確実にパスが通ります。もちろん、不要なシンボリックリンクはそこからちゃんと削除されるようになっています。
では、 /usr/bin にシンボリックリンクを混ぜる例を紹介します。まず、 /opt/.bin を削除してしまいます。そして代わりに、これを /usr/bin へのシンボリックリンクにします。
# rm -rf /opt/.bin # ln -s /usr/bin /opt/.bin
そして、 tinypkg update を実行します。
# /opt/tinypkg update Updating: bin lib man info include libruby libperl libpython emacs-lisp
すると、 /usr/bin の中にシンボリックリンクが作られます。
# ls -l /usr/bin/hello lrwxrwxrwx 1 root root 24 Apr 19 01:18 /usr/bin/hello -> /opt/hello/bin/hello*
このシンボリックリンクは hello パッケージを削除するか、 tinypkg clean を実行することで綺麗に取り除かれます。また、既に同じ名前のファイルや tinypackage の管理外のリンクがある場合でも、それを上書きすることはありません。
もし、すべてのファイルをマージモードで管理したければ以下のようにすると良いでしょう。リンク先はシステムや Ruby,Perl,Python のバージョンなどによって異なります。これは Debian 3.0 (woody) での例です。
# ln -s /usr/bin /opt/.bin # ln -s /usr/lib /opt/.lib # ln -s /usr/info /opt/.info # ln -s /usr/include /opt/.include # ln -s /usr/lib/ruby/1.6 /opt/.libruby # ln -s /usr/lib/perl5 /opt/.libperl # ln -s /usr/lib/python2.1 /opt/.libpython # ln -s /usr/lib/j2sdk1.3/jre/lib/ext /opt/.libjava # ln -s /usr/share/emacs/site-lisp /opt/.emacs-lisp
残念ながら、 /opt/.man に対してだけはマージモードには対応していません。環境変数が使えない場合、 /etc/manpath.config を利用してパスを通す必要があります。これは、セクションやローカライズされた man ページなどを管理するために多少複雑な処理を行っているためです。
以下に、現在 tinypackage がシンボリックリンクを作成するファイルの一覧を示します。この一覧に追加して欲しいファイルがあれば tinypkg スクリプトをハックするか、作者に要望を送って下さい。
[共有名] [パッケージ内の位置] [備考] bin bin/*, sbin/* 実行ファイル lib lib/* 共有ライブラリ man man/*, share/man/* オンラインマニュアル info info/*, share/info/* info マニュアル include include/* C 言語のヘッダファイル libruby libruby/* Ruby スクリプト libperl libperl/* Perl モジュール libpython libpython/* Python ライブラリ libjava libjava/* Java クラスライブラリ emacs-lisp emacs-lisp/* Emacs Lisp