使用 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 函数中发生的事情,以及为什么要执行它:

  1. 第一部分; var str = '_test';,是您应该指定要插入到文件名中的字符串的位置。当前字符串; _test,将被插入,因此您需要根据需要更改此值。

  2. 那一行写着;

    dest = /\/$/.test(dest) ? dest : dest + '/';
    

    确保 dest 路径始终以正斜杠 (/) 结尾。例如,如果 dest 属性 的值设置为 dest: 'copy-test2',(请注意没有尾部正斜杠),则将附加一个正斜杠 (/) .这是必要的,以确保当 dest 路径和新的 src 路径连接时它们形成有效路径。

    处理这个问题的代码使用了正则表达式,\/$ with the test() method, and a conditional (ternary) operator将尾部正斜杠附加到 dest 值,或者如果 dest 值已经以正斜杠结尾,则保留原样。

  3. 读到的部分;

    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.

  4. 最后一部分是:

    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.jsfilename.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.jsfilename_test.min.css,给出上面显示的示例路径。

    • 您会注意到我们在 replace() 方法中使用正则表达式来确定插入字符串的位置(例如 '_test')。每个正则表达式的进一步解释可以在以下链接中找到:

      • (\.(?:[^\.]*?)$) - 用于在 LAST 句点 (.).
      • 之前插入字符串
      • (\..*?$) - 用于在 FIRST 句点 (.).
      • 之前插入字符串

注意没有文件扩展名的文件不会更改名称。