माणिक्य के लिए बंडल की तरह आवश्यक संकुल को स्थापित करने या अद्यतन करने के लिए npm का उपयोग करना


88

मैं बुंडलर से प्यार करता हूं , यह निर्भरता प्रबंधन में बहुत अच्छा है। मुझे npm से प्यार है , नोड पैकेज स्थापित करना आसान है! मेरे पास एक नोडज एप्लिकेशन है और मैं अपने ऐप की निर्भरता को निर्दिष्ट करने और उन्हें आसानी से स्थापित / अपडेट करने में सक्षम होना चाहूंगा जहां भी मैं अपना ऐप तैनात करता हूं। यह एक पुस्तकालय नहीं है जिसे मैं जारी कर रहा हूं, यह एक पूर्ण वेब-ऐप है।

मुझे npm bundleकमांड के बारे में पता है , लेकिन यह केवल उस निर्देशिका को ओवरराइड करने के लिए लगता है जहां पैकेज स्थापित हैं।

मैं इस तरह से बंडलर का उपयोग करने के लिए उपयोग किया जाता हूं:

# Gemfile
gem "rails", "3.0.3"

होस्ट मशीन पर रेल v3.0.3 और किसी भी अन्य आवश्यक रत्नों को स्थापित करता है, अगर यह पहले से मौजूद नहीं है

> bundle install

मैं npm के साथ कुछ समान कैसे प्राप्त कर सकता हूं?


क्या आप जानना चाहते हैं मेरा जवाब नहीं है?
अल्फ्रेड

जवाबों:


147

Npm 1.0 के अनुसार (जो कि अब आप डिफ़ॉल्ट रूप से प्राप्त करते हैं यदि आप README फ़ाइल में दिए चरणों का पालन करते हैं), "बंडल" अब एक अलग चीज नहीं है - यह सिर्फ "यह कैसे काम करता है"।

इसलिए:

  1. package.jsonअपनी परियोजना की जड़ में एक फ़ाइल रखो
  2. उस फ़ाइल में अपने deps को सूचीबद्ध करें

    { "name" : "my-project"
    , "version" : "1.0.0"
    , "dependencies" : { "express" : "1.0.0" } }
    
  3. npm install चूँकि आप इसे बिना किसी आर्ग के, और वैश्विक मोड में नहीं बुला रहे हैं, यह सिर्फ आपके सभी डिपो को स्थानीय रूप से स्थापित करेगा।

  4. require("express") और खुश रहो।

2
जब उत्पादन में होता है, तो मैं अत्यधिक स्थानीय your_app/node_modulesनिर्देशिका को आपके ऐप निर्देशिका के बाहर एक सिमलिंक में बदलने की सलाह देता हूं । आपको हर बार आपके द्वारा निर्भरता को डाउनलोड करने, बनाने और स्थापित करने की आवश्यकता नहीं है।
डैनियल बर्ड्सले

ठीक। क्या होगा अगर मैं अपने पैकेज को अपडेट करना भूल जाऊं। json? क्या एनपीएम को पैकेज के लिए देखने के लिए बाध्य करने का कोई तरीका नहीं है। लेकिन मुझे अपने कोड में उपयोग किए जा रहे पैकेज के लिए नहीं है?
पोनो

4
यह काफी सही नहीं है। NPM ऊपर के लिए सभी निर्भरता स्थापित हो जाएगा my-projectमें ./node_modules/my-project/node_modules। मुझे यकीन नहीं है कि अगर ./node_modules किसी में सभी निर्भरताएं स्थापित करने का एक सुविधाजनक तरीका है ?
डैनियल बर्ड्सले

@DanielBeardsley मुझे नहीं लगता कि npm कैसे काम करता है। यदि आप उस व्यवहार को देख रहे हैं, और आप इसे पुन: पेश कर सकते हैं, तो कृपया npm github पृष्ठ पर एक समस्या पोस्ट करें।
isaacs

2
@DanielBeardsley से सहमत हैं। मुझे लगता है कि व्यवहार से भी NPM 1.1.70 के साथ पीड़ित हैं
graffic

10

संपादित करें: यह केवल npm संस्करणों पर लागू होता है <1.0


यह पता लगाना काफी मुश्किल था, लेकिन एनपीएम यह संभव बनाता है

आपको तीन घटकों की आवश्यकता है

  1. आपके भंडार में एक उपनिर्देशिका (यानी deps/)
  2. package.jsonउपरोक्त निर्देशिका में एक फ़ाइल जो निर्भरता को सूचीबद्ध करती है
  3. index.jsउपरोक्त निर्देशिका में एक फ़ाइल जिसे आपकी निर्भरता की आवश्यकता होती है

