目标中的第二个依赖性 first-deploy
不执行。
如果我执行 make first-deploy
, 使得只执行第一个依赖 - build-proxy-base
成功后退出。
Makefile。
UID=`id -u`
GID=`id -g`
NODE_N=node
PROXY_N=proxy
PY_N=py
DOCKER_D=docker
PROXY_D=skif-proxy
NODE_D=skif
PY_D=skif-proxy/template-service
# first is default
default: first-deploy docker-compose-up
docker-compose-up:
cd $(DOCKER_D) && \
docker-compose up --build && \
cd ..
build-docker-base:
docker build \
--build-arg UID=${UID} \
--build-arg GID=${GID} \
-f ${D}/Dockerfile.base \
--rm \
-t skif-${SERV_N}-base ${D}
build-node-base: D := ${NODE_D}
build-node-base: SERV_N := ${NODE_N}
build-node-base: build-docker-base
build-proxy-base:D=${PROXY_D}
build-proxy-base:SERV_N=${PROXY_N}
build-proxy-base: build-docker-base
build-py-base: D=${PY_D}
build-py-base: SERV_N=${PY_N}
build-py-base: build-docker-base
first-deploy: build-proxy-base build-py-base build-node-base
UPD我明白 build-docker-base
构建只有一次,但我如何在两个目标中用其他参数重用它的代码?
make肯定考虑了第二个依赖关系。 如果它没有 "执行",那么意味着make决定不需要做任何事情来执行它。
我可以看到这一点。
build-proxy-base: build-docker-base
...
build-node-base: build-docker-base
这两个目标都把同一个目标列为先决条件,而且它们不做任何其他事情。 在make中,一个给定的目标(比如 build-docker-base
)每次调用只会被make建立一次。 一旦make建立了一次,无论有多少其他目标依赖于它,它都会被认为是最新的。
因此,make认为 build-node-base
,看到它已经被更新,由于。build-proxy-base
并决定没有其他事情可做。
既然你没有真正告诉我们 build-node-base
规则或解释你想做什么,我们不能确定更多的东西。
ETA 根据你更新的 makefile,你似乎试图把目标当作函数,通过把它们列为先决条件来调用。 它们不是,也不能。
在我看来,你只是想用不同的参数多次运行同一个配方。 我认为你应该这样写。
build-node-base build-proxy-base build-py-base:
docker build \
--build-arg UID=${UID} \
--build-arg GID=${GID} \
-f ${D}/Dockerfile.base \
--rm \
-t skif-${SERV_N}-base ${D}
build-node-base: D := ${NODE_D}
build-node-base: SERV_N := ${NODE_N}
build-proxy-base:D=${PROXY_D}
build-proxy-base:SERV_N=${PROXY_N}
build-py-base: D=${PY_D}
build-py-base: SERV_N=${PY_N}
既然没有任何配方 build-proxy-base
或 build-node-base
两者都是假的,不清楚你是如何得出结论的。build-node-base
是不,事实上,建。
我怀疑,实际的观察是,目标 build-docker-base
每次只建一次 make
运行,并且该构建反映了变量的值。D
和 SERV_N
边建边设 build-proxy-base
. 这与目标是否 build-node-base
是建成的,和很多的事实有关。make
每个目标每次运行最多建立一次。