无法使用 grunt copy-task 处理文件

Posted

技术标签:

【中文标题】无法使用 grunt copy-task 处理文件【英文标题】:Unable to process a file using grunt copy-task 【发布时间】:2014-07-28 12:23:39 【问题描述】:

我正在尝试使用 grunt-contrib-copy(版本 0.4.1)在构建过程中重写文件中的一些字符串。作为测试,我可以复制文件,所以这不是权限或位置问题。

这些是 fileProcessor 任务(在 Coffeescript 语法中)复制文件的选项:

fileProcessor:
    files: [
        expand: true
        cwd: "target/js/"
        dest: "target/js/"
        src: ["**/test-*.js"]
        rename: (dest, src) ->
          grunt.verbose.writeln src, " => ", dest + src.substring(0, src.lastIndexOf("/") + 1) + "foo.js"
          dest + src.substring(0, src.lastIndexOf("/") + 1) + "foo.js"
    ]

我得到以下输出,一切都按预期工作:

Running "copy:fileProcessor" (copy) task
Verifying property copy.fileProcessor exists in config...OK
test-25fd6a1c3a890933.js  =>  target/js/foo.js
Files: target/js/test-25fd6a1c3a890933.js -> target/js/foo.js
Options: processContent=false, processContentExclude=[]
Options: processContent=false, processContentExclude=[]
Copying target/js/test-25fd6a1c3a890933.js -> target/js/foo.js
Reading target/js/test-25fd6a1c3a890933.js...OK
Writing target/js/foo.js...OK
Copied 1 files

到目前为止一切顺利。显然 grunt-contrib-copy 对文件本身没有问题。所以我把重命名任务替换为流程任务,并使用一个简单的正则表达式来查看它是否有效:

fileProcessor:
    files: [
        expand: true
        cwd: "target/js/"
        dest: "target/js/"
        src: ["**/test-*.js"]
        processContent: (content, src) ->
            re = new RegExp("(angular)+")
            content.replace(re, "foo")
    ]

产生以下输出:

Running "copy:fileProcessor" (copy) task
Verifying property copy.fileProcessor exists in config...OK
Files: target/working/shared/scripts/bootstrap-25fd6a1c3a890933.js -> target/working/shared/scripts/bootstrap-25fd6a1c3a890933.js
Options: processContent=false, processContentExclude=[]
Options: processContent=false, processContentExclude=[]
Copying target/working/shared/scripts/bootstrap-25fd6a1c3a890933.js -> target/working/shared/scripts/bootstrap-25fd6a1c3a890933.js
Reading target/working/shared/scripts/bootstrap-25fd6a1c3a890933.js...OK
Writing target/working/shared/scripts/bootstrap-25fd6a1c3a890933.js...OK
Copied 1 files

所以 grunt-contrib-copy 找到了我需要处理的文件,但处理从未发生。 processContent 仍然设置为默认的 false。

查看copy.js,当grunt.file.copy(src, dest, copyOptions)被调用时,copyOptions是一个只有两个属性的对象:

进程,这是错误的,并且 noProcess,这是一个空数组。

所以我的流程选项永远不会传递。关于为什么会这样的任何想法?

【问题讨论】:

【参考方案1】:

您的 processContent 位于错误的位置,需要将其包装到选项中并上移一级。另请注意,processContent 已被折旧并替换为 process

fileProcessor:
    files: [
        expand: true
        cwd: "target/js/"
        dest: "target/js/"
        src: ["**/test-*.js"]
    ]
    options: 
        process: (content, src) ->
            re = new RegExp("(angular)+")
            content.replace(re, "foo")

【讨论】:

代码有很多错误,不容易不稳定。可以修改一下吗? 哪一部分不明白?您遇到了什么错误? 对不起,库沙尔。如果您不提供更多详细信息,我认为我无能为力

以上是关于无法使用 grunt copy-task 处理文件的主要内容,如果未能解决你的问题,请参考以下文章

Grunt.js,警告:无法写入“src”文件(错误代码:EISDIR)

text Grunt预处理文件

Grunt watch无法重新加载配置文件 - 更改时出错

grunt (minimatch/glob) 文件夹排除

‘grunt‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件

正确代码之-grunt