उदाहरण

कल्पना करें कि एक्सप्रेस आपकी एकमात्र निर्भरता है

deps / package.json

नोट: हर बार जब आप निर्भरता को संशोधित करते हैं तो संस्करण # बढ़ाएँ

{
  "name": "myapp_dependencies",
  "version": "0.0.1",
  "engines": {
    "node": "0.4.1"
  },
  "dependencies":{
    "express": "2.0.0beta2"
  }
}

deps / index.js

export.modules = {
  express: require('express')
  //add more
}

अब आपको npm का उपयोग करके अपनी निर्भरता स्थापित करने में सक्षम होना चाहिए। आप अपनी तैनाती प्रक्रिया का हिस्सा भी बना सकते हैं

cd deps
npm install

फिर अपने ऐप कोड के भीतर आप इस तरह के अपने विशिष्ट संस्करण तक पहुंच प्राप्त कर सकते हैं:

var express = require('myapp_dependencies').express;

धन्यवाद, यह सबसे अच्छी विधि है जिसे मैंने अब तक देखा है। हालांकि, require('express')डिपो / इंडेक्स.जेएस में नवीनतम एक्सप्रेस संस्करण को आयात नहीं किया जाएगा, और जरूरी नहीं कि हम जिसे स्थापित करें? मैं एक नोडज नॉब हूं इसलिए कृपया मेरे साथ रहें।
adamJLev 16

नहीं, इसका जादू है npm install, यह आपके इंस्टॉल किए गए पैकेज की निर्देशिका के भीतर निर्भर पैकेजों के सही संस्करणों में सीमलिंक जोड़ता है। जब आपकी निर्भरता पैकेज की आवश्यकता होती है, तो require('express')पहले स्थानीय निर्देशिका की जांच करें और एक्सप्रेस के सही संस्करण के लिए सिमिलिंक को ढूंढें।
डैनियल बर्ड्सले

5

आपको आइजैक (लेखक एनपीएम) ब्लॉग से इन दो लेखों को पढ़ना चाहिए। मुझे लगता है कि वे वास्तव में अच्छे हैं, और मेरा मानना ​​है कि आपको अपने लक्ष्य को प्राप्त करने का तरीका बताया गया है:

  1. http://blog.izs.me/post/1675072029/10-cool-things-you-probably-didnt-realize-npm-could-do
  2. http://foohack.com/2010/08/intro-to-npm/

मेरा मानना ​​है कि लिंक # 1 (बिंदु # 11) यह बताता है:

11: अपने सभी आश्रितों को पैकेज में ही बांधें

जब आप npm बंडल कमांड का उपयोग करते हैं, तो npm आपके सभी आश्रितों को अपने पैकेज में node_modules फ़ोल्डर में डाल देगा। लेकिन यह वहाँ बंद नहीं करता है।

यदि आप किसी ऐसी चीज़ पर निर्भर रहना चाहते हैं जो रजिस्ट्री पर नहीं है, तो आप ऐसा कर सकते हैं। बस यह करें:

NPM स्थापित बंडल http://github.com/whoever/whatever/tarball/master इस बंडल में है कि टारबॉल की सामग्री को स्थापित हो जाएगा, और फिर आप किसी निर्भरता के रूप में यह सूचीबद्ध कर सकते हैं, और यह जब यह स्थापित करने का प्रयास नहीं करेंगे आपका पैकेज स्थापित हो जाता है।

यह भी आसान है अगर आपके पास कुछ का अपना कांटा है, और नाम नहीं बदलना पसंद करेंगे।

वास्तव में, आप बंडल में लगभग किसी भी npm कमांड को चला सकते हैं। अंदर क्या है यह देखने के लिए, आप npm बंडल एलएस कर सकते हैं। कुछ हटाने के लिए, npm बंडल rm चीज़ करें। और, ज़ाहिर है, आप कई संस्करण स्थापित कर सकते हैं और जिसको आप चाहते हैं उसे सक्रिय कर सकते हैं।


