2013-07-07 12 views
30

मैं (विंडोज 7 पर npm install द्वारा प्रभावित करने के लिए एक rm -rf node_modules पीछा spawn पाने के लिए कोशिश कर रहा हूँ, n एक्स आदेश एक के सौजन्य से पारदर्शी रूप से स्थापित CygWin। सभी n x आदेश कमांडलाइन पर ठीक हल करें)।NodeJS के अंडे का प्रयोग का कारण बनता है "अज्ञात विकल्प -" और "[त्रुटि: अंडे ENOENT]" त्रुटियों

मैं शुरू में इस exec का उपयोग कर किया था, लेकिन stdout/stderr जानकारी को पकड़ने के लिए के रूप में यह हुआ चाहता था, इसलिए मैं लगा रहा spawn का उपयोग करेंगे, और कहा कि उपयोग करने के लिए कोड दुबारा लिखा। हालांकि, यह सब कुछ तोड़ देता है।

var spawn = require("child_process").spawn, 
    child = spawn("rm", ["-rf", "node_modules"]); 
child.stdout.on('data', function (data) { console.log(data.toString()); }); 
child.stderr.on('data', function (data) { console.log(data.toString()); }); 
child.on('error', function() { console.log(arguments); }); 

बहरहाल, यह निम्न त्रुटि उत्पन्न करता चल:

rm आदेश, फिर से लिखा, इस बन गया

rm: unknown option -- , 

