重要: シンボリック・リンク等を%postとかで張らない。 間違えてもそれ(%postではったリンクなど)を%preunや%postunで削除してはいけない。
シンボリック・リンクを含む全てのファイルを%installまででインストールして、 %filesに加えるべきである。(詳しくは後述)
あまり細かくサブパッケージに分けない
サブパッケージの作り方を覚えると、やたら沢山のサブパッケージをつくる人がいるが、 アップグレード時のメンテ(rpm -Uやspecの書き直し)が面倒になるばかりか、 どれがなんだか分からなくなったりする。分割は必要最小限に。
%configは乱用しない
%configを多くすると、%filesが非常にわかりづらくなることがあり、 version up等の時にこの部分のメンテに労力がかかるようになりよくない。 デフォルトのままで出来るだけ多くの人が利用できるようなconfigファイルを用意し、 ユーザの%configの設定は必要最小限ですむように心掛けると、 多くの人が利用しやすいものができ、多くの場合に%fileの記述もすっきりする。
patchを使いすぎない
configファイルの設定やMakefileなどを変えたりするために頑張ってpatchをいろいろつくるよりも、 別にファイルを用意してSourceに加えておき、%installあたりで
cp ${RPM_SOURCE_DIR}/hoge.conf .
とかしてしまったほうが、すっきりすることが多い。srpmをばらしても、 そのファイルがすぐ出てきてわかりやすく、 アップデートのためにspec修正するときも楽だったりする。
specファイルはわかりやすく。第三者にもわかるようコメントを入れて。
specファイルはソースのアップデートに対応して修正をしたり、 第三者が見て必要に応じて書き直したりすることがある。 凝っていろいろな設定をしたりする複雑なものを書くより、 ポータビリティを重視して簡潔に書いた方が後のメンテのためには吉。また、 違った環境でbuildができなくなるようなことが無いよう、 specファイル中のスクリプトで、特殊なコマンドを呼ぶようなことは避け、 一般的なコマンド使用にとどめるべき。
注意1は特に重要です。よく、%post で、シンボリック・リンクをはって、 %preun でそのリンクを削除するようなspecファイルがあります。 これを行うと,アップデート時に問題が生じることがあります。以前、 libcのパッケージでこういう記述が入ってるものがあって、 深刻な問題が生じたこともありました。
その理由は、rpm -U <new-rpm>、
rpm -e <old-rpm> rpm -i <new-rpm>
ではなく、
rpm -i <new-rpm> rpm -e <old-rpm>
とはたらくためです。
つまり、%post で、シンボリック・リンクをはって、 %preun でそれを削除するような rpm のバージョンアップをしようと、 rpm -U (アップデート)を実行すると
新しいパッケージのインストールが行なわれ、 %postでシンボリック・リンクがつくられる。
古いパッケージのアンインストールが行なわれる。 このとき、%preunでさっき新しいパッケージが作ったシンボリック・ リンクが削除される。
この仕様は、libcとかのアップグレードの途中でlibcとかがなくなってトラブルが生じるのを避けようとしたためのものと思われます。
実はこの問題は解決法があります。 %pre, %post, %preun, %postunのスクリプト実行時には、スクリプトに対して以下の引数が与えられます。
rpm -iでインストールを行うとき
%pre, %postに対して$1=1
rpm -Uでアップデートを行うとき
新しいrpmのインストール時に、 %pre, %postに対して$1=2
古いrpmをアンインストール時に、 %preun, %postunに対して$1=1
rpm -eでアンインストールを行うとき
%preun, %postunに対して$1=0
すなわち、はじめてインストールするときには、引数として1がわたされ、 rpm -eでアンインストールするときには0がわたされるわけです。 これを利用すると、
%post if [ $1 = 1]; then echo ``First installation!'' fi %preun if [ $1 = 0]; then echo ``Good bye!'' fi
とかできるわけです。 (それでも%postなどでシンボリック・リンクをはったりすると、 出どころ不明のファイルが増えることになります。その他トラブルをさけるため、 できるだけファイルは%filesに加えるようにし、 %postなどに書くスクリプトはできるだけ少なくしましょう)