Grunt 文件名作为变量

Grunt filename as variable

也许我的问题听起来很傻,但我到处搜索都没有找到答案。

我需要存储 Grunt 在变量中操作的文件名,以便能够在其他任务中重用它。

copy: {
  dist: {
    files: [{
      expand: true,
      cwd: 'tmp/output/',
      src: ['*.html'],
      dest: 'dist',
      rename: function(dest, src) {
        var d = new Date();
        var mh = d.getMonth() + 1;
        var dy = d.getDate();
        var yr = d.getFullYear();
        return dest + "/" + yr + "_" + mh + "_" + dy + "_" + src;
      }
    }]
  }
}

在这个例子中,我重命名了一个附加日期的文件。我需要将生成的文件名存储在一个变量中,以便在其他任务中重复使用并最终记录到控制台。

需要一些帮助来理解 Grunt 如何处理文件!

编辑: 正如建议的那样,我已经用实际值更改了路径。

我的意思是:

  1. 有人在我的文件夹中放了一个名为 foo.html 的文件
  2. 我在 ie 中通过 Grunt 动态重命名了它。 2018_01_02_foo.html
  3. 我需要一个存储全新文件名的变量,或者只是 "foo" 部分,但不知何故让我能够在其他任务中重用该名称

TNX

您可以执行以下操作:

  1. 在每个Task的外部范围内声明一个变量,并为其分配一个空数组。例如:

    var cachedFileNames = [];
    
  2. 然后在copy任务的rename函数中,利用Array.push()方法将每个动态生成的文件名存储在cachedDirNames数组中.例如:

    cachedFileNames.push(fileName);
    
  3. cachedFileNames 数组中的文件名现在可以在其他任务中重复使用(如下面的自定义 logFileNames 任务所示) .


Gruntfile.js

以下 Gruntfile.js 要点演示了上面的第 1-3 点:

module.exports = function (grunt) {

  var cachedFileNames = []; /* 1. Filenames are dynamically
                                  added via the `copy` task.*/


  grunt.loadNpmTasks('grunt-contrib-copy');

  grunt.initConfig({

    copy: {
      dist: {
        files: [{
          expand: true,
          cwd: 'tmp/output/',
          src: ['*.html'],
          dest: 'dist',
          rename: function(dest, src) {
            var d = new Date();
            var mh = d.getMonth() + 1;
            var dy = d.getDate();
            var yr = d.getFullYear();
            var fileName = yr + "_" + mh + "_" + dy + "_" + src;

            cachedFileNames.push(fileName); // 2. Cache each new filename.

            return dest + "/" + fileName;
          }
        }]
      }
    }
  });

  // 3. Custom Task to demonstrate the `cachedFileNames`
  //    array can be accessed via another task.
  grunt.registerTask('logFileNames', function() {
    cachedFileNames.forEach(function(fileName) {
      grunt.log.writeln(fileName);
    })
  })

  grunt.registerTask('default', [ 'copy', 'logFileNames' ]);
};