Javascript Grunt将只创建一个文件,而不是多个文件
我有一个非常简单的Gruntfile,它逐行读取一个纯文本文件,并且应该从每一行创建一个同名的html文件(即:eng_product_100x100.html),但它只对文件中的一行有效,而不是多行 这是尝试使用多行运行时的控制台响应: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
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);
}
});
};