Спасибо за ответы, они навели на решение. Сделал так:
За основу взял структуру проекта, которую генерит generator-gulp-angular.
В корне создал папку config, в которой лежат json-файлы с настройками. В default.json описаны всевозможные настройки. В других файлах достаточно лишь переопределить нужное поле:
// config/default.json
{
"api": {
"scheme": "http",
"host": "localhost",
"port": 8080,
"root": "/api/v1/"
}
}
// config/prod.json
{
"api": {
"host": "example.com"
}
}
// config/dev.json
{}
Файл local.json добавлен в гитигнор, но его можно использовать (если он есть).
Далее, написал задачу для gulp, которая в зависимости от окружения генерирует с помощью gulp-ng-config js-файл с ангуляровским модулем:
// gulp/config.js
'use strict';
var gulp = require('gulp');
var gutil = require('gulp-util');
var cjson = require('cjson');
var b2v = require('buffer-to-vinyl');
var gulpNgConfig = require('gulp-ng-config');
module.exports = function (options) {
function p(name) {
return [options.config + '/default.json', options.config + '/' + name + '.json'];
}
gulp.task('config', function () {
var env = gutil.env.env || 'dev'; // получаем имя окружения через значение аргумента командной строки, или выставляем его равным dev, если ничего не передавалось
var config = JSON.stringify({
config: cjson.load(p([env]), true) // Загружаем json'ы, сливая их в 1 объект
});
return b2v.stream(new Buffer(config), 'config.js') // создаём поток из строки
.pipe(gulpNgConfig('lemonfront.config', { // генерим по JSON'у ангуляровский модуль
createModule: false
}))
.pipe(gulp.dest(options.tmp + '/serve/app/')); // и записываем во временную папку
});
}
Эта задача стоит в зависимостях у другой (script) и генерит такой файл:
// .tmp/serve/app/config.js
angular.module('app.config')
.constant('config', {
"api": {
"scheme": "http",
"host": "localhost",
"port": 8080,
"root": "/api/v1/"
}
});
Далее, добавил этот скрипт в список для инъекции в html. В index.js определил сам модуль и добавил его в зависимости всего проекта, чтобы любой дочерний модуль имел доступ к этим настройкам:
// src/app/index.js
angular.module('app.config', []);
angular.module('lemonfront', [
'ngAnimate',
'ngCookies',
'ngSanitize',
'ui.router',
'app.config',
'app.core'
]);
В ангуляре теперь достаточно внедрить config:
angular.module('...', [])
.factory(SomeService, ['config', function (config) {
console.log(config.api.host);
}]);
А выбор конфига идёт через аргумент при запуске gulp:
gulp build --env=prod