Knex: dotenv์™€ ํ•จ๊ป˜ knex ์‚ฌ์šฉ

์— ๋งŒ๋“  2014๋…„ 12์›” 04์ผ  ยท  19์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: knex/knex

์•ˆ๋…•ํ•˜์„ธ์š”,
์™€ Knex ๋ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ / ์”จ์•— CLI๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ด dotenv์€ ?

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ๊ณ  ์—ฌ๊ธฐ์— ์˜ฌ ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ๋‚ด๊ฐ€ํ•˜๋Š” ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค (๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ๋งค๋ ฅ์ฒ˜๋Ÿผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค!)

require('dotenv').config({path: 'path_to_env_file'});

module.exports = {
  client: 'pg',
  connection: {
    host: process.env.DB_HOST,
    user: process.env.DB_USER,
    password: process.env.DB_PASS,
    database: process.env.DB_NAME
  }
};

๋ชจ๋“  19 ๋Œ“๊ธ€

knexfile ๋ฅผ ๋งŒ๋“ค๊ณ  ์ƒ๋‹จ์—์„œ dotenv๋ฅผ ํ˜ธ์ถœํ•œ ๋‹ค์Œ(https://github.com/motdotla/dotenv#usage) process.env ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์„ฑ์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๋ณด๋‚ด๊ธฐ ํ•ด์‹œ์˜ ์˜ฌ๋ฐ”๋ฅธ ํ‚ค๋ฅผ ์ฑ„์šฐ๋ ค๋ฉด ์ด์™€ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

var dotenv = require('dotenv');
dotenv.load();

module.exports[process.env.NODE_ENV] = {
    client: 'mariasql',
    connection: {
        host: process.env.DB_HOST,
        user: process.env.DB_USERNAME,
        password: process.env.DB_PASSWORD,
        db: process.env.DB_NAME,
        charset: 'utf8'
    },
    pool: {
        min: 2,
        max: 10
    },
    migrations: {
        tableName: 'knex_migrations'
    }
};

์˜ณ์€

๊ทธ๊ฒƒ์€ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜๊ณ  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ ๋‚ด๊ฐ€ ์„ค์ •ํ•œ ๊ฒƒ๊ณผ ์ƒ๊ด€์—†์ด ์—ฌ์ „ํžˆ ๊ธฐ๋ณธ ํ™˜๊ฒฝ(๊ฐœ๋ฐœ)์„ ์ฐพ์Šต๋‹ˆ๋‹ค.

#527 ์ฐธ์กฐ

๋‚ด๊ฐ€ ๋ณ‘ํ•ฉํ•œ ์ดํ›„๋กœ ๋ฆด๋ฆฌ์Šค๊ฐ€ ์—†์—ˆ์ง€๋งŒ ๊ทธ๊ฒƒ์ด ์ด์ƒ์ ์œผ๋กœ๋Š” ๋‹น์‹ ์ด ์›ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ™˜๊ฒฝ์€ ์ด์ƒํ•œ ๊ธฐ๋Šฅ์ด๋ฉฐ ๋” ๋‚˜์€ ์†”๋ฃจ์…˜์€ ๊ตฌ์„ฑ ๊ณ„์ธต ๋„๊ตฌ(dotenv๋Š” ๊ฐ„๋‹จํ•œ ๋„๊ตฌ์ž„)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ๋ชจ๋“  ํ™˜๊ฒฝ์„ ๋™์ผํ•œ ๊ฐœ์ฒด๋กœ ์„ค์ •ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

exports.development = exports.production = exports.otherEnv = configObject;

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ๊ณ  ์—ฌ๊ธฐ์— ์˜ฌ ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ๋‚ด๊ฐ€ํ•˜๋Š” ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค (๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ๋งค๋ ฅ์ฒ˜๋Ÿผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค!)

require('dotenv').config({path: 'path_to_env_file'});

module.exports = {
  client: 'pg',
  connection: {
    host: process.env.DB_HOST,
    user: process.env.DB_USER,
    password: process.env.DB_PASS,
    database: process.env.DB_NAME
  }
};

@mbavio ๋•๋ถ„์— ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์ €์—๊ฒŒ ๋ฌธ์ œ๋Š” knexfile.js๊ฐ€ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์•„๋‹Œ ํ”„๋กœ์ ํŠธ์˜ ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฒฝ๋กœ๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š๊ณ ๋Š” ๋‚ด .env ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ํ•œ ๋ฒˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

knex migrate:currentVersion ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๊ณ  ํ•  ๋•Œ .env ํŒŒ์ผ์—์„œ ๋กœ๋“œ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

npm ์Šคํฌ๋ฆฝํŠธ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์‹คํ–‰ํ•˜๋ ค๊ณ  ํ•  ๋•Œ๋„ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๋ฅผ node -r dotenv/config ./node_modules/knex/bin/cli.js migrate:latest ๋ณ€๊ฒฝํ•˜๋ฉด ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„ knex๋ฅผ ์ž๋™ ๋ชจ๋“œ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ”„๋กฌํ”„ํŠธ ํ™˜๊ฒฝ์„ ํ†ตํ•ด ๋ฌป์ง€ ์•Š๊ณ  ssh๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ ๋จธ์‹ ์— ๋ฐฐํฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@kcheang ํŠนํžˆ dotenv_config_path ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์ผ๋ฐ˜ ๋ช…๋ น๊ณผ ํ•จ๊ป˜ ํ•ด๋‹น ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Babel(ES6)์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

```์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ
'dotenv'์—์„œ dotenv ๊ฐ€์ ธ์˜ค๊ธฐ;
dotenv.config();

๋‚ด๋ณด๋‚ด๊ธฐ ๊ธฐ๋ณธ require('knex')({
๋””๋ฒ„๊ทธ: ์‚ฌ์‹ค,
ํด๋ผ์ด์–ธํŠธ: 'mysql',
์—ฐ๊ฒฐ: {
ํ˜ธ์ŠคํŠธ: process.env.DB_HOST,
์‚ฌ์šฉ์ž: process.env.DB_USER,
๋น„๋ฐ€๋ฒˆํ˜ธ: process.env.DB_PW,
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค: process.env.DB,
๋ฌธ์ž ์ง‘ํ•ฉ: 'utf8',
}
});

@gerbus ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋ฐ ์‹œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

npm ์Šคํฌ๋ฆฝํŠธ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์‹คํ–‰ํ•˜๋ ค๊ณ  ํ•  ๋•Œ๋„ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๋ฅผ node -r dotenv/config ./node_modules/knex/bin/cli.js migrate:latest ๋ณ€๊ฒฝํ•˜๋ฉด ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์€ ๋นŒ์–ด๋จน์„ ์ฒœ์žฌ์ž…๋‹ˆ๋‹ค

๋‹ค์Œ์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
env $(cat .env) knex migrate:latest

์ „์—ญ์ ์œผ๋กœ knex๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
env $(cat .env) ./node_modules/knex/bin/cli.js migrate:latest

@RaimoJohanson ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๋” ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์€

env $(cat .env) ./node_modules/.bin/knex migrate:latest

๋˜๋Š” NPM ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ:

env $(cat .env) knex migrate:latest (.bin ๋””๋ ‰ํ† ๋ฆฌ๋Š” npm ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ž๋™์œผ๋กœ ํ™•์ธ๋จ)

@Jakobud Node๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ npm ์Šคํฌ๋ฆฝํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” .bin ๋””๋ ‰ํ† ๋ฆฌ์— ๋Œ€ํ•ด ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

@Jakobud ์ด๊ฒƒ์€ Windows์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค

์—ฌ๋Ÿฌ ๊ฐœ์˜ .env ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋ฉด DOTENV_CONFIG_PATH ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์†”๋ฃจ์…˜์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด์—์„œ package.json ๋‚ด๊ฐ€ ๋งŒ๋“  knex ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ทธ ์ง‘์–ด .env ๋ฐ test:knex ๊ทธ์™€ ์ž‘ํ’ˆ .env.test :

"scripts": {
  "knex": "babel-node -r dotenv/config node_modules/.bin/knex",
  "test:knex": "DOTENV_CONFIG_PATH=.env.test npm run knex"
}
์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