我使用makefile使用亚马逊的CLI将静态内容部署到s3存储桶。我想输入一个变量来选择目标目的地,所以我不需要在不同的make动词中重复相同的脚本。
我似乎已经让它工作但我想在终端执行时使该参数不区分大小写。这就是我所拥有的:
S3_NAME_DEV = com-mydomain-application-dev
S3_NAME_LIVE = com-mydomain-application
deploy:
# e.g. make deploy t=LIVE
aws s3 sync dist/ s3://$(S3_NAME_${t})
我尝试添加两个插入符号(bash 4支持,我使用的是$(S3_NAME_${t^^})
但是不起作用:/。这是{I} $ make deploy t=live
(变量刚刚消失)时的输出。
$ make deploy t=live
# e.g. make deploy t=LIVE
aws s3 sync dist/ s3://
我认为包含aws命令的外观可能很有用(这样不知道AWS CLI不会让你失望)。
aws s3 sync dist/ s3://com-mydomain-application
在shell中我调用make
,我可以成功完成此操作:
$ t=live
$ echo ${t^^}
LIVE
非常感谢任何帮助。
奖励积分:设置默认值
所以make并没有像我想象的那样继承执行它的bash。如果我在make文件中@echo "my version is: $$BASH_VERSION"
,我得到版本3.2(OS X默认)。修复此问题的好机会将解决问题。
答案 0 :(得分:0)
我尝试添加两个插入符号(bash 4支持,我使用的是
$(S3_NAME_${t^^})
但是不起作用。
这是因为$(S3_NAME_...)
部分正在通过make进行扩展,而您希望${t^^}
部分可以按bash
进行扩展,但bash
部分不会被make
扩展。 1}}扩展变量。
在makefile的早期将t
转换为大写:
override t := $(shell X="${t}"; echo $${X^^})
如果没有override
,则需要一个新的变量名称:
u := $(shell X="${t}"; echo $${X^^})
# use ${u} instead of ${t}