Как сделать приложение angularjs совместимым с 12 факторами в отношении конфигурации
Я пытаюсь сделать приложение angularjs 12-факторным в отношении конфигурации ( http://12 factor.net/config).
Это должно зависеть от окружающей среды, и я не должен видеть слова development
, test
, production
и т. д. в коде.
Переменные могут храниться в Bash env
например. Я мог бы передать их веб-серверу.
Я уже думал о файле шаблона.erb erb config.js.erb > config.js
, но если я изменю переменную во время работы приложения, мне придется повторить это.
Я уже нашел эту статью http://mindthecode.com/how-to-use-environment-variables-in-your-angular-application/
Но это большая ложь, и Grunt.js делает это, правда... Во всяком случае.
Я знаю, что философия 12 factor не была разработана для внешнего интерфейса, но мое угловое приложение может быть развернуто на разных серверах во многих средах, и никому не повредит попытаться сделать все правильно:).
Спасибо!
Редактировать:
Параметры конфигурации, которые я хотел бы использовать, были бы такими:
app:
api:
url: "The url of the api server"
port: 8080
cdn:
images: "url of my images caching service"
google:
oauth:
"api_key": "The api key used for that deployment"
#other external frontend services
Другое Редактировать:
Этот парень вроде как ответил: http://bahmutov.calepin.co/inject-valid-constants-into-angular.html который я нахожу уродливым и полностью связанным с angularjs; но это работает!
2 ответа
Вот решение, которое я нашел, оно полностью связано с angularjs, но оно работает для меня на Heroku и очень просто. Я просто добавляю свой модуль conf к сгенерированному коду.
Каждый раз, когда я перезапускаю приложение, копируется новая версия кода, поэтому Append
бывает только один раз.
Append
просто переопределяет уже существующую переменную конфигурации. Если кто-то найдет что-то более "классное", я буду рад, если это будет правильным решением!
var compression = require('compression');
var express = require('express');
var logfmt = require('logfmt');
var stdio = require('stdio');
var glob = require("glob");
var fs = require('fs');
// ------------------------
// Read config from args
var ops = stdio.getopt({
'url': {
key: 'u',
args: 1,
default: '',
description: 'Url of api server'
},
'port': {
key: 'p',
args: 1,
default: 5000,
description: 'Port on which to listen'
}
});
var port = ops.port || process.env.PORT;
ops.port = undefined;
// ------------------------
// Append config to js built file
var codeToAppend = 'angular.module("project.config",[]).constant("ApiConfig",' + JSON.stringify(ops) + ');';
glob(__dirname + '/dist/scripts/scripts.*.js', function(er, files) {
fs.appendFile(files[0], codeToAppend, function(err) {
if (err) {
throw err;
}
console.log('The "conf code" was appended to file!');
});
});
// ------------------------
// Start App :3
var app = express();
app.use(logfmt.requestLogger());
app.use(compression({
threshold: 512
}));
app.use(express.static(__dirname + '/dist'));
app.get('/config', function(req, res) {
res.json(ops);
});
app.listen(port);
Я нашел репозиторий на github, который, надеюсь, поможет вам https://github.com/Khelldar/Angular-Express-Train-Seed