RPMスペックファイルで「this or that」パッケージを要求できますか?


30

単一の要件ではなく、仕様ファイルで代替要件または一連の要件を指定する方法(またはできるかどうか)を知っている人はいますか?

たとえば、2つのパッケージがあり、便利な名前のfoo-barとがあるとしbar-fooます。私のパッケージにはこれらのいずれかが必要ですが、両方ではなく、どちらが存在するかは気にしません。実行時には、使用可能な方を使用します。

だから効果的に私は言う方法が欲しい:

Requires: foo-bar OR bar-foo

それは不可能だと言えますが、私よりもRPMについて多くのことを知っている人がここにいると思うので、それを行う方法があるかもしれません。

UPDATE:私は唯一のパッケージ管理bar-fooではないが、foo-barその両方が仮想パッケージが動作しません提供しました。

更新:実際に必要なのは、それ自体が各パッケージ内の仮想パッケージです。セイのfoo-bar provides eagle' andバー-fooがビーグル提供and my package works with either (or both); but other packages require eitherワシをorビーグルorFOO-バーorバーfoo`、およびターゲット・システムが持つことができますいずれかまたは両方がインストールされています。

私は現在、%pre次のようなことを行うスクリプトでこれを解決することに傾いています:

rpm -q eagle || rpm -q beagle || echo "need eagle or beagle" && /bin/false

私はそれがうまくいくと確信していますが、RPMの依存関係追跡の残忍な回避のようです。あなたが尋ねたとき、たとえば、あなたは私のパッケージを見ることはないだろうwhatrequires foo-barwhatrequires beagle

更新:foo-bar考え直せば、少なくとも私の場合は、RPMの依存関係管理を回避することの痛みよりも、人々がインストールしないといけない場所にインストールすることを要求する痛みのほうが少ない。だから誰かが「これまたはそれ」を適切に要求する方法を考え出さない限り(これはRPMに一般的には素晴らしい機能だと思います)、私は要求するだけ foo-barで、実行時に、bar-foo利用可能な場合、私は選択しますそれらは私が必要とするどんな基準に従ってでも。

更新:別のアイデアとして、RPMを不正行為するものもありますが、適切な状態になる可能性があります。たぶん%post、RPMのデータベースを直接いじることができたかもしれません。したがって%pre、無効なインストールから保護され、インストール時に何が存在するかに応じて、%postどちらfoo-barbar-fooまたは両方が必要であることをRPMにさかのぼって通知します。

提案をありがとう!


これは非常に古いことを知っています。しかし、これには良い解決策がありますか?Requires:行にjava-1.6.0-openjdkがあるRPMを作成しています。しかし、java7で; 私はサポートのjava-1.7.0-OpenJDKのしたいようにもなく、中にこれら二つのどちらかに置くのに良い方法が必要見つけ出すことができませんでした:
vpram86

bar-fooのパッケージングを制御する場合、可能なソリューションの1つは、でビルドすることProvides: foo-barです。これにより、両方の依存関係が満たされます。新しいrpmバージョンについては、Boolean Dependenciesを確認してください。離れて滞在%preして%post、セクションシステムを敗北しようとしないでください
forcefsck

回答:


13

これはRPM 4.13から可能になりました。

https://rpm.org/user_doc/boolean_dependencies.html

次のように簡単にできます: Requires: (pkgA >= 3.2 or pkgB)


ドキュメントから、これらはrequireで使用できないように見えますが、「弱い」依存関係のみが正しいですか?
dsollen

2番目のリンクは、Requiresで使用できることを示しています。最初のリンクでは、Fedoraでこの方法を使用することは許可されていませんが、カスタムパッケージには適用されません。
carlwgeorge

9

この種の動作は、メールトランスポートエージェントなどのいくつかのパッケージで既に実行されています。これらの仮想パッケージは、システムに、必要な機能が他のプログラムによって既に提供されているかどうかを知る方法を提供します。

rpm.orgの仮想パッケージの例が役立つかどうかを確認してください。


ありがとう。ここで仮想パッケージが私の特定の問題を解決するとは思わないが、それらは非常に有用であることに同意する。私の場合は、両方が提供するいくつかの共通の特徴要求したくないfoo-barとしbar-foo、と私は制御されませんので、パッケージのfoo-bar私はそれらの両方を提供することはできませんsupport-for-mypackage。両方の代替前提条件のパッケージングを制御した場合、実際には共有仮想パッケージが優れたソリューションになります。
ケビンフロスト

5

2つの可能性:

一部場合foo-barbar-foo、あなたの使用はあなただけできる共通のファイルですRequire /path/to/file(私は考える ;私のテストは限られていたので)。

あなたの状況は、オプションの依存関係に似ています。それらが扱われる方法は、X-commonパッケージを持っていて、それから必要なX-foo-barパッケージと必要foo-barX-bar-fooパッケージを持つことbar-fooです。


残念ながら、一般的なファイルはありません。潜在的に危険ではありますが、それがあれば、それはクールなトリックになります:将来のバージョンでfoo-barはファイルを移動できます(bar-fooここでのみ制御します)。オプションの依存関係が興味深いですが、私は本当に必要がないので、非常に私は、必要でないものをいずれか foo-bar または bar-foo ; オプションの唯一のものは、どちらを選択するかです。返信いただきありがとうございます。
ケビンフロスト

これで問題が解決しました!それらのすべての仕事に私の単一パッケージのために、私はちょうど使用することができたなどのpython3、python34、python35、:異なるGNU / Linuxの味は違うのpython3仮想パッケージを提供Require: /usr/bin/python3
bgStack15

0

パッケージbar-fooが仮想パッケージfoo-barを提供するように機能しますか?

その後、burp-bazパッケージにfoo-barを要求させることができます。


やった場合は上記の感触skeezy(それはおそらくです)、あなたのRPMの2つのバージョンを作成する必要があるかもしれませんが、一つは依存foo-barし、他に依存しますbar-foo


魅力的ですが、危険です。本当に必要な何かが、実際には提供されていなかったものを提供するfoo-barと考えbar-fooた場合、壊れてしまいます。こだわりのポイントは、私のパッケージには、両方ではなく、どちらかの前提条件が必要なことです。しかし、他のパッケージでは、そのうちの1つだけが本当に必要な場合があります。そして、どちらか一方のみを使用できるようになる実際のケースがあるため、どちらかだけを要求することはできません。
ケビンフロスト

-2

自動化システム(RPMを使用する依存関係管理またはマシンのいずれか)での非決定性は、本当に悪いことです。失敗はまだ予想外の結果ほど悪くないので、この状況で失敗することを望みます。

この問題を解決するには、制御するパッケージに、不変パッケージが発生すること、および他のソフトウェアが依存するメイントークンを提供することをお勧めします。パッケージは不変のものを廃止します。特に既にインストールされている場合は、他のインストールで勝つことができます。

パッケージ化と適切な依存関係およびインストール操作は、扱いにくい作業です。目標-信頼性が高く、再現性があり、監査可能なインストール-は、非常に価値があるため、正しくインストールすることのメリットを実感できます。

依存性地獄は自傷行為です。例外なし


ここに私があなたにあげる魚があります:どちらもファイルまたはリソースを提供するので、2つのうちの1つだけが必要です。したがって、パッケージの名前に依存するのではなく、提供するファイルまたはリソースに依存するだけにしてください。はい、あなたはまだ非決定論を求愛していますが、実際にrpmdbを直接いじることを検討しているなら、あなたはすでに大部分の人々が回避することを学んだリスクを喜んで検討しています。このような技術的負債を負わない解決策を見つけていただければ幸いです。
user2066657
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.