89

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

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

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

उत्तर

19

मैं तो मैं आपके साथ साझा करना चाहते हैं एक समाधान मिल गया है।

मैं नोड के अंतर्गत घुरघुराना उपयोग कर रहा हूँ तो, टर्मिनल कॉल करने के लिए आदेश आप 'child_process' मॉड्यूल की आवश्यकता की जरूरत है।

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

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

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

एक बेहतर दृष्टिकोण एक प्लगइन का उपयोग (या अपने स्वयं लिखना) अपने घुरघुराना config config के रूप में और नहीं कोड रखने के लिए है। grunt-shell और grunt-exec दो उदाहरण हैं। – papercowboy

+0

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

+0

क्योंकि यह पार्टी पटकथा है यह काम नहीं करेगा पर काम करेगा नहीं हूँ। मैं यूनिक्स ओएस के – blackdragon

102

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

grunt-shell उदाहरण:

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

या grunt-exec उदाहरण:

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

के तहत चल रहा हूं क्या किसी को पता है कि इनमें से कोई भी विंडोज़ पर प्रयोग योग्य है? – Capaj

+6

सरल मामलों के लिए दोनों ने विंडोज के तहत मेरे लिए ठीक काम किया है। – eddiegroves

+0

मुझे विंडोज + सिग्विन के साथ काम करने के लिए तुरंत 'ग्रंट-शैल' नहीं मिल सका, लेकिन मुझे 'ग्रंट-एक्जिक' के साथ बेहतर भाग्य मिला। – Nathan

18

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

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

+0

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

34

चेक grunt.util.spawn:

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

'opts: {stdio:' legisl '} के साथ, आप कमांड – JuanPablo

+1

कमांड का आउटपुट देख सकते हैं नोट: cmd param एक स्ट्रिंग नहीं होना चाहिए। – RKI

+0

अब इसे ['grunt-legacy-util'] (https://github.com/gruntjs/grunt-legacy-util) प्लगइन की आवश्यकता है। यह इसके बजाय ['आवश्यकता ('child_process') .spawn()'] (https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options) का उपयोग करने की अनुशंसा करता है। –

2

async लिए

मैं तो मैं बस परीक्षण आसानी से और तालमेल के चला सकते हैं Jake Trent's solution का उपयोग कर, और मेरे परियोजना पर एक देव निर्भरता के रूप में shelljs जोड़ने समाप्त हो गया Grunt 0.4.x के साथ काम कर रहे खोल कमांड https://github.com/rma4ok/grunt-bg-shell का उपयोग करें।

11

दोस्तों 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); 
}); 
+0

बिना किसी अतिरिक्त प्लगइन के ग्रेट समाधान। – valentinvieriu