2015-11-18 14 views
10

У меня есть файл спецификации RPM, построенный на rhel7 с rpmbuild, где я хотел бы определить версию со сценарием.Определить версию со скриптом в файле спецификации RPM

Я прочитал здесь http://www.techrepublic.com/article/rpmproc-spec-file/, что я могу это сделать:

%define version 1.2 

Version: %{version} 

А вот RPM spec file - Is it possible to dynamically populate a spec file variable, что я могу определить с помощью сценария:

%define whoami %(cmd) 

Так что я попытался сделать это в моей Spec Файл:

%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 

Они работают хорошо, поэтому я понятия не имею, что это может быть Thats, заставляя его неудачу. Любые идеи, которые могут быть причиной его неудачи, когда я называю то же самое в определении тега в spec-файле?

Update

Я попытался заменить имя файла с фактическим значением, так это выглядит, как этот

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 

Update 2

Я проверил другую более сложную команду, то echo "12":

%define version %(echo "$(git log -1 | grep commit | awk -F"commit " '{print $2}' | cut -c1-8)") 

Это работает слишком хорошо! Делает версию 7 первых цифр хэша фиксации.

Update 3

Тайна продолжается, я тест, чтобы проверить, если его СЭД команда Thats причина, но следующей команды дает мне 1.2 в качестве версии

%define version %(echo "$(sed 's/.*= //' <<< "appVersion = 1.2")") 

Если эта команда работает, но не мой первый, то он должен быть с чем-то в моей первой команде, которая работает только при вызове непосредственно в терминале, а не в% (cmd). Подходите ближе!

Update 4

Хорошо, так что я, кажется, выделили то, что оно должно быть, любопытно, похоже, может быть -n или s| | \1 |p синтаксис, который rpmbuild не нравится. Я сделал более упрощенную версию моего оригинала.Проверьте это:

#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")") 

К сожалению, хотя я не думаю, что могу сделать больше, чтобы изолировать и выяснить, в чем проблема. Нет ничего плохого в использовании sed в стиле второй команды, но его все еще очень интересно, почему первая команда не работает.

Update 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: 

Update 6

Хорошие и плохие новости для всех, я обнаружил, что обороты, кажется, делает некоторые из его собственной работы в и не фоном, показывая, какой ее делают, я наконец нашел команду, которая дает различные значения при вызове через оборотов в минуту:

%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) 

Так что, если посмотреть на это, я думаю, что, возможно, подобный вид заглатывает результат моей первой команды sed от rpm. У нас будет наш путь rpm!

Final Update

Перемирие было сделано с оборотов в минуту, я собираюсь использовать эту команду вместо:

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

Он делает то же самое, как моя первая команда и работает внутри файла спецификации установив номер версии правильно. Если кто-нибудь догадывается, почему первая команда не будет работать, я был бы в восторге от ее чтения. Мир!

+0

Возможно, из-за проблемы с разрешением '/ fullfilepath/values.txt'. Попробуйте заменить это фактическим (или упрощенным) значением. –

ответ

1

У вас должен быть сценарий оболочки, который вызывает команду rpmbuild. Вы можете использовать этот скрипт для вычисления версии (или, если на то пошло, любой команды, которую вы пытаетесь использовать в файле спецификации rpm).

Изменить исходный код,

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

к,

%define version _VERSION_ 
Version: %{version} 

и СЭД VERSION к его расчетному значению в скрипт, который вызывает rpmbuild (перед вызовом rpmbuild). После того, как фактическое содержимое спецификации сбрасывается в некоторый файл, передайте этот сгенерированный файл в rpmbuild в том же сценарии оболочки.

Вот краткое изложение этапов:

Если у вас есть строитель.ш сценарий оболочки, который вызывает rpmbuild, выполните следующие шаги:

  1. Обновить файл вашей спецификации, чтобы иметь версию заполнитель строки/макрос как показано выше
  2. Переместить текущие обороты файла спецификации для my_package_template.spec
  3. в строитель .sh, запустите команду (ы), чтобы получить вашу версию и сохранить версию переменной
  4. Использование SED команды на my_package_template.spec файл заменить VERSION этой компьютерной версии, и сохраните SED вывод my_package.spec
  5. Передайте команду my_package.spec команде rpmbuild.

Повторите шаги 1, 3 и 4 для замены использования любых других команд оболочки внутри вашего файла спецификации.

+4

'rpmbuild' позволяет устанавливать переменные из командной строки, и это намного проще, чем требовать' sed' и временные файлы. –

1

Я бы сделал сценарий оболочки. Это позволяет вам решать такие вещи, как если это регулярный выпуск или разработка, и т. Д. Затем вы можете передать переменные с помощью опции --define - см. this question for more options.

 Смежные вопросы

  • Нет связанных вопросов^_^