Gruntjs 如果某些文件发生更改,则在grunt中有条件地运行任务

Gruntjs 如果某些文件发生更改,则在grunt中有条件地运行任务,gruntjs,Gruntjs,我是Grunt的新手,从我的理解到现在,Grunt有一个“监视”任务,它不断检查文件的修改,每次修改发生时,都运行相应的任务 我正在寻找的是一种离散版本的任务,它将运行其他任务,如果且仅当自上次构建以来某些文件发生了更改 这似乎是很自然的要求,但我找不到这个。只是我,还是这真的是个问题 配置文件应如下所示: grunt.initConfig({ foo: { files: "foo/*" // some task }, bar: { files: "bar/*

我是Grunt的新手,从我的理解到现在,Grunt有一个“监视”任务,它不断检查文件的修改,每次修改发生时,都运行相应的任务

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

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

配置文件应如下所示:

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
应仅在某些文件自上一次生成以来实际发生更改时才执行任何任务。

您可以创建一个有条件运行其他任务的任务,从:

grunt.registerTask('foo','My“foo”task',function(){
//将“bar”和“baz”任务排队,以便在“foo”完成后按顺序运行。
grunt.task.run('bar','baz');
//或:
run(['bar','baz']);
});

您可以从以下位置创建一个有条件运行其他任务的任务:

grunt.registerTask('foo','My“foo”task',function(){
//将“bar”和“baz”任务排队,以便在“foo”完成后按顺序运行。
grunt.task.run('bar','baz');
//或:
run(['bar','baz']);
});

为此制定了我自己的任务。其实并不难,下面是代码:

build/tasks/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.');

    });
};
Grunfile.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']);
运行:


为此我做了自己的任务。其实并不难,下面是代码:

build/tasks/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.');

    });
};
Grunfile.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更新的:

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


您需要的可能是全新的:

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


是的,我看到了。在这种情况下,问题是如何检查集合“foo/*”中的某些文件自上次生成以来是否已更改?可以帮助您检测文件更改并存储结果我不认为已经有像grunt contrib watch这样的插件用于您的用例是的,我看到了。在这种情况下,问题是如何检查集合“foo/*”中的某些文件自上次生成以来是否已更改?可以帮助您检测文件更改,并且您应该存储结果。我认为对于您的用例,可能还没有grunt contrib watch这样的插件。虽然较新任务的第一次提交时间比提出此问题晚了2个月。谢谢,我会在有时间的时候研究grunt更新版,也许会切换到这个解决方案。它可能是。虽然较新任务的第一次提交时间比提出此问题晚了2个月。谢谢,我会在有时间的时候研究grunt更新版,也许会切换到这个解决方案。