在Grunt任务中存储状态

时间:2015-07-09 11:00:46

标签: gruntjs

我面临以下有趣的问题:

  • 我想创建一个在构建/发布过程的各个部分执行的Grunt任务。
  • 一次调用可能会根据模式对文件进行一些更改,例如:在某些文件中替换版本号或Git标记,如#develop
  • 同一版本中的后续调用需要"还原"以上更改回原始值。

基于以上所述,我需要找到一种方法来跟踪第一次调用中已更改的文件,因此我可以在第二步中恢复更改。我不能在第二步使用模式来避免误报。

示例:

  1. 开始发布 - 作为其中的一部分,编译,uglify / minify,更新版本号,创建一个git发布分支。
  2. 替换某些依赖项的版本号,例如在bower.json中 - 将其从#develop更改为#1.2.3
  3. 更多步骤,包括Git提交
  4. 将上面更改的版本号从#1.2.3替换回#develop
  5. 清理发布的其他步骤
  6. 最后一步很难,因为我不想更改我在上一步中没有更新的#1.2.3出现的任何事件。为此,我需要将更改的文件列表存储在内存中,或者存储在项目根目录中的临时文件中,例如:像.grunt-replace这样的东西。在最后一步读取文件后,插件可以删除它。

    有人使用像这样的Grunt插件吗?你怎么解决这个问题? Grunt是否具有支持上述功能的功能,或者我应该只使用Node.js文件API吗?

    我是否应该考虑其他模式来保持Grunt调用之间的某种状态?

1 个答案:

答案 0 :(得分:1)

您可以使用文件观察程序使grunt进程保持活动状态,然后使用事件跟踪状态。

例如:

var files = [];


module.exports = function(grunt) {

  grunt.initConfig({
    watch: {
      files: ['orig.js'],
      tasks: ['my-task']
    }
  });

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


  grunt.registerTask('my-task', function(){
    // Execute some task
  });

  grunt.event.on('watch', function(action, filepath, project) {
    //add file
    files.push(filepath);

  });

  grunt.registerTask('default', ['watch']);

};

然后,您可以跟踪哪些文件已被更改并采取相应措施。

我必须补充一点,这是一个黑客攻击。你的构建流程不应该是有状态的,你需要能够从头开始构建。