2013-04-11 8 views
58

क्या मैं Node.js में चल रहे जावास्क्रिप्ट फ़ाइल से एनपीएम पैकेज स्थापित कर सकता हूं? उदाहरण के लिए, मुझे एक स्क्रिप्ट चाहिए, चलिए इसे "script.js" कहते हैं कि किसी भी तरह (... एनपीएम का उपयोग कर या नहीं ...) आमतौर पर एनपीएम के माध्यम से उपलब्ध एक पैकेज स्थापित करें। इस उदाहरण में, मैं "एफएफआई" स्थापित करना चाहता हूं। (NPM ffi स्थापित)क्या मैं Node.js में चल रहे जावास्क्रिप्ट से एनपीएम पैकेज स्थापित कर सकता हूं?

उत्तर

81

यह वास्तव में प्रोग्राम के रूप में NPM का उपयोग करना संभव है, और यह दस्तावेज के पुराने संशोधनों में उल्लिखित किया गया। इसके बाद से आधिकारिक दस्तावेज से हटा दिया गया, लेकिन अभी भी निम्न कथन से स्रोत नियंत्रण पर मौजूद है:

हालांकि NPM प्रोग्राम के रूप में इस्तेमाल किया जा सकता है अपने एपीआई CLI केवल द्वारा प्रयोग के लिए है, और इसकी कोई गारंटी नहीं किसी भी अन्य उद्देश्य के लिए अपनी फिटनेस के संबंध में बनाया गया। यदि आप विश्वसनीय रूप से कुछ कार्य करने के लिए एनपीएम का उपयोग करना चाहते हैं, तो सबसे सुरक्षित बात यह है कि उपयुक्त तर्कों के साथ वांछित एनपीएम कमांड का आह्वान करना है।

NPM का अर्थ संस्करण बल्कि अंतर्निहित एपीआई से, CLI खुद को दर्शाता है। आंतरिक एपीआई स्थिर रहने के लिए गारंटी नहीं तब भी जब NPM के संस्करण को इंगित करता है कोई तोड़ने परिवर्तन semver के अनुसार बनाया गया है है।

var npm = require('npm') 
npm.load(myConfigObject, function (er) { 
    if (er) return handlError(er) 
    npm.commands.install(['some', 'args'], function (er, data) { 
    if (er) return commandFailed(er) 
    // command succeeded, and data might have some info 
    }) 
    npm.registry.log.on('log', function (message) { ... }) 
}) 

के बाद से NPMnode_modules फ़ोल्डर में मौजूद है, आप require('npm') उपयोग कर सकते हैं किसी भी अन्य मॉड्यूल की तरह लोड करने के लिए:

मूल प्रलेखन में, निम्नलिखित कोड नमूना है कि प्रदान किया गया था। मॉड्यूल स्थापित करने के लिए, आप npm.commands.install() का उपयोग करना चाहेंगे।

आप स्रोत में देखने की जरूरत है, तो यह GitHub पर भी है।

var npm = require('npm'); 
npm.load(function(err) { 
    // handle errors 

    // install module ffi 
    npm.commands.install(['ffi'], function(er, data) { 
    // log errors or data 
    }); 

    npm.on('log', function(message) { 
    // log installation progress 
    console.log(message); 
    }); 
}); 

ध्यान दें कि स्थापित कार्य करने के लिए पहला तर्क एक सरणी है: यहाँ कोड है, जो किसी भी कमांड लाइन तर्क के बिना npm install चल के बराबर है की एक पूरी काम कर उदाहरण है। सरणी का प्रत्येक तत्व एक मॉड्यूल है जो npm स्थापित करने का प्रयास करेगा।

अधिक उन्नत उपयोग स्रोत नियंत्रण पर npm-cli.js फ़ाइल में पाया जा सकता।

+4

यदि यह किसी की सहायता करता है- सुनिश्चित करें कि आप पहले npm - nave' इंस्टॉल करें। उदाहरण बहुत अच्छा काम करता है :) – mikermcneil

+3

इसके अलावा, सावधान रहें- 'npm' में बहुत सारी निर्भरताएं हैं, इसलिए इसे अपने मॉड्यूल में जोड़ना संभवत: डाउनलोड करने में अधिक समय लगेगा। अपने उपयोगकर्ताओं की मशीनों पर पहले से स्थापित वैश्विक एनपीएम का लाभ उठाने के लिए 'child_process' उत्तरों में से एक को देखें। – mikermcneil

