Ho un file RPM Spec, basato su rhel7 con rpmbuild, in cui vorrei definire la versione con uno script.Definire la versione con script nel file spec RPM
ho letto qui http://www.techrepublic.com/article/rpmproc-spec-file/, che posso fare questo:
%define version 1.2
Version: %{version}
E qui RPM spec file - Is it possible to dynamically populate a spec file variable, che posso definire con uno script:
%define whoami %(cmd)
Così ho provato a fare questo nel mio Spec File:
%define version %(echo "$(sed -n 's|^[ ]*appVersion = "\(.*\)"|\1|p' /fullfilepath/values.txt | sed 's/^\(.*\)-.*$/\1/')")
Version: %{version} **Line 23**
Ma ho un
error: line 23: Empty tag: Version:
Le cose che ho provato finora:
%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
Queste funzionano bene, quindi non ho idea di cosa potrebbe essere questo è che causano il fallimento. Qualche idea su cosa potrebbe incastrarla per fallire quando chiamo la stessa cosa nel definire il tag nel file spec?
Aggiornamento
Ho provato a sostituire il nome del file con il valore effettivo in modo che appaia come questo
echo "$(sed -n 's|^[ ]*appVersion = "\(.*\)"|\1|p' <<< "appVersion = \"1.2-SNAPSHOT\"" | sed 's/^\(.*\)-.*$/\1/')"
che funziona quando viene chiamato nel terminale, ma come un
%(echo "$(sed -n 's|^[ ]*appVersion = "\(.*\)"|\1|p' <<< "appVersion = \"1.2-SNAPSHOT\"" | sed 's/^\(.*\)-.*$/\1/')")
ma Ricevo ancora il
Empty tag: Version: Error
Aggiornamento 2
ho testato un comando diverso più complesso quindi echo "12"
:
%define version %(echo "$(git log -1 | grep commit | awk -F"commit " '{print $2}' | cut -c1-8)")
Questo funziona bene anche! Rende la versione le prime 7 cifre dell'hash commit.
Update 3
Il mistero continua, ho fatto un test per verificare se il comando sed questo è la causa, ma il seguente comando mi dà 1.2 come la versione
%define version %(echo "$(sed 's/.*= //' <<< "appVersion = 1.2")")
Se questo comando funziona ma non il mio primo, quindi deve essere con qualcosa nel mio primo comando che funziona solo se chiamato direttamente nel terminale e non in% (cmd). Avvicinarsi!
Update 4
Ok, quindi mi sembra di aver isolato quello che deve essere, curioso, sembra che potrebbe essere il -n
o s| | \1 |p
sintassi che rpmbuild non piace. Ho creato una versione più semplice del mio originale.Dateci un'occhiata:
#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")")
Purtroppo però non penso di poterlo fare più per isolare e capire quale sia il problema. Non c'è niente di sbagliato nell'usare un sed nello stile del secondo comando, ma è ancora molto interessante sul perché il primo comando non funzioni.
Update 5
ho scoperto che c'è qualche problema profondo qui quando si lavora con qualsiasi script all'interno%() con un file di specifica e rpmbuild. Ho provato ad usare awk solo per vedere cosa sarebbe successo e anche questo si rompe! Questo va più in profondità, allora Inizialmente ho pensato, come scoprire una cospirazione:
#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:
Update 6
buona notizia e una cattiva notizia per tutti, ho scoperto che rpm sembra fare un po 'del proprio lavoro nel backround e non mostrando ciò che il suo fare, ho finalmente trovato un comando che dà valori diversi quando viene chiamato tramite 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 ""
Così ora ho fatto un adeguamento e chiamato questo:
012.#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)
Quindi, da questo punto di vista, penso che ci sia un simile tipo di analisi del dietro le quinte del risultato del mio primo comando sed da rpm. Faremo il nostro modo rpm!
aggiornamento finale
Una tregua è stata fatta con rpm, ho intenzione di utilizzare questo comando invece:
%define version %(echo "$(awk '/ appVersion =/{ print $3 }' /filepath/values.txt" | sed 's/\"//g' | cut -d'-' -f1)
Si fa la stessa cosa come il mio primo comando e lavora all'interno specfile l'impostazione del numero di versione corretto. Se qualcuno ha qualche ipotesi sul motivo per cui il primo comando non funzionerebbe, sarei felice di leggerlo. Pace!
Potrebbe essere a causa di un problema di autorizzazione con '/ fullfilepath/values.txt'. Prova a sostituirlo con il valore effettivo (o semplificato). –