Как я могу условно выполнить команду Sequelize seed data в docker compose с переменной в пакете. json (или где-то еще)? - PullRequest
0 голосов
/ 28 января 2020

Я настроил мой nodejs + mysql rest-api с sequelize orm и установлен в docker -compose. Часть сценария моего пакета. json выглядит следующим образом:

"scripts": {
    "babel": "babel",
    "test": "echo \"Error: no test specified\" && exit 1",
    "migration": "npx sequelize-cli db:migrate",
    "seed": "npx sequelize-cli db:seed:all",
    "start": "",
    "check-types": "tsc",
    "babel:node": "./node_modules/.bin/babel-node --presets=@babel/env --extensions '.js,.ts'",
    "dev": "npm run migration && npm run seed && nodemon --exec npm run babel:node -- app.ts"
}

И у меня есть CMD [ "npm", "run", "dev" ] в моем DockerFile, который будет запускать сценарий dev. Тем не менее, я хочу условно выполнить начальную команду в соответствии с переменной, которую я предоставил в package.json, я ожидаю что-то вроде:

"scripts": {
    ..., // same as above
    "enableSeed": true,
    "dev": `npm run migration ${enableSeed? "&& npm run seed" : ""} && nodemon --exec npm run babel:node -- app.ts`
}

Но это не сработает из-за синтаксиса, любое решение для достижения this?

ОБНОВЛЕНИЕ 1

Попробовал это согласно предложению @ slideshowp2

"dev-seed": "npm run migration && npm run seed-reset && nodemon --exec npm run babel:node -- app.ts"
"dev-no-seed": "npm run migration && nodemon --exec npm run babel:node -- app.ts"
"ENABLE_SEED": "false"
"dev": "if [[ ${npm_package_scripts_ENABLE_SEED} == \"true\" ]]; then echo 'dev-seed'; else echo 'dev-no-seed'; fi"

Но я получил

sh: 1: [[: not found 

, что, кажется, означает dev-no-seed не найден

ОБНОВЛЕНИЕ 2

Я действительно придумаю готовое решение, подобное этому:

{
  "seed": "npx sequelize-cli db:seed:all",
  "unseed": "npx sequelize-cli db:seed:undo:all",
  "seed-reset": "npm run unseed && npm run seed ",
  "dev-seed": "npm run migration && npm run seed-reset && nodemon --exec npm run babel:node -- app.ts",
  "dev-no-seed": "npm run migration && nodemon --exec npm run babel:node -- app.ts",
  "dev": "npm run dev-no-seed" // <----switch between dev-seed and dev-no-seed
}

1 Ответ

0 голосов
/ 12 февраля 2020

Вы можете использовать условные операторы сценария оболочки, основанные на значении переменных среды. Например,

  "scripts": {
    "test": "jest",
    "dev": "if [[ ${ENABLE_SEED} == \"true\" ]]; then echo 'migration' && echo 'seed' && echo 'nodemon'; else echo 'migration' && echo 'nodemon'; fi"
  },

npm run dev:

> if [[ ${ENABLE_SEED} == "true" ]]; then echo 'migration' && echo 'seed' && echo 'nodemon'; else echo 'migration' && echo 'nodemon'; fi

migration
nodemon

Включить начальное число, запустить ENABLE_SEED=true npm run dev:

> if [[ ${ENABLE_SEED} == "true" ]]; then echo 'migration' && echo 'seed' && echo 'nodemon'; else echo 'migration' && echo 'nodemon'; fi

migration
seed
nodemon

Или вы можете запустить скрипт npm на основе значений переменных, определенных в package.json:

  "scripts": {
    "test": "jest",
    "ENABLE_SEED": "false",
    "dev": "if [[ ${npm_package_scripts_ENABLE_SEED} == \"true\" ]]; then echo 'migration' && echo 'seed' && echo 'nodemon'; else echo 'migration' && echo 'nodemon'; fi"
  },

С ENABLE_SEED=false, Выполнить npm run dev:

> if [[ ${npm_package_scripts_ENABLE_SEED} == "true" ]]; then echo 'migration' && echo 'seed' && echo 'nodemon'; else echo 'migration' && echo 'nodemon'; fi

migration
nodemon
  "scripts": {
    "test": "jest",
    "ENABLE_SEED": "true",
    "dev": "if [[ ${npm_package_scripts_ENABLE_SEED} == \"true\" ]]; then echo 'migration' && echo 'seed' && echo 'nodemon'; else echo 'migration' && echo 'nodemon'; fi"
  },

С ENABLE_SEED=true, выполнить npm run dev:

> if [[ ${npm_package_scripts_ENABLE_SEED} == "true" ]]; then echo 'migration' && echo 'seed' && echo 'nodemon'; else echo 'migration' && echo 'nodemon'; fi

migration
seed
nodemon

Правило ссылки на переменную, определенную в package.json, равно npm_package_<namespace>_Your custom variable.

В этом случае namespace равно scripts. Таким образом, мы можем ссылаться на ENABLE_SEED, используя npm_package_scripts_ENABLE_SEED.

Если сценарий оболочки становится более сложным, вам лучше извлечь их в файл .sh.

...