+0

'npm.config' को' npm.load' पर पास न करें! यहां तक ​​कि @isaacs नहीं जानता कि किस तरह की अजीब चीजें तब होती हैं! Https://github.com/npm/npm/issues/4861#issuecomment-40533836 इसके बजाय, आप केवल 1 तर्क छोड़ सकते हैं। –

17

हां। यदि आप एक प्रणाली आदेश पर अमल करने

var exec = require('child_process').exec, 
    child; 

child = exec('npm install ffi', 
function (error, stdout, stderr) { 
    console.log('stdout: ' + stdout); 
    console.log('stderr: ' + stderr); 
    if (error !== null) { 
      console.log('exec error: ' + error); 
    } 
}); 
+2

हां, आप कर सकते हैं, हालांकि कुछ निर्भरताएं स्थापित करने में असफल रहेंगी (अनुभव से बात कर रही है, क्योंकि एक बार जब मैंने वास्तव में एक [सीआई] (https://github.com/matejkramny/node-ci) सर्वर node.js के लिए लिखा था) –

+3

विंडोज़ पर यह काम नहीं करता है! आपको इसके बजाय 'npm.cmd' कॉल करना होगा। – DUzun

5

थोड़ा आसान

var exec = require('child_process').exec; 
child = exec('npm install ffi').stderr.pipe(process.stderr); 
+1

यह भी लाभ है कि stderr (और stdout) मुद्रित होते हैं जैसे कि वे निष्पादन के अंत में नहीं होते हैं! – mvermand

8

अगर आप आउटपुट के रूप में अच्छी तरह से करना चाहते हैं child_process उपयोग कर सकते हैं आप उपयोग कर सकते हैं यह वास्तव में हो सकता है:

var child_process = require('child_process'); 
child_process.execSync("npm install ffi",{stdio:[0,1,2]}); 

इस जिस तरह से आप इंस्टॉलेशन देख सकते हैं जैसे आप इसे हाथ में करते हैं और खराब आश्चर्य से बचते हैं (बफर पूर्ण, आदि)

1

मेरे पास एक परियोजना निर्देशिका के अंदर काम करने के लिए पहला उदाहरण प्राप्त करने का प्रयास करने का एक समय था, अगर किसी और को यह पता चलता है तो यहां पोस्ट करना।जहाँ तक मेरा बता सकते हैं, NPM अभी भी काम करता है ठीक सीधे लोड, लेकिन क्योंकि यह CLI मान लिया गया है, हम अपने आप एक छोटे से यह स्थापित करने दोहराना:

// this must come before load to set your project directory 
var previous = process.cwd(); 
process.chdir(project); 

// this is the part missing from the example above 
var conf = {'bin-links': false, verbose: true, prefix: project} 

// this is all mostly the same 

var cli = require('npm'); 
cli.load(conf, (err) => { 
    // handle errors 
    if(err) { 
     return reject(err); 
    } 

    // install module 
    cli.commands.install(['ffi'], (er, data) => { 
     process.chdir(previous); 
     if(err) { 
      reject(err); 
     } 
     // log errors or data 
     resolve(data); 
    }); 

    cli.on('log', (message) => { 
     // log installation progress 
     console.log(message); 
    }); 
}); 
0

मैं एक मॉड्यूल के लेखक ऐसा करने की अनुमति कर रहा हूँ वास्तव में आपके मन में क्या है। live-plugin-manager देखें।

आप एनपीएम, गिथब या किसी फ़ोल्डर से लगभग किसी भी पैकेज को स्थापित और चला सकते हैं।

एक उदाहरण यहाँ:

import {PluginManager} from "live-plugin-manager"; 

const manager = new PluginManager(); 

async function run() { 
    await manager.install("moment"); 

    const moment = manager.require("moment"); 
    console.log(moment().format()); 

    await manager.uninstall("moment"); 
} 

run(); 

उपरोक्त कोड में मैं क्रम, लोड पर moment पैकेज स्थापित करने और इसे निष्पादित। अंत में मैं इसे अनइंस्टॉल करता हूं।

आंतरिक रूप से मैं npm क्ली नहीं चलाता लेकिन वास्तव में संकुल डाउनलोड करता हूं और नोड वीएम सैंडबॉक्स के अंदर चलाता हूं।

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

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