debian/control(B)というのは、依存関係を調整するだけの実態を持たない仮想パッケージで、そこに「Conflicts」「Replaces」「Provides」を仕向ければ(A)と(A')が排他的に扱われるようになる。すなわち、(A)がインストール済みの状態で
Package: A
Conflicts: B
Replaces: B
Provides: B
Package: A'
Conflicts: B
Replaces: B
Provides: B
$ apt-get install A'
とすると、(A')がインストールされると同時に(A)がアンインストールされる。そして(A)または(A')を必要とするパッケージがあるなら「Depends:(B)」と書けばいい。
例えば、Ubuntu 10.04の wine1.2 と wine1.0 は上のようになっていて、ユーザーが使いたいバージョンを選ぶことができる。便利。
RPMの場合、Debと同じように「Conflicts」と「Provides」を指定すると(RPMにReplacesは無い)インストールできないパッケージができあがってしまった。結局は普通(?)に
hoge.specお互いに Conflicts して、仮想パッケージ(B)を Provides し、その(B)を Requires すれば目的の依存関係が達成できる。しかし、Debのように「一方をインストールすれば、もう片方は自動でアンインストール」とはならない。もう一方に切り替えようと思ったら、手動で無理やり rpm -e --nodeps で消してからインストールする必要がある。もっと良い方法があるんじゃないかとFedoraのSRPMを探してみたが、見つからなかった。おそらくRPMではDebのような事はできないと思う。共存できるようにパッケージを作って alternative コマンドで切り替えるのが吉。
Name: A
Conflicts: A'
Provides: B
Name: A'
Conflicts: A
Provides: B
ってなことで頭を悩ましていた今日この頃です。ほとんどの人にはどうでもいい、日本語が変な文章ですね。
RPMはともかくDebの仕組みを理解するのに苦労しました。日本語の情報が少なく、つれづれ日記に少し書いてあるけど、読めば読むほど混乱するばかり…
01:25 am | コメントする |
1. pollux 2010/07/19 23:15
> は自動でアンインストール」とはならない
多分 Obsoletesを使って # rpm -Uvh とすれば出来ると思います(未確認)
(多分というのは、個人的にはObsoletesとConflictsを同時に使うことはないので。
review requestに出すpackageでそんなことをしたら多分怒られる...)
2.
Sawa 2010/07/19 23:38
この記事の肝は「一方のパッケージを自分で選べるかどうか」なんです。
ちゃんと書いてませんでしたね。私の日本語が悪いです。
実はつい先日、Obsoletesの存在に気づいて試してみましたんですよ。
すると、Obsoletesを付けられた方は yum update で必ず上書きされちゃうみたいで、私が欲する結果にはなりませんでした。
切り替え可能かつアップデートも据え置きになる方法があれば、教えていただきたいです!
3. pollux 2010/07/20 00:46
この辺が私が # rpm -Uvh とすると、と書いた理由だったりもします
(但し、# rpm -Uvh で実際うまくいくかは私個人では確かめていません)。
yumの話をしますと、実はyumでpackageを「アップデートする」には本来は "yum update"と
"yum upgrade"の2種類があって、本来は別々の挙動をするはずなのですが、defaultの設定に
より同じ事をするようになっています。 $ man yumを見ると:
- yum update: installされたpackageをupdateする。「設定でobsoletes optionが有効に
なっていたり、--obsoletesを引数に渡したりすると」Obsoletesの関係も考慮する。
- yum upgrade = yum update --obsoletes
で、/etc/yum.confを見ると,defaultで「obsoletes=1」となっているので、defaultで
Obsoletes関係が考慮されます(で、--no-obsoletesとかいうoptionは無いみたい)
という訳で、/etc/yum.confでobsoletes=0に変更し、yum updateとyum upgradeを使い分ければ
うまくいくかもしれません(未確認です)。
4.
Sawa 2010/07/22 21:29
よく考えると、挙動の違いを感じたことがないですね…
apt-get update は削除されるファイルがあると保留されるが、yum update では保留されない。
なるほどなるほど。
/etc/yum.conf の設定を変えるのは望んでいないので、ひとまずは諦めます。
面白い情報ありがとうございました。