18

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 内で動作します。最初のコマンドが実行されない理由について誰かが推測できる場合は、それを読んでワクワクします。平和!

4

2 に答える 2

4

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

元のコードを変更し、

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

に、

%define version _VERSION_
Version: %{version}

rpmbuildを呼び出すシェル スクリプトでVERSIONを計算された値に設定します (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 を繰り返して、spec ファイル内の他のシェル コマンドの使用を置き換えます。

于 2015-11-22T08:09:20.910 に答える
1

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

@Herrgott のコメントに応答するには、「%define仕様で再定義しようとすると、--defineそれをオーバーライドしません」(コメントに改行を含めることはできません) -_overrideで同じ名前の " " 変数を設定できます--define

%if 0%{?val_override:1}
%define val %{val_override}
%else
%define val whatever
%endif
于 2015-11-22T13:46:14.417 に答える