トップページ | 過去記事(月別カテゴリー別) | 掲示板 | 野良DEB,RPM | 更新チェック | Twitter
<<  2010.6  >>
SMTWTFS
  12345
6789101112
13141516171819
20212223242526
27282930   
 
リンク
その他
  • RSS2.0
  • Credit

  • SEO
    loading

    プライバシーポリシー
    Google

カテゴリー » Linux June 06, 2010

Deb・RPMで競合するパッケージの作り方 Linux

似た機能を持つ2つの(A)と(A')があって、同時にインストールできないようにしつつ、どちらか一方があれば、それらの機能を必要とするパッケージの依存関係も満たされる…そういうDebパッケージを作るには、debian/controlを下のようにすれば良い。
debian/control

Package: A
Conflicts: B
Replaces: B
Provides: B

Package: A'
Conflicts: B
Replaces: B
Provides: B
(B)というのは、依存関係を調整するだけの実態を持たない仮想パッケージで、そこに「Conflicts」「Replaces」「Provides」を仕向ければ(A)と(A')が排他的に扱われるようになる。すなわち、(A)がインストール済みの状態で
$ 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

Name: A
Conflicts: A'
Provides: B

Name: A'
Conflicts: A
Provides: B
お互いに Conflicts して、仮想パッケージ(B)を Provides し、その(B)を Requires すれば目的の依存関係が達成できる。しかし、Debのように「一方をインストールすれば、もう片方は自動でアンインストール」とはならない。もう一方に切り替えようと思ったら、手動で無理やり rpm -e --nodeps で消してからインストールする必要がある。もっと良い方法があるんじゃないかとFedoraのSRPMを探してみたが、見つからなかった。おそらくRPMではDebのような事はできないと思う。共存できるようにパッケージを作って alternative コマンドで切り替えるのが吉。


ってなことで頭を悩ましていた今日この頃です。ほとんどの人にはどうでもいい、日本語が変な文章ですね。

RPMはともかくDebの仕組みを理解するのに苦労しました。日本語の情報が少なく、つれづれ日記に少し書いてあるけど、読めば読むほど混乱するばかり…
01:25 am | コメントする |

上の記事に対するコメント

1. pollux  2010/07/19 23:15
> しかし、Debのように「一方をインストールすれば、もう片方
> は自動でアンインストール」とはならない
多分 Obsoletesを使って # rpm -Uvh とすれば出来ると思います(未確認)
(多分というのは、個人的にはObsoletesとConflictsを同時に使うことはないので。
 review requestに出すpackageでそんなことをしたら多分怒られる...)

2. Owner CommentSawa  2010/07/19 23:38
御意見ありがとうございます。
この記事の肝は「一方のパッケージを自分で選べるかどうか」なんです。
ちゃんと書いてませんでしたね。私の日本語が悪いです。

実はつい先日、Obsoletesの存在に気づいて試してみましたんですよ。
すると、Obsoletesを付けられた方は yum update で必ず上書きされちゃうみたいで、私が欲する結果にはなりませんでした。

切り替え可能かつアップデートも据え置きになる方法があれば、教えていただきたいです!

3. pollux  2010/07/20 00:46
> Obsoletesを付けられた方は yum update で必ず上書きされちゃうみたいで
この辺が私が # 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. Owner CommentSawa  2010/07/22 21:29
yum update と yum upgrade が同じ動作ということにビックリです。
よく考えると、挙動の違いを感じたことがないですね…

apt-get update は削除されるファイルがあると保留されるが、yum update では保留されない。
なるほどなるほど。

/etc/yum.conf の設定を変えるのは望んでいないので、ひとまずは諦めます。
面白い情報ありがとうございました。


累計:1620695、今日:1985、昨日:1432
Created in 0.009 sec.