Grunt 因源文件夹名称中包含“.js”而失败

Grunt fails because of containing ".js" in source's folder name

我在使用 grunt 时遇到问题。我已经像这样配置了 uglify 任务:

uglify: {
    my_targets: {
        files: [{
            expand: true,
            cwd: 'build/dev/Assets/JavaScript',
            src: '**/*.js',
            dest: 'build/dist/Assets/JavaScript'
        }]
    }
}

基本上这是完美的...直到它到达这个文件夹: vendor/conditioner.js/ conditioner.js

Grunt 认为 vendor/conditioner.js 是一个文件(因为它匹配我的 src 模式)并尝试加载该文件,这当然以这个错误结束:

{ [Error: Unable to read "build/dev/Assets/JavaScript/vendor/conditioner.js" file (Error code: EISDIR).]
  origError: { [Error: EISDIR: illegal operation on a directory, read] errno: -4068, code: 'EISDIR', syscall: 'read' } }

我不知道如何告诉 grunt 忽略该文件夹(以“.js”结尾),希望您能提供帮助。提前致谢。

您可以使用 custom filter function:

uglify: {
    my_targets: {
        files: [{
            expand: true,
            cwd: 'build/dev/Assets/JavaScript',
            src: '**/*.js',
            dest: 'build/dist/Assets/JavaScript',
            filter: function(filepath) {
                return filepath.indexOf('conditioner.js') > -1 ? false : true;
            }
        }]
    }
}

无需编写自定义过滤器。在documentation for the files object, it is specified that a filter can be a "valid fs.Stats method name”。isFile方法已经存在。我们只需要在我们的文件对象中设置这个过滤器的名称:

files: [{
    expand: true,
    cwd: 'build/dev/Assets/JavaScript',
    src: '**/*.js',
    dest: 'build/dist/Assets/JavaScript',
    filter: 'isFile'
}]