ग्रंट टास्क में एक कमांड चलाना


94

मैं अपनी परियोजना में ग्रंट (टास्क-आधारित कमांड लाइन बिल्ड टूल का उपयोग कर रहा हूँ )। मैंने एक कस्टम टैग बनाया है और मैं सोच रहा हूं कि क्या इसमें कमांड चलाना संभव है।

स्पष्ट करने के लिए, मैं क्लोजर टेम्प्लेट्स का उपयोग करने की कोशिश कर रहा हूं और "टास्क" को जार फाइल को एक जावास्क्रिप्ट फाइल में प्री-कंपाइल करने के लिए कॉल करना चाहिए।

मैं कमांड लाइन से इस जार को चला रहा हूं, लेकिन मैं इसे एक कार्य के रूप में सेट करना चाहता हूं।

जवाबों:


105

वैकल्पिक रूप से आप इसे मदद करने के लिए ग्रंट प्लग इन में लोड कर सकते हैं:

ग्रन्ट-शेल उदाहरण:

shell: {
  make_directory: {
    command: 'mkdir test'
  }
}

या ग्रंट-एक्ज़ीक्यूट उदाहरण:

exec: {
  remove_logs: {
    command: 'rm -f *.log'
  },
  list_files: {
    command: 'ls -l **',
    stdout: true
  },
  echo_grunt_version: {
    command: function(grunt) { return 'echo ' + grunt.version; },
    stdout: true
  }
}

9
क्या किसी को पता है कि उन दोनों में से कोई भी विंडोज पर प्रयोग करने योग्य है?
कैपज

मुझे तुरंत grunt-shellWindows + Cygwin के साथ काम करने के लिए नहीं मिला, लेकिन मेरे पास बेहतर किस्मत थी grunt-exec
नाथन

3
क्या ग्रंट-निष्पादन का उपयोग तुल्यकालिक तरीके से करना है? यह एक साथ चेन कमांड के लिए अच्छा होगा
मूस

1
@funseiki सिर्फ एक बैच या शेल के अंदर कमांड डालते हैं जो आपको पसंदीदा ऑर्डर में कमांड कहते हैं। या आप टास्क को परिभाषित करते हैं जैसे mycmds और "exec:cmd1", "exec:cmd2"फिर लिखते हैं तो आपके पास सिंक्रोनाइज़ ऑर्डर भी होता है।
सेबस्टियन

35

देखें grunt.util.spawn:

grunt.util.spawn({
  cmd: 'rm',
  args: ['-rf', '/tmp'],
}, function done() {
  grunt.log.ok('/tmp deleted');
});

5
साथ opts: {stdio: 'inherit'},आप आदेश के उत्पादन में देख सकते हैं
JuanPablo

2
नोट: cmd param एक स्ट्रिंग होना चाहिए जिसमें एक सरणी न हो।
RKI

1
इसके लिए अब grunt-legacy-utilप्लगइन की आवश्यकता है । इसके require('child_process').spawn()बजाय उपयोग करने की सलाह देता है ।
JD

19

मुझे एक समाधान मिला है इसलिए मैं आपके साथ साझा करना चाहूंगा।

मैं नोड के तहत ग्रन्ट का उपयोग कर रहा हूं, इसलिए टर्मिनल कमांड को कॉल करने के लिए आपको 'child_process' मॉड्यूल की आवश्यकता होती है।

उदाहरण के लिए,

var myTerminal = require("child_process").exec,
    commandToBeExecuted = "sh myCommand.sh";

myTerminal(commandToBeExecuted, function(error, stdout, stderr) {
    if (!error) {
         //do something
    }
});

12
एक बेहतर तरीका यह है कि आप अपने ग्रंट कॉन्‍फ़िगर को कॉन्‍फ़िगर करने के लिए प्‍लग इन का उपयोग करें (या अपना लिखें) और कोड नहीं। ग्रंट-शेल और ग्रंट-एक्ज़िक दो उदाहरण हैं।
पेपर जेकबॉय

जैसा कि आप shपहले उपयोग करते हैं, sh mayCommand.sh मुझे यकीन नहीं है कि यह विंडोज़ पर काम करेगा
svassr

यह काम नहीं करेगा क्योंकि यह बैश स्क्रिप्टिंग है। मैं यूनिक्स ओएस
जुआनो

18

यदि आप नवीनतम ग्रंट संस्करण (इस लेखन के समय 0.4.0rc7) का उपयोग कर रहे हैं, तो ग्रंट-एक्ज़ीक्यूशन और ग्रंट-शेल दोनों विफल हो जाते हैं (वे नवीनतम ग्रंट को संभालने के लिए अपडेट नहीं किए जाते हैं)। दूसरी ओर, चाइल्ड_प्रोसेस का निष्पादन एसिंक्स है, जो एक परेशानी है।

मैंने जेक ट्रेंट के समाधान का उपयोग किया , और शेलज को अपनी परियोजना पर एक निर्भरता के रूप में जोड़ा, ताकि मैं आसानी से और समकालिक रूप से परीक्षण चला सकूं :

var shell = require('shelljs');

...

grunt.registerTask('jquery', "download jquery bundle", function() {
  shell.exec('wget http://jqueryui.com/download/jquery-ui-1.7.3.custom.zip');
});

1
fyi विंडोज के grunt-shellसाथ ठीक काम कर रहा हैgrunt v0.4.5
fiat

मुझे लगता है कि शेलज का उपयोग करना एक महान समाधान है क्योंकि यह आपके नोड ऐप को शेल तक पहुंचने में सक्षम बनाता है, और यह आपको अकेले ग्रंट ऐडऑन की तुलना में इस पर बेहतर नियंत्रण देता है।
निक स्टील

14

दोस्तों child_process की ओर इशारा कर रहे हैं, लेकिन आउटपुट देखने के लिए execSync का उपयोग करने का प्रयास करें ..

grunt.registerTask('test', '', function () {
        var exec = require('child_process').execSync;
        var result = exec("phpunit -c phpunit.xml", { encoding: 'utf8' });
        grunt.log.writeln(result);
});

बिना किसी अतिरिक्त प्लगइन्स के महान समाधान।
वैलेंटाइनवीरियो

मैं एक दिन के लिए रनिंग कार्य प्राप्त करने की कोशिश कर रहा हूं, और अंत में एक सरल समाधान जो काम करता है!
जॉनी 5

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.