一个提示是避免使用 make 的 shell 结构。一步一步来。
对于 get 操作,我们为每个参数编码一个目标。所以对于参数p1(比如说),我们发明了一个目标params-get<p1>。我们注意到,在配方(即 shell 命令)内部,$@ 将扩展为 params-get<p1>。因此${@:params-get<%>=%} 将扩展为p1。
用 make 语法写出来:
.PHONY: params-get<p1>
params-get<p1>:
@aws ssm get-parameter --name ${@:params-get<%>=%} --with-decryption | jq -c -r .Parameter.Value
我注意到,使用中间变量,我们可以拥有与您在之前的咒语中使用的完全相同的配方。
PARAM = ${@:params-get<%>=%}
.PHONY: params-get<p1>
params-get<p1>:
@aws ssm get-parameter --name ${PARAM} --with-decryption | jq -c -r .Parameter.Value
如果我们有第二个参数pa(比如说),那很容易添加:
PARAM = ${@:params-get<%>=%}
.PHONY: params-get<p1> params-get<pa>
params-get<p1> params-get<pa>:
@aws ssm get-parameter --name ${PARAM} …
我希望你能在这里看到一些样板。
转向一些更动态生成的make,而不是硬编码每个参数,让我们将所有可能的参数放在一个名为$PARAMS的列表中
PARAMS := p1 pa another
get-targets := ${PARAMS:%=params-get<%>}
PARAM = ${@:params-get<%>=%}
.PHONY: ${get-targets}
${get-targets}:
@aws ssm get-parameter --name ${PARAM} …
.PHONY: params-get
params-get: ${get-targets}
echo $@ Done
我已添加您原来的params-get 目标。现在所有工作都由依赖项完成。
- 看不到外壳循环。
- 每个
aws ssm get-parameter 的退出代码由make 检查。
- 代码是并行安全的:make -j9 将并行运行 9 个作业,直到工作耗尽。如果你有 8 个 CPU,那就太好了。 (如果您的 make 不是并行安全的,那么它就是 broken。)
我们现在已经很接近了。我们只需确保将$PARAMS 设置为ssm get-parameters-by-path 的输出。
类似:
.PHONY: params-list
params-list:
@aws ssm get-parameters-by-path --path /${SERVICE}/${ENV} | jq -c -r '.Parameters[] | .Name'
PARAMS := $(shell ${MAKE} params-list)
get-targets := ${PARAMS:%=params-get<%>}
PARAM = ${@:params-get<%>=%}
.PHONY: ${get-targets}
${get-targets}:
@aws ssm get-parameter --name ${PARAM} --with-decryption | jq -c -r .Parameter.Value
.PHONY: params-get
params-get: ${get-targets}
echo $@ Done
绝对不喜欢使用$(shell …),但这只是一个草图。