Подтвердить что ты не робот

Один предваряющий для нескольких задач в 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 только? Или я вынужден написать то же самое предважное для обеих этих задач?

4b9b3361

Ответ 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);