I конец я был в состоянии сделать то, что я хотел, как это, но не если это стандартный способ.
То, что мне не удалось сделать, это сначала объявить глобальную переменную globalConfig, чтобы я мог переопределить ее из терминала, когда я запустил задачу.
Вот пример. При работе с HTML-писем мне нужно:
- Процесс моих Sass файлов в CSS (пехотинец-вно-Sass)
- Запуск autoprefixer на результирующее CSS (пехотинец-autoprefixer)
- Минимизировать мой CSS и удалите комментарии CSS (grunt-contrib-cssmin)
- Включите мой полный CSS в тег моего html-файла (используя grunt-include-replace)
- Наконец, запустите предварительный файл в файле, чтобы встроить все стили (grunt- premailer)
Дело в том, что если я работаю над несколькими разными HTMl-письмами в одном проекте, мне нужно иметь возможность запускать все эти задачи в html-файлах один за другим, по мере необходимости. Ниже приведенный ниже Gruntfile позволяет мне это сделать.
Что это делает:
Если вы входите в терминал grunt
Это будет просто запустить задачу Сасс, которая обрабатывает все файлы Sass - нет параметра файла нужно от терминала.
Однако, если я хочу запустить серию процессов в одном файле html, я ввожу grunt process:fileName
с именем файла, являющимся именем html-файла без расширения .html.
Вы заметите, что единственными задачами, для которых требуется имя файла, являются, фактически, include-replace и premailer. Тем не менее, я все еще хочу запускать другие задачи очистки CSS до того, как вы нажмете мой выбранный файл.
Ключа:
- Объявление глобальной переменной
- загрузки переменных GlobalConfig в grunt.initConfig
- Используйте переменную декларации черновой, где это необходимо в ваших задачах
- зарегистрировать пользовательское задание , причем переменная fileName используется как параметр.
Надеюсь, что кто-то поможет.
module.exports = function (grunt) {
var globalConfig = {
file: 'index' // this is the default value, for a single project.
}
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
// load the globalConfig variables
globalConfig: globalConfig,
sass: {
dev: {
files: [{
expand: true,
cwd: 'scss',
src: ['*.scss'],
dest: 'css',
ext: '.css'
}]
}
},
cssmin: {
options: {
keepSpecialComments: 0,
keepBreaks: true,
advanced: false
},
target: {
files: [{
expand: true,
cwd: 'css',
src: '*.css',
dest: 'css',
ext: '.css'
}]
}
},
autoprefixer: {
css: {
src: "css/*.css"
}
},
includereplace: {
your_target: {
options: {
prefix: '\\/\\* ',
suffix: ' \\*\\/',
},
files: {
'inline/<%= globalConfig.file %>-inline.html': ['<%= globalConfig.file %>.html']
}
}
},
premailer: {
main: {
options: {
verbose: true,
preserveStyles: true,
},
src: 'inline/<%= globalConfig.file %>-inline.html',
dest: 'inline/<%= globalConfig.file %>-inline.html'
}
},
});
grunt.loadNpmTasks('grunt-contrib-sass');
grunt.loadNpmTasks('grunt-autoprefixer');
grunt.loadNpmTasks('grunt-include-replace');
grunt.loadNpmTasks('grunt-premailer');
grunt.registerTask('default', 'sass');
grunt.registerTask('process', 'Runs all processing tasks on a specific file to produce inlined file', function (fileName) {
globalConfig.file = fileName;
grunt.task.run('sass', 'autoprefixer', 'cssmin', 'includereplace', 'premailer');
});
}
EDIT: Очевидно в данный момент это принимает только один параметр я считаю. В других вариантах использования версия grunt.option выше может дать больше функциональности, позволяя представить несколько параметров в одной команде. Я продолжу экспериментировать с grunt.option, если найду необходимость сделать это.
Привет, Я нашел решение со слегка упрощенным синтаксисом ниже, по крайней мере для запуска команд из терминала. Интересно, есть ли у вас какое-то мнение по этому поводу? Во всяком случае, это еще одно решение. – spacewindow