저는 몇 개의 노드 앱을 작업하면서 배포 관련 설정을 저장하는 좋은 패턴을 찾고 있었습니다. 제가 속한 장고 세계에서는 표준 설정(표준 시간대 등)이 포함된 'settings.py' 파일과 배포 관련 설정(예: 어떤 데이터베이스와 통신할지, 어떤 멤캐시 소켓, 관리자의 이메일 주소 등)을 위한 'local_settings.py'가 있는 것이 일반적인 관행입니다.
노드에서도 비슷한 패턴을 찾고 있습니다. 구성 파일만 있으면 좋겠지만, app.js
의 다른 모든 것과 함께 끼어들 필요는 없지만 소스 제어에 있지 않은 파일에 서버별 구성을 갖는 방법이 중요하다고 생각합니다. 동일한 앱을 여러 서버에 배포할 때 설정이 완전히 다른 서버에서 병합 충돌 등을 처리해야 하는 것은 제가 생각하는 재미가 아닙니다.
그렇다면 이를 위한 프레임워크나 도구가 있나요, 아니면 모든 사람이 직접 해킹을 해야 하나요?
패키지에는 package.json
을 사용하고 구성에는 config.js
를 사용하는데, 이는 다음과 같습니다:
var config = {};
config.twitter = {};
config.redis = {};
config.web = {};
config.default_stuff = ['red','green','blue','apple','yellow','orange','politics'];
config.twitter.user_name = process.env.TWITTER_USER || 'username';
config.twitter.password= process.env.TWITTER_PASSWORD || 'password';
config.redis.uri = process.env.DUOSTACK_DB_REDIS;
config.redis.host = 'hostname';
config.redis.port = 6379;
config.web.port = process.env.WEB_PORT || 9980;
module.exports = config;
프로젝트에서 설정을 로드합니다:
var config = require('./config');
그런 다음 config.db_host
, config.db_port
등에서 내 항목에 액세스할 수 있습니다. 이렇게 하면 하드코딩된 매개변수를 사용하거나 소스 제어에 암호를 저장하고 싶지 않은 경우 환경 변수에 저장된 매개변수를 사용할 수 있습니다.
또한 package.json
을 생성하고 종속성 섹션을 삽입합니다:
"dependencies": {
"cradle": "0.5.5",
"jade": "0.10.4",
"redis": "0.5.11",
"socket.io": "0.6.16",
"twitter-node": "0.0.2",
"express": "2.2.0"
}
프로젝트를 로컬 머신에 복제할 때 npm install
을 실행하여 패키지를 설치합니다. 자세한 내용은 여기를 참조하세요.
프로젝트는 내 프로덕션 서버용 리모트가 추가된 상태로 GitHub에 저장됩니다.
Json 의 파일을 컴포지션으로 v0.5.x 노드입니다 요구할 수 있습니다 (참조 이 질문에)
콘피g.j슨:
{
"username" : "root",
"password" : "foot"
}
아프자이스:
var config = require('./config.json');
log_in(config.username, config.password);
훨씬 후에 저는 구성을 관리할 수 있는 꽤 괜찮은 Node.js 모듈을 발견했습니다: nconf.
간단한 예제입니다:
var nconf = require('nconf');
// First consider commandline arguments and environment variables, respectively.
nconf.argv().env();
// Then load configuration from a designated file.
nconf.file({ file: 'config.json' });
// Provide default values for settings not provided above.
nconf.defaults({
'http': {
'port': 1337
}
});
// Once this is in place, you can just use nconf.get to get your settings.
// So this would configure `myApp` to listen on port 1337 if the port
// has not been overridden by any of the three configuration inputs
// mentioned above.
myApp.listen(nconf.get('http:port'));
또한 Redis에 설정을 저장하고 구성 파일을 작성하는 것을 지원하며, 상당히 견고한 API를 가지고 있으며, [Flatiron][] 프레임워크 이니셔티브의 일환으로 더 잘 알려진 Node.js 상점 중 하나인 [Nodejitsu][]의 지원을 받고 있으므로 미래에도 상당히 견고할 것입니다.
Github에서 nconf를 확인하세요.
내 솔루션이므로 매우 간단합니다.
읽어들입니다 ./config/index.js 있는 환경 구성
var env = process.env.NODE_ENV || 'development'
, cfg = require('./config.'+env);
module.exports = cfg;
일부 설정값으로 ./config/config.global.js 의 정의
var config = module.exports = {};
config.env = 'development';
config.hostname = 'dev.example.com';
//mongo database
config.mongo = {};
config.mongo.uri = process.env.MONGO_URI || 'localhost';
config.mongo.db = 'example_dev';
오버라이드합니다 설정값으로 ./config/config.test.js 에서
var config = require('./config.global');
config.env = 'test';
config.hostname = 'test.example';
config.mongo.db = 'example_test';
module.exports = config;
이를 사용하여 ./models/user.js:
var mongoose = require('mongoose')
, cfg = require('../config')
, db = mongoose.createConnection(cfg.mongo.uri, cfg.mongo.db);
운영에 app 테스트 환경에서:
NODE_ENV=test node ./app.js
이는 여기서 자세히 설명했다. http://www.chovy.com/node-js/managing-config-variables-inside-a-node-js-application/
[도트네프] 를 볼 수도 있습니다 (http://github.com/scottmotte/dotenv) 의 따르는 개념 [12 팩터에서의 app] (http://12factor.net/).
내가 예전에는 노드입니다 구성용 사용할 수 있지만, 이러한 이유로 창조하 도트네프. 그것은 전적으로 영감을 받은 ruby& # 39 의 도트네프 라이브러리란.
쉽게 사용할 수 없다.
var dotenv = require('dotenv');
dotenv.load();
그럼 그냥 이네프 같은 파일 및 설정 안에 넣어 만들고 있습니다.
S3_BUCKET=YOURS3BUCKET
SECRET_KEY=YOURSECRETKEYGOESHERE
OTHER_SECRET_STUFF=my_cats_middle_name
당신들 고궁박물원 사용하여 시작할 스크립트 (env 등)?
'네' 파커게.j슨 포함시킬 수 있는 파일 이네프 사용하는 경우 '' 고궁박물원 시작 / 저들이요 소스 및 사용
예:
{
"name": "server",
"version": "0.0.1",
"private": true,
"scripts": {
"start": "node test.js",
"start-dev": "source dev.env; node test.js",
"start-prod": "source prod.env; node test.js"
},
"dependencies": {
"mysql": "*"
}
}
고궁박물원 실행하십시오 스크립트에만:
$ npm start-dev
여기서 설명하는 등 <, https://gist.github.com/ericelliott/4152984>. 모든 credit 을 에릭 엘리엇
그래서 나는 내가 사용하는 javascript 파일을 일반 세 구성을 위해 모든 힘을 javascript 언어 (등 의견 능력 또한 그렇게 행동한다면 기본 구성 파일을 로드할 수 있도록 환경 관련 파일을 무시됨). 이러한 구성 파일을 불러올 수 있는 스케쳐내 환경 변수를 사용할 수 있습니다 (수천 내가 추천합니까 사용할 것을 env var 같은 이유로 나는 don& # 39, t 추천합니까 flexlm*용 json 파일 - 너회가 don& # 39, 프로그래밍 언어 능력이 없는 chunghwa 너회의 구성).
그 이유는 각각의 키 (key) 는 별도의 파일에 캐비닛용입니다 설치자는 사용합니다. 이 키를 보유하고 있습니다 만드는 설치자는 컴퓨터에 및 시동키는 폴더에서는 에 저장합니다. 이렇게 하지 않으면 실패할 수 있는 구성 파일을 로드할 때 너회의 설치자는 너회의 can& # 39, t 액세스하세요 키. 이 방법은 해당 폴더의 파일은 로드하십시오 트래버스할 디렉토리이며 아무 키든 고려할 필요 없이, 어떤 특정 버전의 코드에서 # 39 의 doesn& 어떤 존재하지 않는다.
이후 사용자의 개인 키를 구성, 이 xx 말해둘꼐요 don& 급지된 있을 수 있습니다 * # 39, t want 로드하기에 사용자의 개인 구성용 믿지아니하며 프론트엔드 코드입니다. 그 동안 아마 더 엄격하게 구분할 수 있는 이상적인 완전히 백 번 천 번 많이유 프론트엔드 codebase 에서 피타 충분히 막을 수 있기 때문에 사람들이 그렇게 큰 장벽이 민간 및 공공 구성용. 하지만, there& # 39 의 두 개인 것을 막을 수 있는 로드되었는지 나는한다 구성용 기술입니까 프론트엔드.
마지막으로 하나. 별도의 파일 구성에서 로드할지 있지만브라우저에 꽂으십시오 통해 완전히 다른 어느 때보다 여러분의 프론트엔드 코드입니다. 네 프론트엔드 코드, 국민 구성 작성되어야 번들화 경우 전혀 다른 번들에는 있다. 그렇지 않으면 구성용 isn& # 39 더 이상, t really 구성용 - 이 그냥 코드 부분입니다. 서로 다른 시스템의 구성 다를 수 있어야 합니다.
[죄수] (https://github.com/lloyd/node-convict) 는 확인할 수 있는 또 다른 옵션은 스키마에는 추가합니다. 니콘프 같은 환경 변수 설정 (로드을 지원하며, 조합, 인수, 파일 및 json 객체에는.
예) 의 추가 정보:
var convict = require('convict');
var conf = convict({
env: {
doc: "The applicaton environment.",
format: ["production", "development", "test"],
default: "development",
env: "NODE_ENV"
},
ip: {
doc: "The IP address to bind.",
format: "ipaddress",
default: "127.0.0.1",
env: "IP_ADDRESS",
},
port: {
doc: "The port to bind.",
format: "port",
default: 0,
env: "PORT"
}
});
시작 문서: [안전과 전혀 무관하다 구성된 노드입니다 죄수] (https://hacks.mozilla.org/2013/03/taming-configurations-with-node-convict-a-node-js-holiday-season-part-7/)
콘피그 의 환경 관련 구성 파일을 사용할 수 있습니다. Json 또는 yaml 구성 파일을 자동으로 로드합니다 기본값과 동적임 구성 기능을 갖추고 있다.
예를 들어 콘피그 에서 리포:
File: config/app.json
----------------------------
{
"default": {
"port": 3000,
"cache_assets": true,
"secret_key": "7EHDWHD9W9UW9FBFB949394BWYFG8WE78F"
},
"development": {
"cache_assets": false
},
"test": {
"port": 3001
},
"staging": {
"port": #{process.env.PORT},
"secret_key": "3F8RRJR30UHERGUH8UERHGIUERHG3987GH8"
},
"production": {
"port": #{process.env.PORT},
"secret_key": "3F8RRJR30UHERGUH8UERHGIUERHG3987GH8"
}
}
개발 중.
> config.app.port
3000
먼저 '$ 로 프로그램을 운영, solaris. NODE_ENV = 운영본 PORT = 4567 노드입니다 아프자이스'
> config.app.port
4567
자세한 내용은: https://github.com/vngrs/konfig
폴더와 파일 이름 '와' 로 만들겠다 구성용 나중에 이 파일을 사용하여 다음과 같이 필요한 곳이면 어디든 내아기마저도 config. js
예를 들면 config. js
module.exports = {
proxyURL: 'http://url:port',
TWITTER: {
consumerkey: 'yourconsumerkey',
consumerSecrete: 'yourconsumersecrete'
},
GOOGLE: {
consumerkey: 'yourconsumerkey',
consumerSecrete: 'yourconsumersecrete'
},
FACEBOOK: {
consumerkey: 'yourconsumerkey',
consumerSecrete: 'yourconsumersecrete'
}
}
I want to use this 구성 파일 어딘가에 신앙이니라
첫 번째 가져오기의 내아기마저도 아래와 같이
'var (& # 39, ./config& # 39,),' 구성 = 합니다.
그리고 난 액세스하려면 값을 다음과 같이
const oauth = OAuth({
consumer: {
key: config.TWITTER.consumerkey,
secret: config.TWITTER.consumerSecrete
},
signature_method: 'HMAC-SHA1',
hash_function(base_string, key) {
return crypto.createHmac('sha1', key).update(base_string).digest('base64');
}
});
'그냥' 구성 '사용' 모듈에서는 고궁박물원 (이상 300000 다운로드)
https://www.npmjs.com/package/config
앱 배포보다 노드입니다 구성용 계층적이지 구성으로의 단축시킵니다 앞섰다.
이 일련의 기본 및 확장 매개변수입니다 kofax 를 정의할 수 있으며, 다른 구축 환경 (개발, qa, 스태이징, 생산, etc.).
$ npm install config
$ mkdir config
$ vi config/default.json
{
// Customer module configs
"Customer": {
"dbConfig": {
"host": "localhost",
"port": 5984,
"dbName": "customers"
},
"credit": {
"initialLimit": 100,
// Set low for development
"initialDays": 1
}
}
}
$ vi config/production.json
{
"Customer": {
"dbConfig": {
"host": "prod-db-server"
},
"credit": {
"initialDays": 30
}
}
}
$ vi index.js
var config = require('config');
//...
var dbConfig = config.get('Customer.dbConfig');
db.connect(dbConfig, ...);
if (config.has('optionalFeature.detail')) {
var detail = config.get('optionalFeature.detail');
//...
}
$ export NODE_ENV=production
$ node index.js
내가 사용하는 다음과 같은 방법으로: 다음은 config/index.js 내 파일:
const config = {
dev : {
ip_address : '0.0.0.0',
port : 8080,
mongo :{
url : "mongodb://localhost:27017/story_box_dev",
options : ""
}
},
prod : {
ip_address : '0.0.0.0',
port : 3000,
mongo :{
url : "mongodb://localhost:27017/story_box_prod",
options : ""
}
}
}
구성용 사용 할 경우 다음과 같다.
const config = require('../config')[process.env.NODE_ENV];
네 구성용 객체에는 비해 사용할 수 있습니다.
const ip_address = config.ip_address;
const port = config.port;
나는 내가 조금 늦게 마무리가 아니라 couldn& # 39, t - 그래서 내가 여기서 필요한 -또는 작성했습니까 뭔가 다른 곳을 찾을 수 있어요.
내 구성 메커니즘을 요구 사항은 다음과 같습니다.
비록 내가 어떻게 설명할 수 있는 환경을 지원하는 안중에도 없다고 쉽게 내 솔루션을 추가 -
var publicConfiguration = {
"title" : "Hello World"
"demoAuthToken" : undefined,
"demoUserId" : undefined,
"errorEmail" : null // if null we will not send emails on errors.
};
var privateConfiguration = {
"port":9040,
"adminAuthToken":undefined,
"adminUserId":undefined
}
var meConf = null;
try{
meConf = require("../conf/dev/meConf");
}catch( e ) { console.log("meConf does not exist. ignoring.. ")}
var publicConfigurationInitialized = false;
var privateConfigurationInitialized = false;
function getPublicConfiguration(){
if (!publicConfigurationInitialized) {
publicConfigurationInitialized = true;
if (meConf != null) {
for (var i in publicConfiguration) {
if (meConf.hasOwnProperty(i)) {
publicConfiguration[i] = meConf[i];
}
}
}
}
return publicConfiguration;
}
function getPrivateConfiguration(){
if ( !privateConfigurationInitialized ) {
privateConfigurationInitialized = true;
var pubConf = getPublicConfiguration();
if ( pubConf != null ){
for ( var j in pubConf ){
privateConfiguration[j] = pubConf[j];
}
}
if ( meConf != null ){
for ( var i in meConf ){
privateConfiguration[i] = meConf[i];
}
}
}
return privateConfiguration;
}
exports.sendPublicConfiguration = function( req, res ){
var name = req.param("name") || "conf";
res.send( "window." + name + " = " + JSON.stringify(getPublicConfiguration()) + ";");
};
var prConf = getPrivateConfiguration();
if ( prConf != null ){
for ( var i in prConf ){
if ( prConf[i] === undefined ){
throw new Error("undefined configuration [" + i + "]");
}
exports[i] = prConf[i];
}
}
return exports;
이 성질 때문에 필요한 것은 정의되지 않은 '-'
마카베지제 (,, 이젠드푸블리코 피그라티온 " /backend/conf" 필요한 (conf" ";));
src = " 스크립트입니다 <; / 백 / conf? name = myConf". type = " javascript/text" >;;
추가할 수 있는 환경을 필요로 하는 데 필요한 지원을 통해 이 같은 일이 마이콩프 변경하십시오 (의사코드)
if (= " 환경 production"; ) { 마이콩프 = 지프로두스션, 필요한 (./conf/dev/meConf" ";) }
if (= " 환경 development"; ) { 마이콩프 = 이디벨로주멘트, 필요한 (./conf/dev/meConf" ";) }
마찬가지로 각 환경당 파일을 사용할 수도 있습니다.
meConf.development.js
meConf.production.js
및 임포트하십시오 오른쪽으로 한. 나머지 논리를 그대로인지.
그냥 내가 원한 때문에 보다 더 일반적인 .j슨 유연도를 충족되었으며 alt 예제에서와 사용되는 파일 하지만 didn& # 39 는 라이브러리로, t want it 추상화 빼냅니다 상관 있는 이 같은 일이 필요합니다. 바로 내가 원하는 값으로 설정할 수 있는 기능을 기본적으로 익스포트하여 호출되었을 반환되었습니다 객체에는. 많은 유연성을 제공합니다.
module.exports = function(){
switch(node_env){
case 'dev':
return
{ var1 = 'development'};
}
}();
완벽하게 들어 목마르겠구나 훨씬 더 나은 설명이 있습니다 구성 파일을 사용하여 node. js
오늘 진짜 그러니까말이야 이전 게시물로의 구성을 위한 환경 변수, 것 같은데 내 모듈에서는 공유할 수 있지만 난 로렌아줌마가 매우 유연한 솔루션. 다음은 모듈에서는 json 구성자를
var configJson = {
'baseUrl': 'http://test.com',
'$prod_baseUrl': 'https://prod.com',
'endpoints': {
'users': '<%= baseUrl %>/users',
'accounts': '<%= baseUrl %>/accounts'
},
foo: 'bar',
foobar: 'foobar',
$prod_foo: 'foo in prod',
$test_foo: 'foo in test',
deep:{
veryDeep: {
publicKey: 'abc',
secret: 'secret',
$prod_secret: 'super secret'
}
}
};
var config = require('json-configurator')(configJson, 'prod');
console.log(config.deep.veryDeep.secret)
// super secret
console.log(config.endpoints.users)
// https://prod.com/users
'다음' process.env.NODE_ENV afaq 환경에 대한 모든 변수를 사용할 수 있습니다.
그냥 작은 모듈에서는 릴리즈됨 로드하기에 최근 모든 유형의 구성 파일. S # 39 (https://github.com/flesler/config-node) 에서 이 예쁜 똑바로 it& 확인할 수 있습니다.
파코네프 사용할 수 있습니다. https://www.npmjs.com/package/pconf
예:
var Config = require("pconf");
var testConfig = new Config("testConfig");
testConfig.onload = function(){
testConfig.setValue("test", 1);
testConfig.getValue("test");
//testConfig.saveConfig(); Not needed
}