使用 Grunt 更改文件名
Change name of file with Grunt
我需要在已经存在的名称和文件扩展名之间输入我的任意名称,我的代码:
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 ;
}
}
}]
}
},
rename
函数是用于此类要求的正确功能。但是,您需要使用 rename
函数中定义的逻辑来配置 copy
任务,如下所示:
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 + '')
: dest + src.replace(/(\..*?$)/, str + '');
}
}]
}
}
});
grunt.registerTask('default', ['copy']);
}
说明
下面解释了 rename
函数中发生的事情,以及为什么要执行它:
第一部分; var str = '_test';
,是您应该指定要插入到文件名中的字符串的位置。当前字符串; _test
,将被插入,因此您需要根据需要更改此值。
那一行写着;
dest = /\/$/.test(dest) ? dest : dest + '/';
确保 dest
路径始终以正斜杠 (/
) 结尾。例如,如果 dest
属性 的值设置为 dest: 'copy-test2'
,(请注意没有尾部正斜杠),则将附加一个正斜杠 (/
) .这是必要的,以确保当 dest
路径和新的 src
路径连接时它们形成有效路径。
处理这个问题的代码使用了正则表达式,\/$
with the test()
method, and a conditional (ternary) operator将尾部正斜杠附加到 dest
值,或者如果 dest
值已经以正斜杠结尾,则保留原样。
读到的部分;
if (this.dot && /^\./.test(src.split('/').pop())) {
return dest + src;
}
检查 dot
选项是否设置为 true
。如果 dot
选项值为 true
,grunt 也会按原样复制隐藏文件 and/or 文件夹,即 filename/foldername 不会更改。任何以句点 (.
) 开头的文件名 and/or 文件夹名称,例如 .gitignore
被识别为 hidden.
注意:您可能不想复制隐藏的 files/folders,但是如果您这样做,那么当设置 dot
选项时存在正确处理它们的逻辑至 true
.
最后一部分是:
return this.extDot === 'last'
? dest + src.replace(/(\.(?:[^\.]*?)$)/, str + '')
: dest + src.replace(/(\..*?$)/, str + '');
是返回新目标路径的逻辑发生的地方。这里发生了很多事情,如下所述:
首先,grunt 有一个 extDot
选项,我们利用它来确定您的字符串(例如 '_test'
)应该插入的位置。 extDot
选项在 grunt 文档中描述为:
extDot
Used to indicate where the period indicating the extension is located. Can take either 'first'
(extension begins after the first period in the file name) or 'last'
(extension begins after the last period), and is set by default to 'first'
...
如果您将 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 句点 (.
). 之前插入字符串
注意没有文件扩展名的文件不会更改名称。
我需要在已经存在的名称和文件扩展名之间输入我的任意名称,我的代码:
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 ;
}
}
}]
}
},
rename
函数是用于此类要求的正确功能。但是,您需要使用 rename
函数中定义的逻辑来配置 copy
任务,如下所示:
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 + '')
: dest + src.replace(/(\..*?$)/, str + '');
}
}]
}
}
});
grunt.registerTask('default', ['copy']);
}
说明
下面解释了 rename
函数中发生的事情,以及为什么要执行它:
第一部分;
var str = '_test';
,是您应该指定要插入到文件名中的字符串的位置。当前字符串;_test
,将被插入,因此您需要根据需要更改此值。那一行写着;
dest = /\/$/.test(dest) ? dest : dest + '/';
确保
dest
路径始终以正斜杠 (/
) 结尾。例如,如果dest
属性 的值设置为dest: 'copy-test2'
,(请注意没有尾部正斜杠),则将附加一个正斜杠 (/
) .这是必要的,以确保当dest
路径和新的src
路径连接时它们形成有效路径。处理这个问题的代码使用了正则表达式,
\/$
with thetest()
method, and a conditional (ternary) operator将尾部正斜杠附加到dest
值,或者如果dest
值已经以正斜杠结尾,则保留原样。读到的部分;
if (this.dot && /^\./.test(src.split('/').pop())) { return dest + src; }
检查
dot
选项是否设置为true
。如果dot
选项值为true
,grunt 也会按原样复制隐藏文件 and/or 文件夹,即 filename/foldername 不会更改。任何以句点 (.
) 开头的文件名 and/or 文件夹名称,例如.gitignore
被识别为 hidden.注意:您可能不想复制隐藏的 files/folders,但是如果您这样做,那么当设置
dot
选项时存在正确处理它们的逻辑至true
.最后一部分是:
return this.extDot === 'last' ? dest + src.replace(/(\.(?:[^\.]*?)$)/, str + '') : dest + src.replace(/(\..*?$)/, str + '');
是返回新目标路径的逻辑发生的地方。这里发生了很多事情,如下所述:
首先,grunt 有一个
extDot
选项,我们利用它来确定您的字符串(例如'_test'
)应该插入的位置。extDot
选项在 grunt 文档中描述为:extDot
Used to indicate where the period indicating the extension is located. Can take either'first'
(extension begins after the first period in the file name) or'last'
(extension begins after the last period), and is set by default to'first'
...如果您将
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 句点 (.
). 之前插入字符串
注意没有文件扩展名的文件不会更改名称。