Один предваряющий для нескольких задач в package.json
Я использую Terraform для проекта, и у меня есть две задачи в моем package.json
для запуска terraform plan
и terraform apply
.
"scripts": {
"tf:apply": "terraform apply",
"tf:plan": "terraform plan"
}
Для обеих этих команд мне нужно сначала выполнить terraform get
. Я хотел бы иметь только один pretask
для них обоих.
Я попытался использовать:
"scripts": {
"pretf:*": "terraform get",
"tf:apply": "terraform apply",
"tf:plan": "terraform plan"
}
Но это не сработает.
Есть ли способ достичь этого, используя NPM
или Yarn
только? Или я вынужден написать то же самое предважное для обеих этих задач?
Ответы
Ответ 1
Я обычно хожу так:
"scripts": {
"tf:get": "terraform get",
"tf:apply": "npm run tf:get && terraform apply",
"tf:plan": "npm run tf:get && terraform plan"
}
Это еще один вариант, который подделывает своего рода "tf:*"
prehook. Только для неясных загадочных npm
ниндзя и не рекомендуется:
"scripts": {
"pretf": "terraform get",
"tf": "terraform",
"tf:apply": "npm run tf -- apply",
"tf:plan": "npm run tf -- plan"
}
(используйте его с npm run tf:plan
или напрямую с любым аргументом npm run tf -- whathever
)
Ответ 2
Вы пытались управлять им напрямую, используя node?
Вы можете связать события внутри вашего package.json напрямую с сценариями node и внутри сценариев node, вы можете выполнить свои команды терраформирования и свой общий код следующим образом:
var exec = require('child_process').exec;
var cmd = 'terraform apply';
// common code
exec(cmd, function(error, stdout, stderr) {
// command output is in stdout
});
Вы также можете просто использовать один единственный node script, который принимает параметр, чтобы указать, какую задачу terraform выполнить, определить свой общий код внутри script, а затем выполнить правильную команду в зависимости от параметра:
"scripts": {
"tf:apply": "node myscript.js --param=apply",
"tf:plan": "node myscript.js --param=plan"
}
Затем внутри node вы можете получить доступ к своему параметру следующим образом:
console.log(process.argv.param);