Grunt:复制目录名称是动态的目录吗?

时间:2017-03-27 21:33:53

标签: yii2 gruntjs yii2-advanced-app grunt-contrib-copy

我正在使用Grunt装配我自己的Yii2高级版来处理所有事情。从重置Yii2到工厂(删除-local.php,清理日志,资产等),使用Gulp进行资产处理,组合和缩小CSS和JS,以及LESS,SCSS,TS支持。我正努力让Grunt更轻松,更好地完成所有我需要的事情。

我使用的模板(扩展控制器,模型,配置,主题,布局,视图)都是自定义的。我也希望包括基本,前端,普通等的默认(未触摸)yii2模板。只是如果需要,它们就在那里,我不需要从干净的yii2 repo中复制粘贴。

我在yii2高级应用的根目录中构建了一个_templates目录。在里面我有一个yii2目录。在default目录中的默认模板,其中包含backendfrontend等未更改的模板。然后我在yii2目录下custom我的自定义模板。所以这是一般结构:

├── _templates
│   └── yii2
│       └── default
│           └── backend
│           └── frontend
│       └── custom
│           └── backend
│           └── frontend

现在,如果我想创建另一个部分(app),我想要运行:

gulp new-app --template=yii2/custom/frontend --name=mobile并将该目录复制到我的应用程序的根目录。

它还在命名空间的文件中有占位符。因此,如果我将其命名为“mobile”,则模板内的文件需要具有“mobile”作为命名空间。所以我在文件中添加了{{%REPLACE-APP-NAME%}}。这是一个单独的问题,但接下来在我的列表中处理,以防有人回答也可以提供帮助,我们将不胜感激。

我现在所处的位置:我的Gruntfile有一个复制操作列表,用于后端,前端和mainsite。在我的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选项将是将目录复制为的名称。 ie:一旦复制过,它将在app root中调用。

如何在copy任务中调用new-app命令?我在template任务中添加了copy操作(如上例所示)。如何使变量起作用,或者处理此变量的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

您可以使用grunt.task.run

在已注册的任务中运行grunt任务
grunt.log.writeln('Chosen Template: ' + templateName);
grunt.task.run(['copy:' + templateName]);