用Grunt更改文件名

时间:2018-07-10 08:06:44

标签: javascript file gruntjs

我需要在现有名称和文件扩展名之间输入我的任意名称,我的代码:

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 ;
                    }
                }
        }]
    }
},

1 个答案:

答案 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函数中发生的情况以及为什么执行该操作:

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

  2. 读取的行;

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

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

    用于处理此问题的代码使用了正则表达式,\/$test()方法,以及两者中的conditional (ternary) operator;将结尾的正斜杠附加到dest值,或者如果dest值已经以正斜杠结尾,则保持原样。

  3. 阅读部分;

    if (this.dot && /^\./.test(src.split('/').pop())) {
      return dest + src;
    }
    

    检查dot选项是否设置为true。如果dot选项值为true,则grunt还将照原样复制隐藏的文件和/或文件夹,即文件名/文件夹名将不会更改。任何以句点(.开头的文件名和/或文件夹名,例如.gitignore,都被识别为 hidden

    注意:您可能不想复制隐藏的文件/文件夹,但是如果您这样做,则将dot选项设置为true时可以正确处理它们的逻辑存在

  4. 最后一部分显示为:

    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.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 期间(.之前插入字符串。

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