rpmbuild を使用して rhel7 でビルドする RPM Spec ファイルがあり、スクリプトを使用してバージョンを定義したいと考えています。
私はここでhttp://www.techrepublic.com/article/rpmproc-spec-file/を読んで、これを行うことができます:
%define version 1.2
Version: %{version}
ここでRPM スペック ファイル -スクリプトで定義できるスペック ファイル変数を動的に入力することは可能ですか。
%define whoami %(cmd)
だから私はスペックファイルでこれをやろうとしました:
%define version %(echo "$(sed -n 's|^[ ]*appVersion = "\(.*\)"|\1|p' /fullfilepath/values.txt | sed 's/^\(.*\)-.*$/\1/')")
Version: %{version} **Line 23**
しかし、私は
error: line 23: Empty tag: Version:
これまでにテストしたこと:
%define version %(echo "12") --basic script works ok, version becomes 12
//As a command straight in terminal
$ echo "$(sed -n 's|^[ ]*appVersion = "\(.*\)"|\1|p' /fullfilepath/values.txt | sed 's/^\(.*\)-.*$/\1/')"
//returns 1.2
これらはうまく機能するので、何が原因で失敗するのかわかりません。スペックファイルのdefineタグで同じことを呼び出すと、失敗する原因となる可能性のあるアイデアはありますか?
アップデート
ファイル名を実際の値に置き換えてみたのでこんな感じ
echo "$(sed -n 's|^[ ]*appVersion = "\(.*\)"|\1|p' <<< "appVersion = \"1.2-SNAPSHOT\"" | sed 's/^\(.*\)-.*$/\1/')"
それは端末で呼び出されたときに機能しますが、
%(echo "$(sed -n 's|^[ ]*appVersion = "\(.*\)"|\1|p' <<< "appVersion = \"1.2-SNAPSHOT\"" | sed 's/^\(.*\)-.*$/\1/')")
しかし、私はまだ取得します
Empty tag: Version: Error
更新 2
次に、別のより複雑なコマンドをテストしましたecho "12"
:
%define version %(echo "$(git log -1 | grep commit | awk -F"commit " '{print $2}' | cut -c1-8)")
これでもOK!バージョンをコミット ハッシュの最初の 7 桁にします。
アップデート 3
謎は続きます。sedコマンドが原因かどうかを確認するテストを行いましたが、次のコマンドはバージョンとして1.2を提供します
%define version %(echo "$( sed 's/.*= //' <<< "appVersion = 1.2" )")
このコマンドが機能するが、最初のコマンドが機能しない場合は、最初のコマンドで、%(cmd) ではなくターミナルで直接呼び出された場合にのみ機能する何かを使用する必要があります。近くなってる!
更新 4
わかりましたので、それが何であるかを分離したようです。好奇心旺盛で、rpmbuild が気に入らない構文-n
または構文である可能性があるようです。s| | \1 |p
オリジナルのよりシンプルなバージョンを作りました。見てみな:
#Error, doesn`t set version to 1.2
%define version %(echo "$( sed -n 's|^.*-\(-*\)|\1|p' <<< "foo-1.2" )")
#Works ok! sets version to 1.2
%define version %(echo "$( sed 's/.*= //' <<< "appVersion = 1.2" )")
残念ながら、問題を特定して理解することはもうできないと思います。2 番目のコマンドのスタイルで sed を使用しても問題はありませんが、最初のコマンドが機能しない理由については非常に興味深いものです。
更新 5
仕様ファイルと rpmbuild を使用して %() 内のスクリプトを操作する場合、ここに深刻な問題があることを発見しました。何が起こるかを見るためだけに awk を使ってみましたが、それも壊れました! これは、陰謀を発見するなど、私が最初に考えたよりもはるかに深くなります。
#In terminal it prints 1.2-SNAPSHOT, but in Spec it's an error
%define version %(echo "$(awk '/appVersion /{ print $3 }' <<< "appVersion = \"1.2-SNAPSHOT\"" | tr -d \")")
sh: -c: line 0: unexpected EOF while looking for matching `)'
sh: -c: line 1: syntax error: unexpected end of file
error: line 23: Empty tag: Version:
アップデート 6
皆さんにとって良いニュースと悪いニュースです。rpm がバックラウンドで独自の作業を行っているようで、何をしているのかを示していないことがわかりました。最終的に、rpm を介して呼び出されたときに異なる値を与えるコマンドを見つけました。
%define version %(echo "$(awk '/midonetVersion /{ print $3 }' <<< "midonetVersion = \"5.1-SNAPSHOT\"")")
#In terminal it echos "5.1-SNAPSHOT" (literally wrapped in "" )
#When in spec it set version to 5.1-SNAPSHOT , rpmbuild is removing the ""
だから今、私は調整を行い、これを呼び出しました:
#echos "5.1 in terminal and sets version to 5.1 in spec
%define version %(echo "$(awk '/appVersion /{ print $3 }' <<< "appVersion = \"1.2-SNAPSHOT\"")"| cut -d'-' -f1)
これを見ると、rpm からの最初の sed コマンドの結果の解析が舞台裏で行われている可能性があると思います。思い通りのrpmを手に入れましょう!
最終更新
rpm で休戦が成立しました。代わりに次のコマンドを使用します。
%define version %(echo "$(awk '/ appVersion =/{ print $3 }' /filepath/values.txt" | sed 's/\"//g' | cut -d'-' -f1)
これは最初のコマンドと同じことを行い、バージョン番号を正しく設定する specfile 内で動作します。最初のコマンドが実行されない理由について誰かが推測できる場合は、それを読んでワクワクします。平和!