如何使用grunt uglify跳过源父目录

时间:2018-02-22 13:31:11

标签: gruntjs grunt-contrib-uglify

src目录:

dir1
|-- 1.js
|-- 2.js
`-- sub-dir1
    `-- 1.js

目录:

min
`-- dir1
    |-- 1.min.js
    |-- 2.min.js
    `-- sub-dir1
        `-- 1.min.js

我的代码段

uglify: {
    t2: {
        options: {                    
            banner: '/*! <%= pkg.name %> - v<%= pkg.version %> - ' +
                    '<%= grunt.template.today("yyyy-mm-dd") %> */'
        },
        files: [{                    
            expand: true,
            src: ['dir1/**/*.js'],
            dest: 'min',
            rename: function (dst, src) {                        
                return dst + '/' + src.replace('.js', '.min.js');                        
            }
        }]
    }
}

但我想跳过目标目录下的源目录,所需的结构是:

min
|-- 1.min.js
|-- 2.min.js
`-- sub-dir1
    `-- 1.min.js

1 个答案:

答案 0 :(得分:0)

有几种方法可以实现这一目标。 解决方案A (下面)是最简单和最常用的。

解决方案A

动态构建文件对象时,可以使用cwd属性。文档中cwd属性的描述为:

  

cwd所有src次匹配都与此路径相关(但不包括)。

将您的files媒体资源更改为以下内容:

// ...
files: [{
  expand: true,
  cwd: 'dir1/',    // <-- Add this.
  src: '**/*.js',  // <-- Change your src glob to this.
  dest: 'min',
  rename: function (dst, src) {
    return dst + '/' + src.replace('.js', '.min.js');
  }
}]
// ...

解决方案B

另一种方法(不使用cwd属性)是将rename方法更改为以下方法:

// ...
rename: function (dst, src) {
    src = src.split('/');
    src.shift();
    src = src.join('/');
    return dst + '/' + src.replace('.js', '.min.js');
}
// ...
  • src = src.split('/'); 部分使用字符串split()方法和/分隔符将src路径拆分为数组个别路径项目。

  • src.shift(); 部分使用数组shift()方法从数组中删除第一个元素(例如dir1)。

  • src = src.join('/') 部分使用带有/分隔符的数组join()方法将新路径形成为字符串。