我有几个AWS lambda函数,我想构建和部署它们并具有以下Makefile
#!/bin/bash
#SHELL:=/bin/bash --login
functions = $(sort $(dir $(wildcard */)))
define deploy
cd $1 && npm deploy-dev
endef
deploy:
$(foreach fn,$(functions),$(eval $(call deploy,$(fn))))
基本上每个函数都是node.js项目,在package.json
中有以下条目 "scripts": {
"deploy-dev": "npm build && rm -rf node_modules && npm i --production --legacy-bundling && AWS_PROFILE=dev SLS_DEBUG=* sls deploy --stage dev --region us-east-1"
cd进入dir
并运行npm deploy-dev
按预期工作,但如何自动执行此操作?
我收到错误:
➜ new_ingest git:(feature/organise) ✗ make deploy (git)-[feature/organise]
Makefile:11: *** missing separator. Stop.
答案 0 :(得分:1)
为了找到问题,我们可以将其减少为一个函数,改变这个:
deploy:
$(foreach fn,$(functions),$(eval $(call deploy,$(fn))))
到此:
deploy:
$(eval $(call deploy,foo))
(其中foo/
是您的目录之一。)现在我们可以看到问题。 $(call ...)
部分扩展为cd foo && npm deploy-dev
。这是一个传递给shell的命令,由Make解释的mot。所以,当你告诉Make eval
时,Make说“这是乱码”。如果删除eval
,它就可以了。
恢复foreach
会导致问题:所有命令都连接成一行(cd foo && npm deploy-dev cd bar && npm deploy-dev ...
)。要解决此问题,您可以破解deploy
:
define deploy
cd $(1) && pwd ; cd - ;
endef
或者您可以修改该方案,为每个功能提供自己的规则。