У меня есть файл RPM Spec, основанный на rhel7 с rpmbuild, где я хотел бы определить версию с помощью script.
Я читаю здесь http://www.techrepublic.com/article/rpmproc-spec-file/, что я могу сделать это:
%define version 1.2
Version: %{version}
И здесь Файл спецификации RPM - возможно ли динамическое заполнение переменной файла spec, которую я могу определить с помощью script:
%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
Они работают хорошо, поэтому я понятия не имею, что это может быть, из-за чего он терпит неудачу. Любые идеи, которые могут быть причиной его неудачи, когда я называю то же самое в определении тега в spec файле?
Обновление
Я попытался заменить имя файла фактическим значением, чтобы оно выглядело как
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)")
Это тоже работает! Делает версию 7 первых цифр хэша фиксации.
Обновление 3
Тайна продолжается, я сделал тест, чтобы проверить, является ли его команда sed причиной, но следующая команда дает мне 1.2 в качестве версии
%define version %(echo "$( sed 's/.*= //' <<< "appVersion = 1.2" )")
Если эта команда работает, но не моя первая, то она должна быть с чем-то в моей первой команде, которая работает только при вызове непосредственно в терминале, а не в% (cmd). Подходите ближе!
Обновление 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 в стиле второй команды, но его все еще очень интересно, почему первая команда не работает.
Обновление 5
Я обнаружил, что здесь существует некоторая глубокая проблема при работе с любым script внутри%() с spec файлом и rpmbuild. Я попытался использовать awk, чтобы посмотреть, что произойдет, и это тоже сломается! Это происходит гораздо глубже, чем я первоначально думал, как открытие заговора:
#In terminal it prints 1.2-SNAPSHOT, but in Spec it 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)
Поэтому, глядя на это, я думаю, что, возможно, есть аналогичный вид за кулисами, анализирующий результат моей первой команды sed от rpm. У нас будет номер rpm!
Окончательное обновление
Перемирие было сделано с rpm, я собираюсь использовать эту команду вместо:
%define version %(echo "$(awk '/ appVersion =/{ print $3 }' /filepath/values.txt" | sed 's/\"//g' | cut -d'-' -f1)
Он делает то же самое, что и моя первая команда, и работает внутри specfile, правильно устанавливая номер версии. Если кто-нибудь догадывается, почему первая команда не будет работать, я был бы в восторге от ее чтения. Мир!