Try `rm --help' for more information. 

npm आदेश, फिर से लिखा, इस बने:

var spawn = require("child_process").spawn, 
    child = spawn("npm", ["install"]); 
child.stdout.on('data', function (data) { console.log(data.toString()); }); 
child.stderr.on('data', function (data) { console.log(data.toString()); }); 
child.on('error', function() { console.log(arguments); }); 

हालांकि, इसे चलाने से फॉलो उत्पन्न होता है कारण त्रुटि:

{ 
    '0': { 
    [Error: spawn ENOENT] 
    code: 'ENOENT', 
    errno: 'ENOENT', 
    syscall: 'spawn' 
    } 
} 

मैं कैसे अंडे एक ही आदेशों को ठीक exec का उपयोग कर काम के बिना यह हर जगह त्रुटियों ऊपर फेंक चलाने कैसे करूं? और यह क्यों काम नहीं करता है? एपीआई, http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options पढ़ना, ऐसा लगता है कि यह ठीक है कि किसी को स्पॉन का उपयोग कैसे किया जाता है ...

उत्तर

55

अलग अलग बातें की कोशिश कर के बहुत सारे के बाद, मैं अंत में क्या "NPM" वास्तव में खिड़कियों पर है पर एक नज़र था, और यह पता चला है एक bash स्क्रिप्ट npm कहा जाता है, साथ ही साथ एक खिड़कियों देशी बैच स्क्रिप्ट npm.cmd कहा जाता है (कोई विचार नहीं है कि यह क्यों है .cmd, यह होना चाहिए .bat, लेकिन वहां आपके पास है)। विंडोज के कमांड रिज़ॉल्वर को npm दिखाई देगा, ध्यान दें कि यह निष्पादन योग्य नहीं है, npm.cmd देखें, और फिर ध्यान दें कि निष्पादन योग्य है, और उसके बाद इसका उपयोग करेंगे। यह टर्मिनल में होने पर सहायक होता है, लेकिन spawn() ऐसा कोई समाधान नहीं करेगा: इसे npm पास करने से यह विफल हो जाएगा क्योंकि यह निष्पादन योग्य नहीं है। कमांड के रूप में इसे npm.cmd पास करना, हालांकि, ठीक काम करता है।

(इसके अलावा, यकीन नहीं क्यों rm, पहले असफल रहा था के बाद से है कि वास्तव में कोई भी परिवर्तन है कि मैं बता सकता हूँ बिना सही ढंग से काम करता है। शायद पढ़ने में भूलना है कि समस्या है जब यह तथ्य यह नहीं था। के हिस्से के रूप)

तो : यदि आप spawn में विंडोज़ में ईनोन्ट कहते हैं, जब आप एक कमांड प्रॉम्प्ट में काम करने के लिए कमांड को ट्रिगर करने का प्रयास कर रहे हैं, तो पता लगाएं कि आप जिस कमांड को कॉल कर रहे हैं वह सच निष्पादन योग्य है, या .bat/.cmd फ़ाइल है या नहीं कमांड प्रॉम्प्ट इसके बजाय आपके लिए "मददगार" चलाएगा। यदि ऐसा है, तो उसको चिल्लाओ।

संपादित

के बाद से इस पोस्ट अभी भी upvotes हो रही है, आदेश हमेशा काम करता है सुनिश्चित करने के लिए एक अच्छा तरीका है पर process.platform आधारित यह bootstrap करने के लिए है, जो खिड़कियों के लिए win32 हो जाएगा। प्रक्रिया के लिए

var npm = (process.platform === "win32" ? "npm.cmd" : "npm"), 
    child = spawn(npm, ["install", ...]); 
... 
+1

एक '.cmd' फ़ाइल [लगभग एक ही चीज़] है (http://stackoverflow.com/questions/148968/windows-batch-files-bat-vs-cmd) लेकिन काफी नहीं। – tadman

+1

आप 'exec (" npm इंस्टॉल ... ") का उपयोग कर सकते थे 'जो वास्तव में उन विंडो पर काम करता है जहां' spawn' विफल रहता है। हालांकि 'exec' आपको लाइव स्टडआउट/stderr डेटा (AFAIK) नहीं देगा। –

+2

नहीं मैं नहीं कर सका; जैसा कि आप इंगित करते हैं, निष्पादन में stdout और stderr हैंडलिंग नहीं है, और लॉग के बिना एक npm इंस्टॉल बहुत बेकार है। –

0

मुझे लगता है कि यह किसी प्रकार का साइगविन गॉचा हो सकता है। मैं उबंटू 12.04 चला रहा हूं और आपकी समस्या को डुप्लिकेट करने की कोशिश की, लेकिन यह मेरे लिए ठीक काम करता है। संक्षेप में, मुझे कुछ भी नहीं दिख रहा है जो आप गलत कर रहे हैं।

यह विकल्प के बारे में शिकायत है, तो हो सकता है यह तो जैसे विभाजित कई विकल्पों में:

child = spawn("rm", ["-r", "-f", "node_modules"]); 

एक जय हो मेरी तरह का यही कारण है, लेकिन यह है कि रूप में अच्छी तरह से मेरे Ubuntu 12.04 पर काम करता है। आप केवल एक फ़ाइल को हटाने का प्रयास कर सकते हैं और देख सकते हैं कि आपको वही चीज़ मिलती है या नहीं।

child = spawn("rm", ["/home/username/Desktop/TestFile"]); 

यदि यह अभी भी विफल रहता है, तो आप जानते हैं कि आप कुछ पागल सामान के खिलाफ काम कर रहे हैं।

तुम भी सिर्फ इसलिए की तरह कोई पैरामीटर के साथ एक कमांड निष्पादित करने के लिए कोशिश कर सकते:

child = spawn("ls"); 

हैं कि अभी भी विफल रहता है, आप अंडे प्राप्त करने के लिए बिल्कुल भी काम करने के लिए मेरा अनुमान हो सकता है और आभारी होंगे संभावना नहीं हैं कि कम से कम निष्पादन काम कर रहा है।

आपके लिए उत्तर के दायरे में ज्यादा कुछ नहीं, लेकिन जैसा कि मैंने कहा, मैं कुछ भी गलत तरीके से नहीं देख पा रहा हूं।

इसके अलावा, मुझे नहीं लगता कि आपका एनपीएम कमांड कैसे काम करेगा, क्योंकि आप यह निर्दिष्ट नहीं कर रहे हैं कि इंस्टॉल करना क्या है, लेकिन कहा जा रहा है कि यह एक अलग तरीके से विफल रहता है, क्योंकि मैं इसे यहां विफल कर रहा हूं अगर मैं इसे विफल कर रहा हूं एक ही कमांड का प्रयोग करें। । । मैं बहुत सारे stderr आउटपुट देखता हूं, एक समग्र त्रुटि नहीं।

बीटीडब्ल्यू, मैं नोड v0.8.21 चला रहा हूं। आप node -v द्वारा क्वेरी कर सकते हैं। यदि आप एक और संस्करण चला रहे हैं, तो शायद 0.8 दें।21 एक कोशिश करो।

+0

पता चला है तो यह और भी है कि अधिक से अधिक मजेदार था। एक उत्तर जोड़ा जो बताता है कि वास्तव में क्या हो रहा था। –

+0

मैं साइगविन नहीं चलाता इसलिए मुझे यकीन नहीं है कि यह निष्पादन योग्य है, लेकिन निष्पादन या स्पॉन को पहले साइगविन चलाने की आवश्यकता है, फिर सिग्विन 'आरएम' चलाता है। –

-1

उपयोग पूर्ण पथ, जैसे:

var cmd = require('child_process').spawn("C:\\windows\\system32\\cmd.exe"); 
+1

जो केवल तभी काम करता है यदि आप पहले से ही निष्पादन योग्य के एक्सटेंशन और स्थान को जानते हैं। हार्डकोडिंग उन लोगों को तुरंत आपके प्रोजेक्ट को किसी अन्य व्यक्ति के कंप्यूटर पर काम करने से रोकती है, अकेले काम करने वाले क्रॉस-प्लेटफॉर्म को छोड़ दें। –

संबंधित मुद्दे