Grunt: скопировать каталог, в котором имя dir является динамическим?
Я разрабатываю свою собственную версию Yii2, продвинутую с Grunt, чтобы справиться со всем. От перезагрузки Yii2 до фабрики (удаление -local.php, очистка журналов, ресурсов и т. Д.), Использование Gulp для обработки ресурсов, объединение и минимизация CSS и JS, с поддержкой LESS, SCSS, TS. Я пытаюсь сделать все проще и лучше с Grunt, для всего, что мне нужно.
У меня есть шаблоны, из которых я работаю (расширенный контроллер, модели, конфигурации, темы, макеты, представления) все пользовательские. Я также хочу включить шаблоны yii2 по умолчанию (нетронутые) для базового, внешнего интерфейса, обычного и т. Д. Точно так же, если необходимо, они есть, и мне не нужно копировать n-paste из чистого репозитория yii2.
Я построил _templates
каталог в корне моего расширенного приложения yii2. Внутри у меня есть yii2
каталог. Внутри этого default
каталог для шаблонов по умолчанию, который имеет backend
, frontend
и т. д. которые являются нетронутыми шаблонами. Тогда у меня под yii2 dir, custom
где будут мои пользовательские шаблоны Итак, вот общая структура:
├── _templates
│ └── yii2
│ └── default
│ └── backend
│ └── frontend
│ └── custom
│ └── backend
│ └── frontend
Теперь, если я хочу создать другой раздел (приложение), я хочу просто запустить:
gulp new-app --template=yii2/custom/frontend --name=mobile
и пусть он скопирует этот каталог в корень моего приложения.
Он также имеет заполнитель в файлах для пространства имен. Поэтому, если я назову его "мобильным", файлы внутри шаблона должны иметь "мобильный" для пространства имен. Итак, я добавил {{%REPLACE-APP-NAME%}}
к файлам. Это отдельный вопрос, но следующий в моем списке, который нужно решить на тот случай, если кто-то ответит, может помочь и с этим, это будет оценено.
Где я сейчас нахожусь: в моем Gruntfile есть список действий по копированию для бэкенда, внешнего интерфейса и основного сайта. Это необходимо и используется во время моего build
Команда, чтобы скопировать необходимые файлы от поставщиков. Я не хочу это ломать.
Я предполагаю, что мне нужно добавить еще один раздел в мой copy
команда для обработки копирования шаблонов? Тем не менее, имя каталога не известно? Как передать имя каталога этой задаче?
Gruntfile:
module.exports = function (grunt) {
grunt.initConfig({
copy: {
backend: {
files: [
{expand: true, flatten: true, src: ['vendor/bower/bootstrap/fonts/*'], dest: 'backend/web/assets/fonts/', filter: 'isFile'},
{cwd: 'vendor/almasaeed2010/adminlte/dist', src: '**/*', dest: 'backend/web/assets/themes/adminlte', expand: true}
]
},
frontend: {
files: [
{expand: true, flatten: true, src: ['vendor/bower/bootstrap/fonts/*'], dest: 'frontend/web/assets/fonts/', filter: 'isFile'},
{cwd: 'vendor/almasaeed2010/adminlte/dist', src: '**/*', dest: 'frontend/web/assets/themes/adminlte', expand: true}
]
},
template: { // <-- DOES NOT WORK, JUST EXAMPLE
files: [{
src: '_templates/' + templatePath + '/**/*', // <-- NOTICE templatePath variable!
dest: saveName, <-- NOTICE saveName variable
expand: true
}]
},
},
});
grunt.loadNpmTasks('grunt-contrib-copy');
grunt.registerTask('build', ['less', 'sass_import', 'sass', 'typescript', 'concat', 'cssmin', 'uglify', 'copy']);
grunt.registerTask('build-backend', ['less:backend', 'sass_import:backend', 'sass:backend', 'typescript:backend', 'concat:backend', 'cssmin:backend', 'uglify:backend', 'copy:backend']);
grunt.registerTask('build-frontend', ['less:frontend', 'sass_import:frontend', 'sass:frontend', 'typescript:frontend', 'concat:frontend', 'cssmin:frontend', 'uglify:frontend', 'copy:frontend']);
grunt.registerTask('new-app', function() {
var templateName = grunt.option('template');
var saveName = grunt.option('name');
if ( ! grunt.file.isDir('_templates/' + templateName) ) {
grunt.warn('Template Not Found!\n' );
}
grunt.log.writeln('Chosen Template: ' + templateName);
// do work here :)
grunt.log.writeln('Done!');
});
Тогда команда: grunt new-app --template=yii2/default/frontend --name=mobile
template
Опция просто - путь к шаблону для копирования. name
опция, будет именем для копирования каталога. то есть: окончательное имя, которое будет называться в корне приложения после копирования.
Как я могу позвонить copy
команда из моего new-app
задача? Я добавил template
действие в copy
задача (как показано выше в примере). Как я могу заставить работать переменные, или как лучше всего справиться с этим?
1 ответ
Вы можете запустить задачу в зарегистрированной задаче с помощью grunt.task.run
:
grunt.log.writeln('Chosen Template: ' + templateName);
grunt.task.run(['copy:' + templateName]);