Bir RPM Spec dosyası var, rpmbuild ile rhel7 üzerine inşa ediyorum, burada Version'i bir betik ile tanımlamak istiyorum.RPM spesifikasyon dosyasında betikle Version tanımlayın
ben bunu yapabilirsiniz Yani, burada http://www.techrepublic.com/article/rpmproc-spec-file/ okuyun:
%define version 1.2
Version: %{version}
Ve burada RPM spec file - Is it possible to dynamically populate a spec file variable, bir komut dosyası ile tanımlayabilirsiniz O:
%define whoami %(cmd)
Yani benim Spec bunu denedi Dosya:
%define version %(echo "$(sed -n 's|^[ ]*appVersion = "\(.*\)"|\1|p' /fullfilepath/values.txt | sed 's/^\(.*\)-.*$/\1/')")
Version: %{version} **Line 23**
Ama
olsun%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
Bunlar iyi çalışmaz, Bu yüzden onu başarısız olmasına neden şu olabilir hiçbir fikrim yok:
error: line 23: Empty tag: Version:
şeyler şimdiye kadar test ettik. Spec dosyasındaki etiketi tanımlamak için aynı şeyi aradığımda başarısız olma ihtimali olan herhangi bir fikir var mı?
Ben terminali denilen çalışır bu
echo "$(sed -n 's|^[ ]*appVersion = "\(.*\)"|\1|p' <<< "appVersion = \"1.2-SNAPSHOT\"" | sed 's/^\(.*\)-.*$/\1/')"
benziyor böylece gerçek değeri ile dosya adı yerine ancak çalıştı
Güncelleme olarak
%(echo "$(sed -n 's|^[ ]*appVersion = "\(.*\)"|\1|p' <<< "appVersion = \"1.2-SNAPSHOT\"" | sed 's/^\(.*\)-.*$/\1/')")
ama Yine de
Empty tag: Version: Error
Güncelleme
2 Sonra echo "12"
farklı daha karmaşık komut test:
%define version %(echo "$(git log -1 | grep commit | awk -F"commit " '{print $2}' | cut -c1-8)")
Bu Tamam çok çalışıyor! Versiyonu, commit hashının ilk 7 rakamını yapar.
Güncelleme 3 sır bu komut varsa neden ama şu komutla bu böyle sed komutu bana sürümü olarak 1.2
%define version %(echo "$(sed 's/.*= //' <<< "appVersion = 1.2")")
verirse, ben bir test kontrol etmek etmedi devam
Çalışır ama benim ilk değil, o zaman onun ilk komutunda sadece terminalde doğrudan çağrıldığında ve% (cmd) olarak değilken çalışan bir şeyle olması gerekir. Yakınlaşmak! o -n
veya rpmbuild sevmez s| | \1 |p
sözdizimi olabilir gibi
Ben, meraklı olmalı Ne izole gibi görünüyor böylece Güncelleme 4
Tamam, görünüyor. Orijinalimin daha basit bir sürümünü yaptım.Şuna göz atın:
#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")")
ben artık izole etmek ve sorunu anlamaya yapabilirsiniz sanmıyorum maalesef gerçi. İkinci komutun stilinde bir sed kullanılarak yanlış bir şey yok ama yine de ilk komutun neden çalışmadığına dair çok ilginç.
Güncelleme 5
ben bir spec dosyası ve rpmbuild ile% içinde herhangi komut() ile çalışırken burada bazı derin sorunu olduğunu keşfettiler. Ne olacağını görmek için awk kullanmayı denedim ve çok kırdı! Bu Başlangıçta bir komplo keşfetmek gibi, düşünce sonra yolu derine gider:
#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:
Güncelleme İyi haber ve herkes için kötü haber, ben rpm kendi işleriniyapıyordu gibi görünüyor bulundu
%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 ""
Yani şimdi bir ayarlama yapılmış ve bu adlandırılan:
012.351 ne onun yaptığını gösteren arka plan içinde değil, sonunda rpm ile çağrıldığında farklı değerler veren bir komutu bulundu#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)
Buna bakmadan, ilk sed komutumun sonucunun rpm'den ayrıştırıldığı sahnelerin benzer bir arka planı olduğunu düşünüyorum. Yolumuzu rpm yapacağız!
%define version %(echo "$(awk '/ appVersion =/{ print $3 }' /filepath/values.txt" | sed 's/\"//g' | cut -d'-' -f1)
Bu benim ilk komutu ile aynı şeyi yapar ve ayar specfile içinde çalışır:
Ateşkes rpm ile yapıldı
son bilgilendirme, bunun yerine bu komutu kullanmak için gidiyorum sürüm numarası doğru. İlk komutun neden çalışmadığına dair herhangi bir tahminde bulunursanız, onu okumaktan heyecan duyarım. Barış!
'/ fullfilepath/values.txt' ile ilgili izin sorunu nedeniyle olabilir. Bunu gerçek (veya basitleştirilmiş) değerle değiştirmeyi deneyin. –