eval не выполняется синхронно? - PullRequest
0 голосов
/ 22 мая 2019

У меня есть очень простая цель сборки, такая как

prod:
    packr
    mkdir -p build/public
    cp -r client/public/* build/public/
    minify -o build/public/index.html client/public/index.html
    minify -o build/public/app.js client/public/app.js
    minify -o build/public/normalize.css client/public/normalize.css
    gump patch -m "new release!"
    $(eval TAG=$(shell git tag -l --sort -version:refname | head -n 1))
    packr build -o build/pm -ldflags "-X main.Version=prod -X main.Tag=$(TAG)"
    rm -fr build/public

У меня проблема с этими тремя строками, в частности

    gump patch -m "new release!"
    $(eval TAG=$(shell git tag -l --sort -version:refname | head -n 1))
    packr build -o build/pm -ldflags "-X main.Version=prod -X main.Tag=$(TAG)"

В простом тексте, он бьет по тегам GIT, последнийверсия, сборка.

Однако по какой-то причине я пока не понимаю, Makefile присваивает TAG = tagref-1, другими словами, предыдущую версию, а не вновь созданную.

Этоведет себя так, как если бы переменная была задана до того, как произошел удар.

Я ожидал, что назначение TAG получит последний номер тега, созданный с помощью предыдущей команды удара.

1 Ответ

1 голос
/ 22 мая 2019

Редко уместно использовать make функции в рецептах правил.Проблема (кроме того, что функции не переносимы на make с, кроме GNU) заключается в том, что функции выполняются , когда make читает файл , тогда как люди, использующие их в рецептах, как правило, ищут ихбыть выполненным, когда рецепт бежит.В некоторых случаях это не имеет значения, но ваш случай не относится к таким случаям.

Неясно, какое преимущество вы ищите, назначая новый тег переменной make вместо ее непосредственного использования:

    gump patch -m "new release!"
    packr build -o build/pm -ldflags \
        "-X main.Version=prod -X main.Tag=$$(git tag -l --sort -version:refname | head -n 1)"

В этой альтернативе определение текущего тега откладывается для оболочки, когда она обрабатывает команду packr, поэтому она получит версию с того времени.

Если вам нужен тег для использования в другом месте, то, вероятно, ваши лучшие альтернативы:

  • прочитайте оригинальную версию и предскажите новую, возможно что-то вроде этого:

    TAG = $(shell expr $$(git tag -l --sort -version:refname | head -n 1) + 1)
    
  • добавить новую цель, которая будет содержать вычисленную версию, и правило для ее построения, и интегрировать ее в свою сборку

  • определять тег заново каждый раз, когда вам это нужно (поднимая его только в первый раз)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...