2015-11-18 17 views
10

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ış!

+0

'/ fullfilepath/values.txt' ile ilgili izin sorunu nedeniyle olabilir. Bunu gerçek (veya basitleştirilmiş) değerle değiştirmeyi deneyin. –

cevap

1

rpmbuild komutunu çalan bir kabuk komut dosyası oluşturuyor olmalısınız. Sürümü hesaplamak için bu komut dosyasını kullanabilirsiniz (veya bu nedenle, rpm özellikli dosyada kullanmaya çalıştığınız herhangi bir komut).

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

için,

%define version _VERSION_ 
Version: %{version} 

, orijinal kodunu değiştirin ve (rpmbuild çağırmadan önce) rpmbuild çağıran kabuk komut dosyası içindeki hesaplanan değere VERSION sed

. Gerçek dosya içerikleri bir dosyaya döküldükten sonra, oluşturulan dosyada aynı kabuk komut dosyasında rpmbuild olarak iletilir. Eğer bir inşaatçı var varsayarsak

: Burada

adımların bir özetidir.aşağıdaki yolu takip, rpmbuild çağıran sh kabuk komut dosyası:
  • Taşı geçerli rpm spec dosyasının yukarıda gösterisi olarak VERSİYONU tutucu dize/makro olması

    1. güncelleme spec dosyası oluşturucu
    2. my_package_template.spec için .sh, koşmak komut (lar) sürümü almak ve bu hesaplanan sürümü tarafından vERSION yerine my_package_template.spec dosya üzerinde bir değişken
    3. Kullanım sed komuta sürümünü kaydetmek ve
    4. my_package.spec sed çıkış kaydetmek için
    5. my_package.spec dosyasını rpmbuild komutuna geçirin.

    Örnek dosyanızdaki diğer kabuk komutlarının kullanımını değiştirmek için 1, 3 ve 4 numaralı adımları yineleyin.

  • +4

    'rpmbuild', komut satırından değişkenleri ayarlamaya izin verir ve bu 'sed' ve geçici dosyaları gerektirmekten çok daha kolaydır. –

    1

    Sarmalayıcı komut dosyası yapardım. Bu, düzenli bir sürüm veya bir geliştirme, vb. Gibi şeylere karar vermenizi sağlar. Daha sonra değişkenleri --define seçeneği ile geçirebilirsiniz - bkz. this question for more options.