Gruntjs 自定义grunt插件不能很好地使用grunt手表

Gruntjs 自定义grunt插件不能很好地使用grunt手表,gruntjs,grunt-contrib-watch,Gruntjs,Grunt Contrib Watch,我正在开发一个定制。当我在插件自己的文件夹中使用它时,它工作得很好,但是当我尝试从NPM下载它并在另一个项目中使用它时,它会变得疯狂 我把它包括在内: grunt.loadNpmTasks('grunt-chrome-extension-reload'); 我的自定义任务代码位于插件的tasks文件夹中,如下所示: /* * grunt-chrome-extension-reload * https://github.com/freedomflyer/grunt-chrome-extens

我正在开发一个定制。当我在插件自己的文件夹中使用它时,它工作得很好,但是当我尝试从NPM下载它并在另一个项目中使用它时,它会变得疯狂

我把它包括在内:

grunt.loadNpmTasks('grunt-chrome-extension-reload');
我的自定义任务代码位于插件的
tasks
文件夹中,如下所示:

/*
 * grunt-chrome-extension-reload
 * https://github.com/freedomflyer/grunt-chrome-extension-reload
 *
 * Copyright (c) 2014 Spencer Gardner
 * Licensed under the MIT license.
 */

'use strict';

module.exports = function(grunt) {

  var chromeExtensionTabId = 0;


  grunt.initConfig({

    /**
      Reloads tab in chrome with id of chromeExtensionTabId
      Called after correct tab number is found from chrome-cli binary. 
    */
    exec: {
      reloadChromeTab: {
        cmd: function() {
          return chromeExtensionTabId ? "chrome-cli reload -t " + chromeExtensionTabId : "chrome-cli open chrome://extensions && chrome-cli reload"; 
        }
      }
    },

    /**
      Executes "chrome-cli list tabs", grabs stdout, and finds open extension tabs ID's.
      Sets variable chromeExtensionTabId to the first extension tab ID
    */
    external_daemon: {
      getExtensionTabId: {
        options: {
          verbose: true,
          startCheck: function(stdout, stderr) {

            // Find any open tab in Chrome that has the extensions page loaded, grab ID of tab
            var extensionTabMatches = stdout.match(/\[\d{1,5}\] Extensions/);

            if(extensionTabMatches){
              var chromeExtensionTabIdContainer = extensionTabMatches[0].match(/\[\d{1,5}\]/)[0];

              chromeExtensionTabId = chromeExtensionTabIdContainer.substr(1, chromeExtensionTabIdContainer.length - 2);
              console.log("Chrome Extension Tab #: " + chromeExtensionTabId);
            }

            return true;
          }
        },
        cmd: "chrome-cli",
        args: ["list", "tabs"]
      }
    }

  });

  grunt.registerTask('chrome_extension_reload', function() {
    grunt.task.run(['external_daemon:getExtensionTabId', 'exec:reloadChromeTab']);
  });

};
因此,当我在一个外部项目中使用
grunt-watch
运行它时,grunt在退出之前吐出了几百次这个错误(无止境循环?)

有趣的是,我甚至不能在
watch
任务中调用我的插件,问题依然存在。仅通过删除
grunt.loadnpmtask('grunt-chrome-extension-reload')我是否可以解决这个问题,这基本上意味着我任务中的代码是错误的。有什么想法吗?

grunt.initConfig()
是为最终用户设计的。因为它将完全删除任何现有配置(包括您的手表配置),并替换为您正在初始化的配置。因此,当插件运行时,它会用
exec
external_守护进程
任务配置替换整个配置

尝试改用
grunt.config.set()
。因为它只设置配置的给定部分,而不是删除整个配置


但是插件的更好模式是让用户决定配置。只要有一个插件来处理这个任务。换句话说,避免为用户设置配置。

使用
--verbose
标志运行监视任务时,输出是什么?注册“grunt chrome extension reload”本地Npm模块任务。正在阅读/Users/spencergardner/Google Drive/development/wordly server/wordly extension/node_modules/grunt chrome extension reload/package.json…确定解析/Users/spencergardner/Google Drive/development/wordly server/wordly extension/node_modules/grunt chrome extension reload/package.json…确定初始化配置…确定加载“chrome_extension_reload.js“任务…OK+chrome\u extension\u重载我的插件在公开全新功能方面做得并不多,它主要是以一种有用的方式结合了一些现有的插件,在一个漂亮的、有组织的Gruntfile中这样做会很麻烦。因此,让用户进行配置将不符合这一点,因为我想包装一些复杂的ish代码并将其抽象出来。有什么解决方案吗?看看这个例子:并使用
grunt.loadTasks()
分解GrunFile。配置,至少从格伦特的哲学来看,不应该被抽象掉。它的目的是声明性的,或者用户查看Gruntfile时可以轻松地对其进行扫描。
Running "watch" task
Waiting...Verifying property watch exists in config...ERROR
>> Unable to process task.
Warning: Required config property "watch" missing.
Fatal error: Maximum call stack size exceeded