ããã¯ããªã«ãããããŠæžãããã®ïŒ
Node.jsã§ç°å¢å€æ°ããã¡ã€ã«ããèªã¿èŸŒãããšãã§ããdotenvãšãããã®ããããããã®ã§ãè©ŠããŠã¿ãããšã«ããŸããã
dotenv
dotenvã®GitHubãªããžããªãŒã¯ããã¡ãã
dotenvãããŒã¹ã«ããŠããdotenv-vaultãšãããããã¯ãã®Webãµã€ããèŠããšã
Simplify Your Secrets | Dotenv
dotenvã¯Node.js以å€ã«ãååšããŠããããã§ãã
ä»åã¯Node.jsåãã®dotenvã®ã¿ã«ãã©ãŒã«ã¹ããŸãã
䜿ãæ¹ãšããŠã¯ã.env
ãšãããã¡ã€ã«ãäœæããŠ
.env
S3_BUCKET="YOURS3BUCKET" SECRET_KEY="YOURSECRETKEYGOESHERE"
dotenvã¢ãžã¥ãŒã«ãã€ã³ããŒãããã°ããã¿ããã§ãã
require('dotenv').config() console.log(process.env) // remove this after you've confirmed it is working
ããšã¯process.env.[ç°å¢å€æ°å]
ã§ç°å¢å€æ°ãåç
§ã§ããããã«ãªããŸãã
è€æ°è¡ã®èšè¿°ãã§ããããã§ãã
PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY----- ... Kh9NV... ... -----END RSA PRIVATE KEY-----"
--require
ïŒãŸãã¯-r
ïŒãªãã·ã§ã³ã§ãããªããŒãããããšãã§ããããã§ãã
$ node -r dotenv/config your_script.js
ãªãã·ã§ã³ãã³ãã³ãã©ã€ã³åŒæ°ã§æå®ããã
$ node -r dotenv/config your_script.js dotenv_config_path=/custom/path/to/.env dotenv_config_debug=true
ç°å¢å€æ°ã§æå®ããããšãã§ããããã§ãã
$ DOTENV_CONFIG_<OPTION>=value node -r dotenv/config your_script.js $ DOTENV_CONFIG_ENCODING=latin1 DOTENV_CONFIG_DEBUG=true node -r dotenv/config your_script.js dotenv_config_path=/custom/path/to/.env
ãšãããããè©ŠããŠãã£ãŠã¿ãããšã«ããŸãããã
ç°å¢
ä»åã®ç°å¢ã¯ããã¡ãã
$ node --version v18.16.1 $ npm --version 9.5.1
dotenvã䜿ã£ãŠã¿ã
ã§ã¯ãdotenvã䜿ã£ãŠã¿ãŸãããã
Node.jsãããžã§ã¯ããäœæã
$ npm init -y $ npm i -D prettier
Prettierãå ¥ããŠããŸãã
"devDependencies": { "prettier": "^2.8.8" },
.prettierrc.json
{ "singleQuote": true, "printWidth": 120 }
ãšãããããç°å¢å€æ°ãæšæºåºåã«æžãåºãJavaScriptãæžããŠã¿ãŸãã
print-env.js
console.log(`get env: MY_ENV_VAR = ${process.env.MY_ENV_VAR}`);
å®è¡ã
$ node print-env.js get env: MY_ENV_VAR = undefined
ãã®ç¶æ
ã ãšç°å¢å€æ°ãèšå®ããŠããªãã®ã§åœç¶undefined
ã§ãã
ç°å¢å€æ°ãèšå®ããã°åœç¶ãªããåç §ããŸãã
$ MY_ENV_VAR=Hello node print-env.js get env: MY_ENV_VAR = Hello
ããã§ãããã®ã§ãããç°å¢å€æ°ãè€æ°ãã£ãã䜿çšããå€ãåãæ¿ãããã£ãããããšç
©éã«ãªã£ãŠããŸããã
ããããæã«dotenvã䜿ããšããã®ã ãããšæããŸãã
ãšããããã§ãdotenvãã€ã³ã¹ããŒã«ã
$ npm i dotenv
ã€ã³ã¹ããŒã«ãããdotenvã®ããŒãžã§ã³ã
"dependencies": { "dotenv": "^16.3.1" }
䜿ãæ¹ãšããŠã¯ããŸãã¯.env
ãšãããã¡ã€ã«ãçšæããããã§ãã
.env
MY_ENV_VAR=Hello from dotenv
次ã«ãå ã»ã©ã®JavaScriptãã¡ã€ã«ã«dotenvã®ããŒããè¿œå ããŸãã
print-env.js
require('dotenv').config(); console.log(`get env: MY_ENV_VAR = ${process.env.MY_ENV_VAR}`);
ããã§å®è¡ãããšã.env
ãã¡ã€ã«ã«èšå®ããå
容ãç°å¢å€æ°ã«è¿œå ããŠãããŸãã
$ node print-env.js get env: MY_ENV_VAR = Hello from dotenv
æ瀺çãªè¿œå ãå¿ èŠãªã®ã§ãdotenvãããŒãããŠããéšåãã³ã¡ã³ãã¢ãŠããããš
print-env.js
// require('dotenv').config(); console.log(`get env: MY_ENV_VAR = ${process.env.MY_ENV_VAR}`);
.env
ãã¡ã€ã«ãèªã¿èŸŒãŸãªããªããŸãã
$ node print-env.js get env: MY_ENV_VAR = undefined
å人çã«ã¯ãã®ããœãŒã¹ã³ãŒãã«dotenvã®äœ¿çšãæ瀺çã«è¿œå ããããšããæ¹æ³ã¯ã¡ãã£ãšå«ãªã®ã§ã
Node.jsã®--require
ïŒ-r
ïŒãªãã·ã§ã³ã䜿ã£ãããªããŒãã®æ¹ãè¯ãããªãšæããŸãã
ã³ã³ããç°å¢ãšãã ãšãç°å¢å€æ°ã¯ã³ã³ããåŽã®èšå®ã§è¡ãããšãå€ããšæããŸããã
ãããããšããœãŒã¹ã³ãŒãã«dotenvã®ããŒããæžããªããšãåäœãããããšãã§ããŸãã
$ node -r dotenv/config print-env.js get env: MY_ENV_VAR = Hello from dotenv
ã¡ãªã¿ã«ã.env
ãã¡ã€ã«ã«æžãããŠããç°å¢å€æ°ããã§ã«ååšããå Žåã¯ããããããç°å¢å€æ°ãšããŠå®çŸ©ãããŠããå€ãåªå
ããã
ããã§ãã
$ MY_ENV_VAR=Hello node -r dotenv/config print-env.js get env: MY_ENV_VAR = Hello
èªã¿èŸŒããã¡ã€ã«ãåãæ¿ãã
dotenvã¯ããã©ã«ãã§.env
ãšãããã¡ã€ã«ãèªã¿èŸŒã¿ãŸããããããå¥ã®ãã¡ã€ã«ã«åãæ¿ããããšãã§ããŸãã
ãããªãã¡ã€ã«ãçšæã
.env-other
MY_ENV_VAR=Hello from dotenv other
dotenvã®èšå®ã¯ãã³ãã³ãã©ã€ã³ãªãã·ã§ã³ã§dotenv_config_<option>=value
ãšæå®ãããã
ç°å¢å€æ°ã§DOTENV_CONFIG_<OPTION>=value
ã§æå®ããããšãã§ããŸãã
ä»åã¯ç°å¢å€æ°ã䜿ããŸããããèªã¿èŸŒããã¡ã€ã«ã.env
以å€ã«ããã«ã¯DOTENV_CONFIG_PATH
ç°å¢å€æ°ãæå®ããŸãã
確èªã
$ DOTENV_CONFIG_PATH=.env-other node -r dotenv/config print-env.js get env: MY_ENV_VAR = Hello from dotenv other
èªã¿èŸŒããã¡ã€ã«ãåãæ¿ãããŸããã
ã³ã¡ã³ããè€æ°è¡ã®ç°å¢å€æ°ãæžã
dotenvã§èªã¿èŸŒããã¡ã€ã«ã«ã¯ãã³ã¡ã³ããæžããããç°å¢å€æ°ãè€æ°è¡ã§å®çŸ©ã§ãããããŸãã
è€æ°è¡ã®ç°å¢å€æ°ãå®çŸ©ããã«ã¯ã"
ãŸãã¯'
ã§å²ã£ãŠè€æ°è¡ã§æžããŸããã³ã¡ã³ãã¯#
ã§æžãã°OKã§ãã
ãããªæãã§ããã
.env-multiple
# ããã¯ãã·ã³ãã«ãªç°å¢å€æ°å®çŸ©ã§ã MY_ENV_VAR=Hello World!! # ããã¯ãè€æ°è¡ã®ç°å¢å€æ°å®çŸ©ã§ã MY_ENV_MULTILINE_VAR="begin \"ã¯ã©ãŒãã¯\ã§ãšã¹ã±ãŒãããŠèšè¿°\" end"
èªã¿èŸŒããœãŒã¹ã³ãŒãã
print-env-multiple.js
console.log(`get env: MY_ENV_VAR = ${process.env.MY_ENV_VAR}`); console.log(); console.log(`get env: MY_ENV_MULTILINE_VAR = ${process.env.MY_ENV_MULTILINE_VAR}`);
確èªã
$ DOTENV_CONFIG_PATH=.env-multiple node -r dotenv/config print-env-multiple.js get env: MY_ENV_VAR = Hello World!! get env: MY_ENV_MULTILINE_VAR = begin \"ã¯ã©ãŒãã¯\ã§ãšã¹ã±ãŒãããŠèšè¿°\" end
OKã§ããã
Jestãšçµã¿åããã
æåŸã¯ãdotenvãJestãçµã¿åãããŠäœ¿ã£ãŠã¿ãŸãããã
æ°ããNode.jsãããžã§ã¯ããäœæã
$ npm init -y $ npm i -D prettier $ npm i dotenv $ npm i -D jest
äŸåé¢ä¿ã¯ããããªæãã«ãªããŸããã
"devDependencies": { "jest": "^29.5.0", "prettier": "^2.8.8" }, "dependencies": { "dotenv": "^16.3.1" }
scripts
ã¯ããããŠãããŸãã
"scripts": { "format": "prettier --write **/*.js", "test": "jest" },
.env
ãã¡ã€ã«ãçšæã
.env
MY_ENV_VAR=Hello dotenv
ãã¹ãã³ãŒãã
use-dotenv.test.js
test('use dotenv', () => { expect(process.env.MY_ENV_VAR).toBe('Hello dotenv'); });
ãã®ãã¹ãã¯ãã®ãŸãŸå®è¡ããŠã倱æããŸãã
$ npm run test > dot-env-jest-example@1.0.0 test > jest FAIL ./use-dotenv.test.js â use dotenv (4 ms) â use dotenv expect(received).toBe(expected) // Object.is equality Expected: "Hello dotenv" Received: undefined 1 | test('use dotenv', () => { > 2 | expect(process.env.MY_ENV_VAR).toBe('Hello dotenv'); | ^ 3 | }); 4 | at Object.toBe (use-dotenv.test.js:2:34) Test Suites: 1 failed, 1 total Tests: 1 failed, 1 total Snapshots: 0 total Time: 0.288 s, estimated 1 s Ran all test suites.
ããããã°åäœããŸããããããã¡ãã£ãšéãæ°ãããŸãâŠã
use-dotenv.test.js
require('dotenv').config(); test('use dotenv', () => { expect(process.env.MY_ENV_VAR).toBe('Hello dotenv'); });
ã©ãããããããã§ãããJestã®èšå®ãã¡ã€ã«ã§setupFiles
ãšãããã®ã䜿ãã°è¯ãããã§ãã
dotenvã䜿ãåã«ã¯ã§ãããããã§ãããã
Configuring Jest / setupFilesAfterEnv
èšå®ã
jest.config.js
module.exports = { setupFiles: ['dotenv/config'], testEnvironment: 'node', };
ããã§dotenvãåäœããããã«ãªããŸãã
$ npm run test > dot-env-jest-example@1.0.0 test > jest PASS ./use-dotenv.test.js â use dotenv (3 ms) Test Suites: 1 passed, 1 total Tests: 1 passed, 1 total Snapshots: 0 total Time: 0.236 s, estimated 1 s Ran all test suites.
å¥ã®ãã¡ã€ã«ãèªã¿èŸŒãŸãããå Žåã¯
.env-other
MY_ENV_VAR=Hello dotenv other
ç°å¢å€æ°ã®æå®ãscripts
ã«å«ããã°ããã®ããªããšã
"scripts": { "format": "prettier --write **/*.js", "test": "jest", "test-other": "DOTENV_CONFIG_PATH=.env-other jest" },
確èªã
$ npm run test-other > dot-env-jest-example@1.0.0 test-other > DOTENV_CONFIG_PATH=.env-other jest FAIL ./use-dotenv.test.js â use dotenv (4 ms) â use dotenv expect(received).toBe(expected) // Object.is equality Expected: "Hello dotenv" Received: "Hello dotenv other" 2 | 3 | test('use dotenv', () => { > 4 | expect(process.env.MY_ENV_VAR).toBe('Hello dotenv'); | ^ 5 | }); 6 | at Object.toBe (use-dotenv.test.js:4:34) Test Suites: 1 failed, 1 total Tests: 1 failed, 1 total Snapshots: 0 total Time: 0.251 s, estimated 1 s Ran all test suites.
ãããªãšããã§ããããã
ãªãã±
æåŸã«å°ãdotenvã®ãœãŒã¹ã³ãŒããçºããŠãããŸãã
å°ããªã©ã€ãã©ãªãŒãªã®ã§ãäžèº«ãèŠãã®ãããèŠåŽããªãã§ãããã
ãªãã·ã§ã³ãç°å¢å€æ°ããã³ã³ãã³ãã©ã€ã³ãªãã·ã§ã³ãã解決ããŠããéšåã
https://github.com/motdotla/dotenv/blob/v16.3.1/config.js
https://github.com/motdotla/dotenv/blob/v16.3.1/lib/env-options.js
https://github.com/motdotla/dotenv/blob/v16.3.1/lib/cli-options.js
.env
ãã¡ã€ã«ã®ããŒã¹ã
https://github.com/motdotla/dotenv/blob/v16.3.1/lib/main.js#L12-L48
ãŸãšã
Node.jsã§ç°å¢å€æ°ããã¡ã€ã«ããèªã¿èŸŒãdotenvãè©ŠããŠã¿ãŸããã
ãªããšãªããããããã®ããããšããã®ã¯ç¥ã£ãŠããŸããããå®éã«äœ¿ã£ãããšã¯ãªãã£ãã®ã§ç¢ºèªããŠãããŠããã£ãã§ãã
ä»ã®èšèªã«ãåããããªãã®ãããããšãããããŸãããã