我需要在现有名称和文件扩展名之间输入我的任意名称,我的代码:
copy: {
dev: {
files: [{
expand: true,
src: ['**','.*'],
cwd: 'copy-test/',
dest: 'copy-test2/',
rename: function(dest, matchedSrcPath) {
if (matchedSrcPath.substring(0,1)) {
return dest + '_test' + matchedSrcPath ;
}
}
}]
}
},
答案 0 :(得分:0)
rename
函数是用于此类需求的正确功能。但是,您需要使用copy
函数中定义的逻辑来配置rename
任务,如下所示:
Gruntfile.js
module.exports = function(grunt){
grunt.loadNpmTasks('grunt-contrib-copy');
grunt.initConfig({
copy:{
dev: {
files: [{
expand: true,
cwd: 'copy-test/',
src: ['**'],
dest: 'copy-test2/',
/*dot: true,*/
/*extDot: 'last',*/
rename: function(dest, src) {
// String to insert into copied filename.
var str = '_test';
// Ensure `dest` path has a trailing forward slash.
dest = /\/$/.test(dest) ? dest : dest + '/';
// If option `dot: true` is specified any hidden file(s)
// are copied as is, i.e. the filename is not changed.
if (this.dot && /^\./.test(src.split('/').pop())) {
return dest + src;
}
// The `extDot` option indicates where the period demarcating
// the file extension is located. The default value is 'first'.
// - When its value is 'first' the `str` value is inserted before
// the FIRST instance of a period.
// - When its value is 'last' the `str` value is inserted before
// the LAST instance of a period.
return this.extDot === 'last'
? dest + src.replace(/(\.(?:[^\.]*?)$)/, str + '$1')
: dest + src.replace(/(\..*?$)/, str + '$1');
}
}]
}
}
});
grunt.registerTask('default', ['copy']);
}
说明
以下内容说明了rename
函数中发生的情况以及为什么执行该操作:
第一部分; var str = '_test';
是您应在其中指定要插入文件名的字符串的地方。当前字符串; _test
将被插入,因此您需要根据需要更改此值。
读取的行;
dest = /\/$/.test(dest) ? dest : dest + '/';
确保dest
路径始终以正斜杠(/
)结尾。例如,如果dest
属性的值设置为dest: 'copy-test2'
(请注意,没有尾随的正斜杠),则将附加正斜杠(/
)。必须确保将dest
路径和新的src
路径连接在一起时,它们形成有效路径。
用于处理此问题的代码使用了正则表达式,\/$
和test()
方法,以及两者中的conditional (ternary) operator;将结尾的正斜杠附加到dest
值,或者如果dest
值已经以正斜杠结尾,则保持原样。
阅读部分;
if (this.dot && /^\./.test(src.split('/').pop())) {
return dest + src;
}
检查dot
选项是否设置为true
。如果dot
选项值为true
,则grunt还将照原样复制隐藏的文件和/或文件夹,即文件名/文件夹名将不会更改。任何以句点(.
开头的文件名和/或文件夹名,例如.gitignore
,都被识别为 hidden 。
注意:您可能不想复制隐藏的文件/文件夹,但是如果您这样做,则将dot
选项设置为true
时可以正确处理它们的逻辑存在
最后一部分显示为:
return this.extDot === 'last'
? dest + src.replace(/(\.(?:[^\.]*?)$)/, str + '$1')
: dest + src.replace(/(\..*?$)/, str + '$1');
是返回新目标路径的逻辑所在。如下所述,这里发生了很多事情:
首先,grunt提供了一个extDot
选项,我们可以使用它来确定应在何处插入您的字符串(例如'_test'
)。 extDot
选项在grunt文档中描述为:
extDot
用于指示表示扩展名的句点所在的位置。可以采用'first'
(扩展名在文件名的第一个句点之后开始)或'last'
(扩展名在最后一个句点之后开始),并且默认设置为'first'
... < / p>
如果将extDot
选项设置为'last'
,则grunt将从如下所示的路径中识别文件扩展名:
'/path/to/filename.js' //--> '.js'
'/path/to/filename.min.css' //--> '.css'
注意:不是将.min.css
标识为第二个示例路径中的文件扩展名,而是标识了.css
。
在上述示例路径下,如果将extDot
选项设置为'last'
,则复制的文件名将重命名为filename_test.js
和filename.min_test.css
。
但是,如果未指定extDot
,则其默认值为'first'
,并且grunt将从如下所示的路径中识别文件扩展名:
'/path/to/filename.js' //--> '.js'
'/path/to/filename.min.css' //--> '.min.css'
注意:这次grunt将.min.css
标识为第二个示例路径中的文件扩展名。
使用默认的extDot
选项('first'
)时,给定上面显示的示例路径,结果复制的文件名将重命名为filename_test.js
和filename_test.min.css
。
您会注意到,我们在replace()
方法中使用了正则表达式来确定在何处插入字符串(例如'_test'
)。每个正则表达式的进一步说明可以在以下链接中找到:
(\.(?:[^\.]*?)$)
-用于在 LAST 期间(.
)之前插入字符串。(\..*?$)
-用于在 FIRST 期间(.
之前插入字符串。注意 没有具有文件扩展名的文件不会更改其名称。