我正试图使一个
angularjs应用程序12因素兼容配置(
http://12factor.net/config).
它应该取决于环境,我不应该在代码中看到开发,测试,生产等字样.
例如,变量可以存储在bash env中.
我可以将它们传递给网络服务器.
我已经想到了一个.erb模板文件来erb config.js.erb> config.js,但如果我在应用程序运行时更改变量,我必须重做这个.
我已经找到了这篇文章http://mindthecode.com/how-to-use-environment-variables-in-your-angular-application/
但这是一个很大的谎言和Grunt.js这样做,真的……无论如何.
我知道12factor哲学不是为前端应用而制作的,但我的角度应用程序可以在许多不同的服务器中部署在许多环境中,并且不会伤害任何人来尝试正确地做事:).
谢谢 !
编辑:
我想使用的配置参数有些像:
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;但它的确有效!
解决方法
这是我找到的解决方案,它完全绑定到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',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);