it-swarm.dev

كيفية تشغيل مهمتين

هل من الممكن تشغيل مهمتي مراقبة في وقت واحد؟

أدرك أنه يمكنني الحصول على أي عدد من المهام التي أريدها داخل إعدادات ( وإعداد فقط ساعة مراقبة وسيراقب كل منهم ، مثل هذا

...
watch: {
    A: {
        files: "js/dev/**/*.coffee",
        tasks: ["coffee", "requirejs"]
    },
    B: {
        files: "js/dev/**/*.coffee",
        tasks: ["coffee"]
    },
    C: {
        files: "js/dev/**/*.html",
        tasks: ["copy"]
    }
}
...

... لكنني لست بحاجة إلى هذا. أريد فقط أن يكون لديك مجموعة مختلفة من المهام للتنمية والإنتاج. كما يمكنك أن تخمن ، فإن الفرق الوحيد بين A (الإنتاج) و B (التطوير) هو التصغير والتسلسل. لست بحاجة إلى تشغيل A و B المهام في نفس الوقت.

أولاً جئت بهذه الفكرة

grunt.registerTask("prod", ["watch:A", "watch:C"]);
grunt.registerTask("dev", ["watch:B", "watch:C"]);

لكن هذا لم ينجح. مهام المشاهدة الأولى فقط تعمل (C لا تعمل أبدًا). هل من الممكن أن أفعل ما أريد؟

58
Vitalii Korsakov

لقد وجدت استخدام أعمال متزامنة :

concurrent: {
  options: {
    logConcurrentOutput: true
  },
  prod: {
    tasks: ["watch:A", "watch:C"]
  },
  dev: {
    tasks: ["watch:B", "watch:C"]
  }
}

ثم:

grunt.registerTask("prod", ["concurrent:prod"]);
grunt.registerTask("dev", ["concurrent:dev"]);
74
Nicolas Hery

التحرير: المتزامن الآن لديه خيار logConcurrentOutput! مزيد من المعلومات هنا: https://github.com/sindresorhus/grunt-concurrent#logconcurrentoutput .

Watch هي مهمة متزامنة ولكنها محظورة بشكل غريب ، لذلك يجب أن تكون مبدعًا للحصول على وظائف تشبه المهام المتعددة.

المتزامنة يفقد كل الإخراج من مهام المراقبة ، والتي ليست مثالية.

حاول كتابة كائن التكوين ديناميكيًا في مهمة مخصصة:

grunt.registerTask('watch:test', function() {
  // Configuration for watch:test tasks.
  var config = {
    options: {
      interrupt: true
    },
    unit: {
      files: [
        'test/unit/**/*.spec.coffee'
      ],
      tasks: ['karma:unit']
    },
    integration: {
      files: [
        'test/integration/**/*.rb',
        '.tmp/scripts/**/*.js'
      ],
      tasks: ['exec:rspec']
    }
  };

  grunt.config('watch', config);
  grunt.task.run('watch');
});
18
RobW

الحل الأفضل والوحيد هو العمل: https://npmjs.org/package/grunt-focus أضف هذا البرنامج المساعد ثم:

focus: {
            sources: {
                include: ['js', 'html', 'css', 'grunt']
            },
            testu: {
                include: ['js', 'html', 'css', 'testu', 'grunt']
            },
            testi: {
                include: ['js', 'html', 'css', 'testu', 'testi', 'grunt']
            }
        },
        watch: {
            js: {
                files: paths.js,
                tasks: ['jshint'],
                options: {
                    livereload: true
                }
            },
            html: {
                files: paths.html,
                options: {
                    livereload: true
                }
            },
            css: {
                files: paths.css,
                tasks: ['csslint'],
                options: {
                    livereload: true
                }
            },
            testu: {
                files: ['test/**/*.js', 'test/**/*.css'],
                tasks: ['mochaTest'],
                options: {}
            },
            testi: {
                files: ['test/**/*.js', 'test/**/*.css'],
                tasks: ['exec:cleanTestDB', 'protractor_webdriver', 'protractor'],
                options: {}
            },
            grunt: {
                files: ['Gruntfile.js', 'server/config/env/*.js'],
                options: {
                    reload: true
                }
            }
        }

ثم تستخدم التركيز: المصادر أو التركيز: testu كراحتك.

JM.

10
jmcollin92

يعد grunt-concurrent أو grunt-focus كلاً من الحلول الجيدة ، لكن كلاهما يكسر وظائف livereload.

حلي لهذا هو تكوين تكوين الساعة بشكل حيوي ، مع افتراض أنك لن تقوم بتشغيل كلا التكوينين في نفس الوقت.

يمكنك أن تفعل شيئا مثل هذا

grunt.config.merge({
  watch: {
    options: {
      livereload: true
    },
    C: {
      files: "js/dev/**/*.html",
      tasks: ["copy"]
    }
  }
});

grunt.registerTask('watch-forProd', function () {
  grunt.config.merge({
    watch: {
      A: {
        files: "js/dev/**/*.coffee",
        tasks: ["coffee", "requirejs"]
      }
    }
  });

  grunt.task.run('watch');
});

grunt.registerTask('watch-forDev', function () {
  grunt.config.merge({
    watch: {
      B: {
        files: "js/dev/**/*.coffee",
        tasks: ["coffee"]
      }
    }
  });

  grunt.task.run('watch');
});

grunt.registerTask("prod", ["watch-forProd"]);
grunt.registerTask("dev", ["watch-forDev"]);
7
Alex Shnayder

سبتمبر 2018

أنت لست بحاجة إلى استخدام grunt-concurrent بعد الآن ، أصبح هذا التطبيق مضمنًا ، فهناك عينة من أحد مشاريعي الحالية ...

module.exports = function(grunt) {
    grunt.initConfig({
        pkg: grunt.file.readJSON('package.json'),
        sass: {
            theme: {
                files: {
                    '../../web/sites/all/themes/ifafri/css/generated/theme_ifafri_master.css' : '../../web/sites/all/themes/ifafri/css/master.scss'
                }
            },
            bootstrap: {
                files: {
                    '../../web/sites/all/themes/ifafri/css/generated/theme_ifafri_bootstrap.css' : '../../web/sites/all/themes/ifafri/css/bootstrap/master.scss' 
                }
            }
        },
        watch: {
            theme: {
                files: '../../web/sites/all/themes/ifafri/css/*.scss',
                tasks: ['sass:theme'],
                options: {
                    spawn: false,
                    livereload: true,
                    nospawn: false
                }
            },
            bootstrap: {
                files: '../../web/sites/all/themes/ifafri/css/bootstrap/*.scss',
                tasks: ['sass:bootstrap'],
                options: {
                    spawn: false,
                    livereload: true,
                    nospawn: false
                }
            }
    }
    });
    grunt.loadNpmTasks('grunt-contrib-sass');
    grunt.loadNpmTasks('grunt-contrib-watch');
    grunt.loadNpmTasks('grunt-livereload');
    grunt.registerTask('default',['watch']);
}
2
Simon

أعلم أن هذا لا يجيب بشكل مباشر على السؤال ، لكن الحل الآن هو استخدام Gulp بدلاً من Grunt. مع Gulp لك رمز وليس فقط تكوين. لذلك أنت أكثر حرية في فعل ما تريد.

JM.

0
jmcollin92