让我假装我有两个服务器A和B,我希望能够在Makefile目标中单独和一起部署。我们还要说有一个准备步骤,我希望在任何部署之前运行一次,无论是一个还是两个。我怎么能这样做?
这是我到目前为止所拥有的,但它不是干的。
clean:
# do cleanup stuff
deploy:
make clean
ssh $(SERVER) do-remote-deployment-stuff
deploy-to-a:
deploy SERVER=myservera
deploy-to-b:
deploy SERVER=myserverb
deploy-all:
deploy-to-a
deploy-to-b
看看它如何运行'干净'两次?
答案 0 :(得分:3)
不要使用递归,只需将目标只想作为先决条件运行一次:
deploy-to-a: clean
...
deploy-to-b: clean
...
但是,您尝试设置SERVER =等不会有效,您的deploy-all
规则也不会。你不能把制作目标放到制作食谱中。您可以使用模式规则:
SERVERS = A B
A_SERVER = myservera
B_SERVER = myserverb
deploy-all: $(SERVERS:%=deploy-to-%)
deploy-to-%: clean
ssh $($*_SERVER) do-remote-deployment-stuff
clean:
# do cleanup stuff
答案 1 :(得分:1)
您可以将clean
目标指定为其他目标的依赖关系。为了让它保持干爽,你可以在Makefile
:
SERVERLIST = myservera myserverb
.PHONY: clean deploy-all $(SERVERLIST)
clean:
# do cleanup stuff
$(SERVERLIST): clean
ssh $@ do-remote-deployment-stuff
deploy-all: $(SERVERLIST)
您可以使用SERVERLIST
变量定义任意数量的服务器。
运行make -n deploy-all
会显示将要运行的命令:
# do cleanup stuff
ssh myservera do-remote-deployment-stuff
ssh myserverb do-remote-deployment-stuff
要部署到一台服务器,您可以运行make myservera
等。您当然可以创建一个"别名"对于您的服务器:
SERVERLIST = my.longservername.com someother.server.somewhere.else.com
myservera: someother.server.somewhere.else.com