यह उपयोगी है, हालांकि यह वह नहीं था जिसकी मुझे तलाश थी। शायद मुझे स्पष्टीकरण जोड़ने की जरूरत है। मैं स्वचालित रूप से स्थापित करने या अपडेट (गंतव्य मशीन पर) एनपीएम पैकेजों की तलाश कर रहा हूं, जब भी मैं इसे तैनात करता हूं, तो मेरा ऐप निर्भर करता है। ऐसा लगता npm bundleहै कि डिफ़ॉल्ट के अलावा एक विशिष्ट निर्देशिका में अपने सभी निर्भरता को इकट्ठा करने के लिए उपयोग किया जाता है। मैं शायद अपने स्वयं के समाधान के साथ आ जाएगा कि इसी तरह के प्रदर्शन bundle install( bundlerमाणिक के लिए)
डैनियल बिअर्ड्सली

1
npmसंस्करण 1.0+ के बाद से बस एक नोट npm bundleको हटा दिया गया है। इसके बजाय, बस npm installबिना संकुल नाम के कमांड का उपयोग करें, यह package.json को पढ़ेगा और आवश्यक संकुल को नीचे खींचेगा।
आर्थर माल्टसन

2

एनपीएम संस्करण 1.1.2 के रूप में, एक नया कमांड है npm shrinkwrapजो एक npm-shrinkwrapped.jsonफाइल बनाता है , जिसके अनुरूप है Gemfile.lock। सॉफ्टवेयर रोट को रोकने के लिए, एक बनाना महत्वपूर्ण है (देखें बुंडलर के तर्क )। विशेष रूप से Nodejs में इतनी तेजी से आगे बढ़ने वाला समुदाय है।

स्वचालित रूप से bundle installबनाते समय Gemfile.lock, npm installनहीं बनाएंगे npm-shrinkwrapped.json(लेकिन मौजूद होने पर इसका उपयोग करेंगे)। इसलिए आपको उपयोग करने के लिए याद रखना चाहिए npm shrinkwrap

एक पूर्ण गाइड पढ़ें http://blog.nodejs.org/2012/02/27/managing-node-js-dependencies-with-shrinkwrap/


2

यह मुझे लगता है कि सबसे सरल समाधान ध्वज के package.jsonसाथ एक फ़ाइल का उपयोग करना है private(पिछले महीने npm में जोड़ा गया) true। इस तरह, आप अपनी परियोजना की निर्भरता को चला सकते हैं npm installया npm bundleहड़प सकते हैं, लेकिन आप किसी को गलती से अपने गैर-सार्वजनिक प्रोजेक्ट को प्रकाशित करने से रोक सकते हैं।

यहाँ एक उदाहरण है package.json:

{
"name": "yourProject"
,"version": "1.0.0"
,"dependencies": { "express" : ">=2.1.0" }
,"private": true
}

यदि यह पहले से मौजूद नहीं है, तो स्थानीय सिस्टम पर रनिंग npm installस्थापित होगी express; चल रहा है npm publishकी वजह से एक त्रुटि देता है "private": true

आप और आपकी टीम समय के साथ निर्भरता परिवर्तनों को ट्रैक करने के लिए आंतरिक रूप से संस्करण टैग का उपयोग कर सकते हैं-हर बार जब आप निर्भरता बदलते हैं, तो संस्करण को टक्कर दें। यह देखने के लिए कि आपने कौन सा संस्करण इंस्टॉल किया है, का उपयोग करें npm ls installed


मुझे लगता है कि आपको उद्धरण नहीं देना चाहिए trueऔर यह केवल इसलिए काम कर रहा है क्योंकि तार सत्य मान हैं (जो है !!"false" === true)।
कैमिलो मार्टिन

1

साथ npmही अपने ऐप को प्रकाशित करें , और अपने पैकेज में इसकी निर्भरता सूची दें। json फ़ाइल।

जब कोई npmआपके पैकेज को स्थापित करने के लिए उपयोग करता है, npmतो उसकी निर्भरता को हल करने का ध्यान रखेगा।

पैकेज कल्पना: http://wiki.commonjs.org/wiki/Packages/1.0


हाँ, लेकिन यह एक नॉन-ओपनसोर्स वेब ऐप है। यदि आपके पास एक ऐसा विचार है जिसमें ऐप प्रकाशित करना शामिल नहीं है, तो कृपया अपना उत्तर संपादित करें या कोई अन्य बनाएं।
डैनियल बर्ड्सले

1
फिर "myapp- निर्भरता" जैसे एक पैकेज प्रकाशित करें, जिसका उपयोग आपके उपयोगकर्ता npmआपके ऐप को इंस्टॉल करने से पहले कर सकते हैं । मुझे नहीं लगता कि gemनोड.जेएस के लिए कोई अन्य समकक्ष है।
डैन ग्रॉसमैन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.