Ответ 1
initConfig
и grunt.file.readJSON
выполняются до запуска вашей задачи. Кажется, что вам нужны строки шаблонов, и вы можете вызывать только grunt.file.readJSON
, когда у вас действительно есть целевое имя.
Например:
grunt.registerTask('build', function(target) {
grunt.config.set('target', target);
grunt.config.set('site', grunt.file.readJSON(grunt.config.get('path'));
grunt.task.run('foo:dist', 'bar:dist');
});
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
path: './sites/<%= target %>/project.json'
});
Дополнительная информация: http://gruntjs.com/api/grunt.config
Что касается вашего обновления: вы в основном повторяете ту же ошибку, что и в первом примере. Вы пытаетесь получить доступ к config site
до его установки.
Вы должны понимать, что шаг инициализации, т.е. grunt.initConfig
, имеет место до, если выполняется любой связанный с задачей код:
Initialize config -> Run task
Давайте рассмотрим grunt.initConfig
по отдельности:
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
site: grunt.config.get('site'),
});
Это шаг инициализации, который происходит раньше всего. Аргумент, переданный initConfig
, объект конфигурации, оценивается первым. То, что вы пытаетесь сделать здесь, - это доступ к параметрам конфигурации site
, прежде чем конфиг будет даже создан. Надеюсь, вы признаете, что это не имеет смысла.
Может быть, это поможет вам понять процесс, если вы положите grunt.initConfig
на самый верх, прежде чем регистрировать какие-либо задачи.
Решение:
Я думаю, что на самом деле вы можете использовать аргументы командной строки, с помощью которых вы можете контролировать, какой сайт строить. Подробнее см. grunt.option
.
Например:
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
watch: {
sass: {
files: ['<%= site.dev %>/scss/*.scss'],
tasks: ['sass:dist']
}
}
});
grunt.config.set('site', grunt.file.readJSON('./sites/' + grunt.option('site') + '/project.json'));
И затем вы запустите задачу с помощью
grunt watch --site=somesite