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]);
Другие вопросы по тегам