web-dev-qa-db-ja.com

RPMスペックファイルのスクリプトでバージョンを定義する

Rpmbuildを使用してrhel7上に構築されたRPMSpecファイルがあり、スクリプトを使用してバージョンを定義したいと思います。

私はここを読みました 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)")

これも問題なく動作します!バージョンをコミットハッシュの最初の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で作成されました。代わりに次のコマンドを使用します。

%define version %(echo "$(awk '/ appVersion =/{ print $3 }' /filepath/values.txt" | sed 's/\"//g' | cut -d'-' -f1)

これは私の最初のコマンドと同じことを行い、バージョン番号を正しく設定するspecfile内で機能します。最初のコマンドが実行されない理由について誰かが推測できる場合は、それを読むことにワクワクします。平和!

15
Jimmie

Rpmbuildコマンドを呼び出すシェルスクリプトが必要です。そのスクリプトを使用して、バージョン(または、さらに言えば、rpm仕様ファイルで使用しようとしているコマンド)を計算できます。

元のコードを変更し、

%define version %(echo "$(sed -n 's|^[ ]*appVersion = "\(.*\)"|\1|p' /fullfilepath/values.txt | sed 's/^\(.*\)-.*$/\1/')")
Version: %{version}

に、

%define version _VERSION_
Version: %{version}

そしてsed [〜#〜] version [〜#〜](rpmbuildを呼び出す前に)rpmbuildを呼び出すシェルスクリプトの計算値に。実際の仕様の内容がいくつかのファイルにダンプされた後、その生成されたファイルを同じシェルスクリプトのrpmbuildに渡します。

手順の概要は次のとおりです。

Rpmbuildを呼び出すbuilder.shシェルスクリプトがあると仮定して、以下の手順に従います。

  1. 上記のように、スペックファイルを更新して[〜#〜] version [〜#〜]プレースホルダー文字列/マクロ
  2. 現在のrpmスペックファイルをmy_package_template.specに移動します
  3. builder.shで、コマンドを実行してバージョンを取得し、バージョンを変数に保存します
  4. My_package_template.specファイルでsedコマンドを使用して、[〜#〜] version [〜#〜]をこの計算されたバージョンに置き換え、sed出力をmy_package.specに保存します。
  5. My_package.specをrpmbuildコマンドに渡します。

スペックファイル内の他のシェルコマンドの使用を置き換えるには、手順1、3、および4を繰り返します。

3
Prasanna

ラッパースクリプトを実行します。これにより、通常のリリースか開発リリースかなどを決定できます。次に、--defineオプションを使用して変数を渡すことができます その他のオプションについてはこの質問を参照 を参照してください。

1