TL; DR
Зависимость, общая для нескольких целей, вызывается только один раз.
Почему?
Сводка
В этом крошечном примере Makefile
я ожидаю deploy-everywhere
для развертывания staging-repo
кода для подготовки и prod-repo
кода для prod .
Вместо этого подготовки и prod get staging-repo
код, который, по общему признанию, неоптимальный.
Это, кажется, происходит, потому что clone-repo
пропускается / сокращается при повторном рассмотрении, как часть deploy-to-prod
(см. -d
вывод журнала ниже).
Почему это происходит, и можно ли изменить это поведение?
$ cat Makefile
.PHONY: deploy-everywhere deploy-to-prod deploy-to-staging clone-repo
deploy-everywhere: deploy-to-staging deploy-to-prod
@echo "deployed everywhere"
deploy-to-prod: repo="prod-repo"
deploy-to-prod: clone-repo
@echo "deployed to prod (from $(repo))"
deploy-to-staging: repo="staging-repo"
deploy-to-staging: clone-repo
@echo "deployed to staging (from $(repo))"
clone-repo:
@echo "clone-repo $(repo)"
Подробнее (журналы, версия)
Вот результат работы make
:
$ make deploy-everywhere
clone-repo staging-repo
deployed to staging (from staging-repo)
deployed to prod (from prod-repo) <<<<< THIS IS A LIE, WE NEVER CLONED THE PROD REPO!!
deployed everywhere <<<< RIIIIGHT.
Дополнительная регистрация:
$ make -d deploy-everywhere
...
Successfully remade target file `deploy-to-staging'.
Considering target file `deploy-to-prod'.
File `deploy-to-prod' does not exist.
Pruning file `clone-repo'. <<<< WHY? WHY?!?!?!?! WHY.
Finished prerequisites of target file `deploy-to-prod'.
Must remake target `deploy-to-prod'.
...
Я использую GNU Make 3.81:
$ make --version
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
This program built for i386-apple-darwin11.3.0