gruntjs - 使用 grunt 将许多目录中的许多文件连接到新目录中的单个重命名文件中

标签 gruntjs grunt-contrib-concat

我有一个可能包含许多模块的 Angular 项目。每个模块都有自己的目录,其中包含 Controller 、指令、服务等的子目录。像这样:

src
|-- js
    |-- modules
        |-- moduleOne
            | module.js
            |-- controllers
                | listController.js
                | detailController.js
            |-- directives
                | listItem.js
                | summaryWidget.js
            |-- filters
            |-- services
                | moduleService.js

我的构建基本上是从 src/捆绑和编译文件并放入 dev/,然后缩小 dev/中的文件并移至 prod/。在开发期间,服务器指向 dev/文件夹,而在生产中,服务器指向 prod/文件夹(这也是为什么文件以 .min.js 结尾的原因,即使它们只是被编译/合并)。这个过程运行良好。

目前,我的 concat 任务是获取 moduleOne/中的所有文件,并在我的 dev 目录中创建一个 moduleOne.js 文件。这是我想要发生的,但更动态:
concat: {
    modules: {
        files: {
            "dev/js/modules/moduleOne.min.js": [
                "src/js/modules/moduleOne/*.js",
                "src/js/modules/moduleOne/**/*.js"
            ],
            "dev/js/modules/moduleTwo.min.js": [
                "src/js/modules/moduleTwo/*.js",
                "src/js/modules/moduleTwo/**/*.js"
            ]
        } 
    }
}

问题是我必须为每个模块都这样做,但我认为我不需要这样做。

我尝试执行以下操作,因为这是我想做的事情:
concat: {
    modules: {
        files: [{
            expand: true,
            cwd: "src/js/modules",
            src: "**/*.js",
            dest: "dev/js/modules",
            ext: ".min.js"
        }]
    }
}

但结果是我所有的文件和目录结构都从 src/转移到了 dev/。我基本上是用concat来做copy的,没什么用。

我想做这样的事情:
concat: {
    modules: {
        files: [{
            expand: true,
            cwd: "src/js/modules",
            src: "**/*.js",
            dest: "dev/js/modules/<foldername>.min.js",  <- how do I achieve this?
        }]
    }
}

我已经阅读了很多,但似乎我只能找到答案并且无法将这些概念放在一起。我发现很多只是将单个文件放入新目录中,并重命名。我希望多个文件将单个文件重新命名到新目录中。因为这就是我滚动的方式:)

最佳答案

所以,我找到了我正在寻找的答案。

This SO post基本上是同一个问题,答案很好。不幸的是,当我创建我的问题时它没有出现,否则你不会读到这个。

我的需求略有调整。我需要为每个模块动态地执行此操作,而不是仅使用一个 compile.js 文件,因此我的最终代码如下,位于我的 initConfig() 之后:

grunt.registerTask("prepareModules", "Finds and prepares modules for concatenation.", function() {

    // get all module directories
    grunt.file.expand("src/js/modules/*").forEach(function (dir) {

        // get the module name from the directory name
        var dirName = dir.substr(dir.lastIndexOf('/')+1);

        // get the current concat object from initConfig
        var concat = grunt.config.get('concat') || {};

        // create a subtask for each module, find all src files
        // and combine into a single js file per module
        concat[dirName] = {
            src: [dir + '/**/*.js'],
            dest: 'dev/js/modules/' + dirName + '.min.js'
        };

        // add module subtasks to the concat task in initConfig
        grunt.config.set('concat', concat);
    });
});

// the default task
grunt.registerTask("default", ["sass", "ngtemplates", "prepareModules", "concat", "uglify", "cssmin"]);

这基本上使我的 concat 任务看起来像我手动编码时所做的那样,但只是更简单一些(并且可扩展!)。
concat: {
    ...
    moduleOne: {
        src: "src/js/modules/moduleOne/**/*.js",            
        dest: "dev/js/modules/moduleOne.min.js"
    },
    moduleTwo:{
        src: "src/js/modules/moduleTwo/**/*.js",
        dest: "dev/js/modules/moduleTwo.min.js"
    }
}

我从 SO 帖子中做出的另一个偏差是,我选择在完成后不让 prepareModules 自行运行 concat。我的默认任务( watch 设置为在开发期间运行)仍然完成我的所有处理。

这给我留下了以下结构,可以将其缩小为 prod/:
| dev
    | js
        | modules
            |-- moduleOne.min.js
            |-- moduleTwo.min.js

关于gruntjs - 使用 grunt 将许多目录中的许多文件连接到新目录中的单个重命名文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21918202/

相关文章:

google-chrome - Karma 无法在 Ubuntu 12.04 中为 Jenkins 启动 Chrome

gruntjs - Gruntfile.js 动态构建文件对象

javascript - 咕噜警告 : Task "concat" not found

javascript - Grunt 多次连接 JS 文件

gruntjs - Grunt 在连接后输出一个空的 .js 文件

javascript - jshint 的 Bootstrap 和 grunt 问题

javascript - Grunt Karma 运行测试但阻止

node.js - 使用 NodeJS 中的 GRUNT 错误消息 "' grunt' 未被识别为内部或外部命令、可运行程序或批处理文件”

gruntjs - 如何在缩小文件的末尾添加构建时间戳

javascript - 如何覆盖 grunt-cli 中的 grunt 任务选项?