Javascript Grunt将只创建一个文件,而不是多个文件

Javascript Grunt将只创建一个文件,而不是多个文件,javascript,node.js,gruntjs,Javascript,Node.js,Gruntjs,我有一个非常简单的Gruntfile,它逐行读取一个纯文本文件,并且应该从每一行创建一个同名的html文件(即:eng_product_100x100.html),但它只对文件中的一行有效,而不是多行 这是尝试使用多行运行时的控制台响应: Running tasks: createProducts Running "createProducts" task Writing product/eng/eng_product_100x100.html eng_product_200x200.html

我有一个非常简单的Gruntfile,它逐行读取一个纯文本文件,并且应该从每一行创建一个同名的html文件(即:eng_product_100x100.html),但它只对文件中的一行有效,而不是多行

这是尝试使用多行运行时的控制台响应:

Running tasks: createProducts

Running "createProducts" task
Writing product/eng/eng_product_100x100.html
eng_product_200x200.html
eng_product_300x300.html
eng_product_400x400.html...ERROR
Warning: Unable to write "product/eng/eng_product_100x100.html
eng_product_200x200.html
eng_product_300x300.html
eng_product_400x400.html" file (Error code: ENOENT). Use --force to continue.

Aborted due to warnings.
Grunfile文件:

module.exports = function(grunt) {

  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json')
  });

  grunt.registerTask('createProducts', 'Create product banners', function() {
    this.async();

    var fs = require('fs');
    var fileName = 'filenames.xml';

    var str = fs.readFileSync(fileName, 'utf8');
    var arr = str.split('/n');
    for (i in arr){
      grunt.file.write(arr[i].split('_')[1]+'/'+arr[i].split('_')[0]+'/'+arr[i], 'test');
      console.log(arr[i]);
    }

  });

};

您的
grunfile.js几乎是正确的。它不能处理多行的原因是由于读取了代码行:

var arr=str.split('/n');
注意换行符的
/n
应该是
\r\n
。请参阅,以了解DOS与Unix代码行结尾之间的差异,代码行应为:

var arr=str.split('\r\n');
grunfile.js

以下是
Gruntfile.js
的完整更正版本,包括一些重构:

module.exports=函数(grunt){
grunt.initConfig({
pkg:grunt.file.readJSON('package.json')
});
registerTask('createProducts','CreateProductBanner',function(){
this.async();
var fs=require('fs'),
fileNameList='filenames.txt',
str=fs.readFileSync(文件名列表'utf8'),
arr=str.split('\r\n');
用于(arr中的var i){
var newFilePath=arr[i]。拆分('''[1]+'/'+arr[i]。拆分('''[0]+'/'+arr[i]+'.html';
write(newFilePath“”);
log('Created file:'+newFilePath);
}
});
};
重构后的显著变化是:

  • 它从
    filenames.txt
    读取列表,而不是“filenames.xml”(如果文件只是您问题中提到的纯文本,则不需要将其设置为
    .xml

  • 添加了一个名为
    newFilePath
    的新变量,因为它清楚地指示了所有
    arr[i].split()
    etc真正创建的内容

  • '.html'
    添加到
    newFilePath
    变量中,以便生成的文件包含
    .html
    后缀


  • 更新更新的答案,以利用
    \r\n
    处理DOS和Unix行结尾


    更新2

    跨平台稳健性

    当在Windows上创建
    filenames.txt
    时,上述解决方案可以成功运行。但是,如果在另一个操作系统上创建
    filenames.txt
    ,它可能会失败,因为使用了各种行结尾,
    \r
    \n
    \r\n
    ,如本文所述。要确保解决方案更有效跨不同操作系统/平台的健壮性然后在使用
    split()
    创建数组之前,需要检查使用哪一行结尾

    下面展示了如何实现这一点(注意:出于解释目的,本文的要点故意冗长,可能需要重构):

    module.exports=函数(grunt){
    grunt.initConfig({
    pkg:grunt.file.readJSON('package.json')
    });
    registerTask('createProducts','CreateProductBanner',function(){
    this.async();
    var fs=require('fs'),
    fileNameList='filenames.txt',
    str=fs.readFileSync(文件名列表'utf8'),
    arr=[];
    //如果filename.txt不包含任何文本,则发出警告。
    如果(!str){
    console.warn('错误:'+fileNameList+'为空');
    过程。退出(1);
    }
    //在拆分之前检查使用哪一行结尾。
    如果(str.indexOf('\r\n')!=-1){//CR+LF-filenames.txt是在Windows上创建的。
    arr=str.split('\r\n');
    }如果在Unix/Mac OS X上创建了(str.indexOf('\n')!==-1){//LF-filenames.txt,则为else。
    arr=str.split('\n');
    }否则,如果(str.indexOf('\r')!==-1){//CR-filenames.txt是在X之前在Mac OS上创建的。
    arr=str.split('\r');
    }否则{//filenames.txt中只存在一行
    arr.push(str);
    }
    用于(arr中的var i){
    var newFilePath=arr[i]。拆分('''[1]+'/'+arr[i]。拆分('''[0]+'/'+arr[i];
    write(newFilePath“”);
    log('Created file:'+newFilePath);
    }
    });
    };