使用Grunt和Uglify进行版本控制

时间:2014-04-17 11:56:56

标签: javascript regex gruntjs uglifyjs

我有一堆模块在以下文档树中描述:

.
├── Gruntfile.js
├── build
└── src
    └── app
        ├── Render
        │   ├── api
        │   │   ├── common.js
        │   │   ├── v1.js
        │   │   └── v2.js
        │   └── module.json
        └── User
            ├── api
            │   ├── common.js
            │   ├── v1.js
            │   └── v2.js
            └── module.json

其中/src/app/Render//src/app/User/都被视为模块。

Gruntfile.js内我希望声明一个包含模块的列表和默认版本,如下所示:

var modules=["Render", "User"];
var version = 2;

使用此信息,我想遍历每个模块文件夹,并uglify打包./api/中的文件,包括与正则表达式/^v[version]\./匹配的任何内容version引用变量而不是字符串文字)并省略与正则表达式/^v(?!version\.)[0-9]+\./匹配的任何内容,然后对它们进行uglify并将文件存储在/build/app/{{Module}}/api.js中。

例如,如果给出version=2,我想最终得到以下结构:

   ...
    ├── build
    │   └── app
    │       ├── Render
   ...      │   └── api.js // /src/app/Render/api/v2.js + /src/app/Render/api/common.js
            │   
            └── User
                └── api.js // /src/app/User/api/v2.js + /src/app/User/api/common.js

我将允许用户使用shell标志运行任务:grunt deploy --v=2将覆盖显式var version = 2;

问题是我没有得到如何在任务期间迭代我的阵列并选择我想要的文件(我已经看到了globbing但它看起来不够高级以选择我想要的文件)并对每个操作执行单独的uglify操作。我真的很感激一些建议。

1 个答案:

答案 0 :(得分:0)

人们经常忽略的一件事是你在Gruntfile中拥有Node.js的全部功能。

var modules=["Render", "User"];
var version = grunt.option('version', 2);
var _ = require('underscore');
var fs = require('fs');

grunt.initConfig({

  uglify: _.reduce(modules, function(obj, module){

    obj[module] = {
      files: {},
      options: {
        // Add your options here
      }
    };

    obj[module].files['build/app/'+module+'/api.js'] =
      _.chain(fs.readdirSync('./src/app/'+module+'/api'))
        .filter(function(filename){
            // Check against your regular expression here
        })
        .map(function(filename){
            return './src/app/'+module+'/api/'+filename
        })
        .value();

    return obj;

  }, {});
})