2013-07-11 24 views
54

İki görev görevini aynı anda yürütmek mümkün mü?Eşzamanlı olarak iki iz görevini nasıl yürütülür

ben içeride ayarlarını izleyip sadece hırıltı izle başlatmak istediğiniz görevleri herhangi bir sayı olabilir ve bu

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

gibi hepsini izlemek ... ama anlıyorum buna gerek yok. Sadece geliştirme ve üretim için farklı görevler dizisine sahip olmak istiyorum. Tahmin edebileceğiniz gibi, A (üretim) ve B (geliştirme) arasındaki tek fark minification ve birleştirmedir. A ve B görevlerini aynı anda başlatmam gerekmiyor.

Önce bu fikir

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

ile geldi Ama bu işe yaramadı. Sadece ilk görevler çalışıyor (C asla işe yaramıyor). İstediğimi yapmak mümkün mü?

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

Sonra:

cevap

71

Ben grunt-concurrent kullanarak çalışır buldum

grunt.registerTask("prod", ["concurrent:prod"]); 
grunt.registerTask("dev", ["concurrent:dev"]); 
+3

Tam olarak, teşekkürler! –

+7

Bu benim için çalışmıyor. Eşzamanlı iki saat çalıştırırken 'Önemli hata: Bağlantı noktası 35729 zaten başka bir işlem tarafından kullanılıyor'. Herhangi bir ipucu? – jmcollin92

+1

En iyi ve sadece çalışan bir çözüm var: https://npmjs.org/package/grunt-focus – jmcollin92

18

DÜZENLEME: eşzamanlı artık logConcurrentOutput seçeneği vardır! Daha fazla bilgi burada: https://github.com/sindresorhus/grunt-concurrent#logconcurrentoutput.

İzleme, garip bir eşzamanlı ancak engelleme görevidir, bu nedenle, çok görevli işlevselliklerin çalışmasını sağlamak için yaratıcı olmanız gerekir.

Eşzamanlı olarak, saat görevleri dışındaki tüm çıktıları kaybeder, bu da ideal değildir.

özel görev yapılandırma nesnesi yazma dinamik deneyin:

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'); 
}); 
+0

Diğer eklentileri kullanmak istemiyorsanız çok iyi bir çözüm. – jmav

+0

Çözüm budur. Teşekkür ederim. –

+0

"Eşzamanlı olarak tüm görev çıkışlarını kaybeder": Eşzamanlı için 'logConcurrentOutput' seçeneği vardır, bu da bunu engeller. – hashchange

10

iyi ve tek çalışma çözümü var: size Sonra

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 
       } 
      } 
     } 

: https://npmjs.org/package/grunt-focus sonra bu eklenti ve ekle Odağı kullan: kaynaklar veya odaklanma: testu kolaylık olarak.

JM.

+3

grunt-eşzamanlı aynı bağlantı noktası için livereloads olan çoklu saatler ile çalışmaz. Bu hile yaptı, teşekkürler! –

+0

'grunt-focus', çünkü bunun gibi bir (veya bazı) görevlerin tümünü izlemeyi tanımlayabileceğiniz için harikadır:' focus: {dev: {exclude: ['test']}} 'hangi benim durumumda harikaydı. – Oliver

+0

Benim için gayet iyi çalışıyor, teşekkürler! – Tom

7

homurdan eşzamanlı veya arkadan odaklama iyi bir çözümdür, ancak her ikisi de livereload işlevselliğini bozar.

Buradaki çözümüm, her iki yapılandırmayı aynı anda çalıştırmayacağınız varsayımıyla, saat yapılandırmasını dinamik olarak oluşturmaktır.

Bu

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"]);
Ben bu soruya doğrudan cevap biliyorum

+0

aslında grunt-odakları karaciğere zarar vermez. her saat hedefine 'livereload' seçeneği eklemelisiniz. –

0

gibi bir şey yapabilirsiniz, ama benim çözüm Gulp yerine Grunt kullanmak şimdi. Gulp ile sadece yapılandırmakla kalmazsınız. Yani istediğini yapmak için daha özgürsün.

JM.

+0

Tüm bu "Sunucu" yardımcı programı yazmayı seviyorsanız, o zaman gulp olur. Grunt işlevselliğimizi Gulp ile dönüştürmek için 1 hafta, bir deneme yaptık ve görevi başaramadık. Hala çitin Grunt tarafındayım. – augurone

+2

O gulp göçünü yapmak için bir günden az zamanını bana gösteriyor. Anlamak çok kolay, tamamen eklentileri ile tonlarca özellikli ve geri gitmem. – jmcollin92

+0

Denenen stok seninkinden daha iyi geçti. Şahsen bunu yapmaya teşebbüs etmedim, belki benim için daha kolay olurdu. – augurone

-1

Eşzamanlı

concurrent: { 
      options: { 
       logConcurrentOutput: true 
      }, 
      set1: ['watch:html', 'watch:styles'], 
     }, 

grunt.registerTask('default', 'watch'); 
grunt.registerTask('htmlcss', ['concurrent:set1']); 
+0

Daha fazla açıklayabilir misiniz, neden diğer insanların anlamasına yardımcı olmak için çalışıyor, çözümü nasıl oluşturdunuz? –

+0

bu, iki yıl önce verilen cevaplara bir şey eklemiyor ... –

-1

Sadece liman adresini ve livereload bağlantı noktasını değiştirmek benim için çalışıyor. Örneğin, . 9000 portu 8000 olarak değiştirir ve 35729'dan 36729'a kadar yeniden yüklenir

İlgili konular