実際に、/usr/local/の下に様々なファイルを置くと、各ファイルがどのソフトウェア・パッケージから展開されたものなのか判らなくなってしまいます。したがって、ひとつのソフトウェア・パッケージは、それ以外のソフトウェア・パッケージの影響を受けない独立したディレクトリに置いた方が管理は楽になりそうに思えます。しかし、それでは、多くのディレクトリにPATHやLIBPATHを通さなければならなかったりして、かえって面倒な面が出て来ます。
方法 | 長所 | 短所 |
---|---|---|
様々なファイルをひとつのディレクトリに集中 |
|
|
ソフトウェア・パッケージ毎にディレクトリを用意 |
|
|
表にまとめてみると、このふたつの方法の長所と短所は全く裏返しであり、どちらの方法も完全ではないことがわかります。
そこで、
このTVFSによるパッケージ管理は、私が公開しているソフトウェアに限らず、他のソフトウェアにも応用が効きます。
TVFSを使ってパッケージを管理するメリットは、
例えば、私の手元の環境の/usr/local/ディレクトリは、以下のような、いくつかのディレクトリをTVFSで重ね合せたものです。
TVFS Directory Link X:\usr\local Order Access Exclude Create Directory 1 rw no yes D:\usr\local 2 r no no D:\var\lib\grep 3 rw no no D:\var\lib\wget 4 r no no D:\var\lib\w3m 5 r no no D:\var\lib\sed-ja 6 r no no D:\var\lib\zip 7 r no no D:\var\lib\unrpm 8 r no no D:\var\lib\bash 9 r no no D:\var\lib\bzip2 10 r no no D:\var\lib\jless : : : : (以下、略)
- 注)
REXXインタプリタは、次回からの実行を高速化するために、REXXスクリプトを実行した後に様々な情報を拡張属性に残します。bin/ディレクトレにREXXスクリプトがある場合には、tvlinkのオプションに“-w”も指定した方が良いでしょう。
例えば、いま使っているsedの動作が何か怪しいと疑ったとします。そのような場合、
tvulink X:/usr/local sed-jaで、sed-jaをディスク上から削除することなくアンインストールできます。そして、より動作実績のあるディストリビューションのsedパッケージを例えばsedディレクトリに解凍し、
tvlink -r X:/usr/local sedで、/usr/local/にあるsedを入れ替えることができます。
もし疑いが晴れたら、
tvulink X:/usr/local sed.unstableで元の状態に戻すことができます。
tvlink -r X:/usr/local sed
同名のファイルがいくつかの異なるパッケージで配布されることがあります。このような場合、実際に同じディレクトリにそれらを解凍すると、どちらかのパッケージのファイルがオーバーライトされてしまうでしょう。TVFSを使えば、見かけ上、それらが同じディレクトリにありながら、それらがオーバーライトされることはありません。例えば、grepは、IBM EWSのAIXLIKE 3.51やGNU grep 2.4のパッケージに含まれており、同名のプログラムでありながら、似て非なる機能を持っています。また、例えば、gnuregex.dllは、GNU diffやGNU m4、GNU shell utilsなどのパッケージに含まれています。複数のパッケージのディレクトリを/usr/local/にまとめた時、どれを優先するかは、tvlinkの“-#
”オプションで明示できます。
実際には、どのパッケージにどんなファイルがあるかを気にしながらリンクの順番を決めるのは面倒くさいので、私は、bin/ディレクトリやdll/ディレクトリに置くべきファイルの日付を比較し、それが新しいほど優先されるようにtvlinkの“
-#
”オプションを設定しています。
日付の比較は、個々のディレクトリに、ファイルの日付を反映させる事で簡単に行えます。例えば、grep/ディレクトリにfgrep.exeの日付を反映させたり、wget.exeの日付をwget/に反映させるには、GNU file utilパッケージに含まれるtouchを使います。
touch -rgrep/bin/fgrep.exe grepとします。このようにしてtouchされたディレクトリの日付を比較するには、例えば“dir /o-d”とコマンド入力します。
touch -rwget/bin/wget.exe wget
ドライブ D のボリューム・ラベルは OS/2 です
ボリューム・シリアル番号は E73B:5814
ディレクトリーは D:\var\lib
00-03-05 23:31 <DIR> 0 ---- grep
00-03-05 0:39 <DIR> 0 ---- wget
00-02-20 11:53 <DIR> 0 ---- w3m
00-01-23 23:06 <DIR> 0 ---- sed-ja
00-01-09 19:34 <DIR> 0 ---- zip
99-11-06 20:24 <DIR> 0 ---- unrpm
99-10-23 15:50 <DIR> 0 ---- bash
99-08-03 20:11 <DIR> 0 ---- bzip2
99-08-01 15:31 <DIR> 0 ---- jless
: : : : (以下、略)
私の場合、日付による優先順位付けの例外は、D:/usr/local/ディレクトリで、これは無条件に“-#1
”としています。D:/usr/localには、fd2やbison、lhaのような、個々のファイル名がソフトウェア・パッケージのそれと等しいか極めて似ており、ひとつのディレクトリに混在しても、どのパッケージを解凍したものか容易に類推できるものをほうり込んであり、tvlink -rwc
でリンクしています。
例えば、私が公開しているwgetを解凍すると、以下のようなディレクトリ/ファイルが展開されます。
wget/ ├ bin/ │ └ showsubj.cmd wget.exe ├ doc/ │ └ wget/ │ ├ AUTHORS ChangeLog changelog.Debian │ ├ ChangeLog.info ChangeLog.srcCOPYING MACHINES │ ├ MAILING-LIST NEWS README README.os2 │ ├ README.os2.orig TODO │ ├ html/ │ │ ├ wget_1.html wget_2.html wget_3.html │ │ ├ wget_4.html wget_5.html wget_6.html │ │ ├ wget_7.html wget_8.html wget_9.html │ │ ├ wget_10.html wget_11.html wget_foot.html │ │ └ wget_toc.html │ └ util/ │ ├ download-netscape.html download.html README │ └ rmold.pl wget.spec ├ info/ │ ├ wget.info-1.gz wget.info-2.gz wget.info-3.gz │ └ wget.info.gz ├ man/ │ └ man1/ │ └ wget.1.gz ├ share/ │ └ locale/ │ ├ cs/ │ │ └ LC_MESSAGES/ │ │ └ wget.mo │ ├ de/ │ │ └ LC_MESSAGES/ │ │ └ wget.mo │ ├ hr/ │ │ └ LC_MESSAGES/ │ │ └ wget.mo │ ├ it/ │ │ └ LC_MESSAGES/ │ │ └ wget.mo │ ├ ja/ │ │ └ LC_MESSAGES/ │ │ └ wget.mo │ ├ no/ │ │ └ LC_MESSAGES/ │ │ └ wget.mo │ └ pt_BR/ │ └ LC_MESSAGES/ │ └ wget.mo ├ src/ │ ├ diffs/ │ │ ├ wget-1.5.3-os2-subj.diff.bz2 │ │ └ wget-1.5.3-os2.diff.bz2 │ └ wget-1.5.3.ja.po.bz2 └ doc/ └ wget/ └ changelog.os2
上のような構造に解凍されるソフトウェア・パッケージは、
tvlink -r X:/usr/local wget
とすれば、そのまま、代表的なディレクトリ構成の例の項に述べたような/usr/local/ディレクトリ構造として、TVFSドライブ上に参照できるようになります。
もちろん、例えば、もしあなたがwgetをあなたのニーズにあわせてソースコード・レベルでカスタマイズしたいのでなければ、wget/src/以下のツリーは不要ですので、削除してしまって構いません。同様に、例えば、日本語メッセージ以外の各国語メッセージが不要なら、share/locale/以下のja/以外のディレクトリ・ツリーを削除してしまって構いません。
私が1998年12月以降に公開したソフトウェア・パッケージで、その中に多量のファイルがアーカイブされているものは、ここで紹介したような“tvlinkコマンド 一発”でインストールが済むように配慮してあります。例外も少なくないですが…。
なお、以上、OS/2アプリケーションを前提とした説明を行いましたが、このようなTVFSによるディレクトリの結合は、DOSセッションの環境変数PATHのように長い値を設定できない環境では特に有用です。
慣例的に、XFree86/OS2用のソフトウェア・パッケージは、ルート・ディレクトリでunzipするとXFree86/ディレクトリ以下に展開されるようにアーカイブされるのが普通です。何処か適当なディレクトリで解凍したら、それを適当にリネームして、X:/XFree86/にリンクしてしまえば、ソフトウェア・パッケージ毎に独立したディレクトリでソフトウェアを管理できます。
- 例:
unzip xvncview ren XFree86 xvncviewer tvlink -r X:/XFree86 xvncviewer
最後に、もうひとつ紹介しておきたいTVFSのメリットは、unixのシンボリック・リンクもどきの使い方です。unix環境で開発されたソフトウェアのいくつかは、同じプログラムでありながら、そのファイル名が異なると、それに応じた異なる動作をするものがあります。例えば、ファイルを圧縮するプログラムであるgzipやbzip2は、それぞれ、zcat、bzcatという名前で呼び出されると、それぞれ、gzip -dcやbzip2 -dcと等価な、ファイルを解凍して標準出力に吐き出すプログラムとして動作します。このようなソフトウェアが私の手元にもいくつかあり、私の場合、以下のようなシンボリック・リンクを張っています。
|
|
また、配布されているファイル名をリネームすることなく、呼び出すコマンド名を変えることもできます。例えば、OS/2が元々用意しているpatch.exeと、GNU patchのOS/2版のpatch.exeは同じ名前ですが、元々OS/2が用意しているものと分けるために、GNU patchの方を、
|
|
しつこく、もうひとつだけ例示しておきます。DOS用のバッチ・ファイルとOS/2のバッチ・ファイルは、拡張子がそれぞれ .BATと .CMDと異なっていますが、実は中身は全く同じという場合があります。もちろん同じものを拡張子を変えてふたつ用意しておけば良いのですが、時々、一方だけを修正し他方の修正を忘れてしまい、後になってから、あれぇ? 修正したはずなのに…と、つまらないことで悩んでしまうこともあります。foo.cmd → foo.batとシンボリック・リンクを張っておけば、このようなトラブルを避けることができます。
TVFSの詳細については、TVFSのUser's Guideを参照してください。
TVFSは、以下のサイトからダウンロードできます。
なお、私やはやま かおるさんのように、TVFSをガンガン使えている人がいる反面、原因がよくわかりませんが、TVFSの動作が不安定で、その使用をあきらめてしまった人も少なくないようです。あなたの環境で運悪くTVFSが使えないからと言って、どうしたらうまく動くようになるだろうか?という質問のメールを私に送らないでください。残念ながら私はその解答を持っていません。私からは、せいぜい“かわいそうにねぇ。頑張ってね”と言う回答しか引き出せないでしょう。私は、この文章を読んでいるあなたのOS/2環境では、何の問題もなくTVFSが安定して動くことを祈るのみです。