【问题标题】:Conditionally running tasks in grunt if some files are changed如果某些文件被更改,有条件地在 grunt 中运行任务
【发布时间】:2014-10-22 17:43:09
【问题描述】:

我是 Grunt 的新手,据我目前的理解,Grunt 有一个“watch”任务,它不断检查文件是否有修改,每次修改发生时,运行相应的任务。

我正在寻找的是这种离散版本 - 一个任务,它将运行其他任务,当且仅当自上次构建以来更改了某些文件。

似乎是很自然的要求,但我找不到这个。是我一个人,还是这真的是个问题?

配置文件应如下所示:

grunt.initConfig({
  foo: {
    files: "foo/*"
    // some task
  },
  bar: {
    files: "bar/*"
    // some other task
  },
  ifModified: {
    foo: {
      files: "foo/*",
      tasks: ['foo']
    },
    bar: {
      files: 'bar/*',
      tasks: ['bar', 'foo']
    }
  }
});

grunt.registerTask('default', ['bar', 'foo']);

运行grunt 应始终执行任务'bar', 'foo',而运行grunt ifModified 应仅在自上一次构建以来实际更改了某些文件时才执行任何任务。

【问题讨论】:

    标签: gruntjs


    【解决方案1】:

    为此做了我自己的任务。原来不难,代码如下:

    构建/任务/if-modified.js:

    var fs = require('fs');
    var crypto = require('crypto');
    
    module.exports = function (grunt) {
    
        grunt.registerMultiTask('if-modified', 'Conditionally running tasks if files are changed.', function () {
    
            var options = this.options({});
    
            grunt.verbose.writeflags(options, 'Options');
    
            var hashes = {};
            if (grunt.file.exists(options.hashFile)) {
                try {
                    hashes = grunt.file.readJSON(options.hashFile);
                }
                catch (err) {
                    grunt.log.warn(err);
                }
            }
            grunt.verbose.writeflags(hashes, 'Hashes');
    
            var md5 = crypto.createHash('md5');
    
            this.files.forEach(function (f) {
                f.src.forEach(function (filepath) {
                    var stats = fs.statSync(filepath);
                    md5.update(JSON.stringify({
                        filepath: filepath,
                        isFile: stats.isFile(),
                        size: stats.size,
                        ctime: stats.ctime,
                        mtime: stats.mtime
                    }));
                });
            });
    
            var hash = md5.digest('hex');
            grunt.verbose.writeln('Hash: ' + hash);
    
            if (hash != hashes[this.target]) {
                grunt.log.writeln('Something changed, executing tasks: ' + JSON.stringify(options.tasks));
    
                grunt.task.run(options.tasks);
    
                hashes[this.target] = hash;
                grunt.file.write(options.hashFile, JSON.stringify(hashes));
            }
            else
                grunt.log.writeln('Nothing changed.');
    
        });
    };
    

    Gruntfile.js:

    grunt.initConfig({
      foo: {
        src: ["foo/**/*"],
        dest: "foo-dest"
        // some task
      },
      bar: {
        src: ["bar/**/*", "foo-dest"]
        // some other task
      },
      'if-modified': {
        options: {
          hashFile: 'build/hashes.json'
        },
        foo: {
          src: ['foo/**/*', 'Gruntfile.js', 'package.json'],
          options: {tasks: ['foo']}
        },
        bar: {
          src: ['bar/**/*', "foo-dest", 'Gruntfile.js', 'package.json'],
          options: {tasks: ['bar']}
        }
      }
    });
    
    grunt.loadTasks('build/tasks'); // if-modified.js in this dir
    
    grunt.registerTask('default', ['foo', 'bar']);
    

    运行:

    grunt if-modified
    

    【讨论】:

      【解决方案2】:

      您可以从https://github.com/gruntjs/grunt/wiki/Creating-tasks 创建一个有条件地运行其他任务的任务:

      grunt.registerTask('foo', 'My "foo" task.', function() {
        // Enqueue "bar" and "baz" tasks, to run after "foo" finishes, in-order.
        grunt.task.run('bar', 'baz');
        // Or:
        grunt.task.run(['bar', 'baz']);
      });
      

      【讨论】:

      • 是的,我看到了。在这种情况下,问题是如何检查集合 'foo/*' 中的某些文件自上次构建以来是否已更改?
      • github.com/shama/gaze 可以帮助您检测文件更改,您应该存储结果
      • 我认为您的用例中还没有像 grunt-contrib-watch 这样的插件
      【解决方案3】:

      你需要的可能是新的:

      较新的任务将配置另一个任务以使用 src 文件运行,这些文件 a) 比 dest 文件新或 b) 比上次成功运行(如果没有 dest 文件)新。有关示例和更多详细信息,请参见下文。

      https://github.com/tschaub/grunt-newer

      【讨论】:

      • 可能是这样。尽管新任务的第一次提交比提出这个问题晚了 2 个月。谢谢,有时间我会研究 grunt-newer,也许会切换到这个解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-13
      • 2019-12-08
      • 2013-07-29
      • 1970-01-01
      相关资源
      最近更新 更多