क्या एक ही npmrc फ़ाइल में कई रजिस्ट्रियों को कॉन्फ़िगर करने का कोई तरीका है


143

यहाँ मेरी समस्या है। हमारे पास एक निजी एनपीएम रजिस्ट्री है जो केवल वीपीएन में काम करती है। मैं फॉलबैक रजिस्ट्री https://registry.npmjs.org करना चाहूंगा ताकि जब मैं वीपीएन से बाहर हो तो यह मूल रूप से काम करे।

PS वर्तमान में मैं npmrc का उपयोग कर रहा हूं, जो .npmrc फाइलों को वर्कअराउंड के बीच स्विच करने में अच्छा काम करता है


8
मैं वास्तव में एक ही बात जानना पसंद करूंगा। हो सकता है कि या तो मेरी निजी रजिस्ट्री पहले पिंग हो गई हो और यदि वह सार्वजनिक रजिस्ट्री (स्थानीय गिरावट से, निजी सर्वर पर एक सेटअप नहीं) से कमबैक में विफल हो जाए। या वैकल्पिक रूप से मेरे वाईफाई नाम के आधार पर मेरी रजिस्ट्री को स्विच करना।
प्रोलर

1
खुद की तरह खो आत्माओं के लिए, एक उपयोगी डॉक्टर के लिए npmrc
एंड्रियास

जवाबों:


194

आप अपनी फ़ाइल में संकुल पैकेज के लिए कई रजिस्ट्रियां कर सकते हैं .npmrc। उदाहरण के लिए:

@polymer:registry=<url register A>
registry=http://localhost:4873/

@polymerस्कोप के तहत पैकेज https://registry.npmjs.org से प्राप्त किए जाएंगे , लेकिन बाकी आपके स्थानीय एनपीएम से प्राप्त किए जाएंगे।


15
इस सलाह के लिए धन्यवाद। क्या आप बता सकते हैं कि क्या इन स्कोप रजिस्ट्रियों में प्रमाणीकरण जोड़ना संभव है? क्योंकि मुझे अपनी मुख्य रजिस्ट्री के लिए _auth कुंजी की आवश्यकता है।
ब्लूमका

3
स्कॉप्ड पैकेज क्या है? मैंने इसके बारे में कभी नहीं सुना।
जुल्लम

1
@jcollum, स्कोप पैकेज केवल एक नेमस्पेस के माध्यम से समूहीकृत (या स्कॉप्ड) पैकेज हैं। देखें docs.npmjs.com/misc/scope जानकारी के लिए। स्कोपिंग का उपयोग कई पैकेजों को जोड़ने के लिए किया जा सकता है (जैसे @angular) जो यह जानना आसान बनाता है कि पैकेज (@ कोणीय / कोर) कोणीय का हिस्सा है, लेकिन @ mycompany / mypackage जैसी कंपनी भी हो सकती है।
पाटस

6
क्या यह बिना पैकेज के संभव है? मान लीजिए कि हम इस विशिष्ट पैकेज की तलाश में हैं, तो इस रजिस्ट्री पर जाएं, अन्यथा उस रजिस्ट्री पर जाएं
PinguinoSod

2
@PinguinoSod, नहीं, यह अभी भी है (दिसंबर 2019 के अनुसार) गैर-स्कॉप्ड पैकेज के लिए संभव नहीं है। Sonatype ही एकमात्र उपाय है जिसके बारे में मुझे पता है। देखें stackoverflow.com/a/50995915/3281336
पैट्स

71

4.4.1 संस्करण पर, यदि आप पैकेज का नाम बदल सकते हैं, तो उपयोग करें:

npm config set @myco:registry http://reg.example.com

@mycoआपके पैकेज की गुंजाइश कहां है

आप इस तरह से पैकेज स्थापित कर सकते हैं:

npm install @myco/my-package

अधिक जानकारी के लिए: https://docs.npmjs.com/misc/scope


स्कोप (npm init --scope = myco) के साथ अपने पैकेज को इनिट करना भी आवश्यक है और फिर इसे प्रकाशित करें।
गजेगदेश २

1
ठीक है, लेकिन उस रजिस्ट्री के लिए एक
कमबैक

1
Invalid package name "@npmjs/": name can only contain URL-friendly charactersजब मैं दौड़ता हूं तो मुझे मिल रहा हैnpm i
umutesen

मेरा यह भी नाम है कि केवल URL के अनुकूल वर्ण त्रुटि हो सकती है
katwhocodes

यह दृष्टिकोण मेरे लिए साफ-सुथरा दिखता है। वहाँ पैकेज में यह करने के लिए एक रास्ता है। Json?
हरि कृष्ण गद्दीपति

19

प्रमाणीकरण के लिए एक समाधान के लिए भी देख रहे किसी के लिए, मैं scoped संकुल समाधान है कि आप अपनी .npmrcफ़ाइल में कई लाइनें हो सकता है पर जोड़ देगा :

//internal-npm.example.com:8080/:_authToken=xxxxxxxxxxxxxxx
//registry.npmjs.org/:_authToken=yyyyyyyyyy

प्रत्येक पंक्ति एक अलग एनपीएम रजिस्ट्री का प्रतिनिधित्व करती है


4
मैं कमांड का उपयोग करूंगा npm login --registry=npm.example.com। यह आपके उपयोगकर्ता फ़ोल्डर में .npmrc फ़ाइल में लॉगिन क्रेडेंशियल (ऑक्टोटेकेन्स) को संग्रहीत करेगा, इसलिए आपको इसे स्रोत कोड ( docs.npmjs.com/cli/adduser )
magMMaker

यह मेरे लिए काम करता है, धन्यवाद, मूल रूप से मेरे पास मेरे काम के लिए निजी नेक्सस रजिस्ट्री थी, लेकिन मेरे लीब के पास कुछ और निर्भरताएं हैं जिन्हें स्थापित करने की आवश्यकता है registry.npmjs.org, इसने मेरे लिए काम किया
चानुका असंका

17

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

##############NPM ALIASES######################
alias npm-default='npm config set registry https://registry.npmjs.org'
alias npm-sinopia='npm config set registry http://localhost:4873/'

2
इसी तरह का एक समाधान एक उपनाम स्थापित करने के लिए है जो npm के लिए --registry विकल्प से गुजरता है। इसका एक ही प्रभाव है, लेकिन केवल एकल कमांड के लिए। सिंटेक्स हैalias npm-sin=npm --registry https://localhost:4873/
पेट्स

11

चूँकि यह एक दो साल का है और ऐसा करना संभव नहीं लगता है (अकेले npm का उपयोग करके), इस समस्या का एक समाधान नेक्सस रिपोजिटरी प्रबंधक (सोनाटाइप से) का उपयोग करना है। नेक्सस कई रिपॉजिटरी का समर्थन करता है, जिससे आप उन्हें ऑर्डर कर सकते हैं, और गति में सुधार के लिए प्रॉक्सी / कैश भी कर सकते हैं।

एक नि: शुल्क संस्करण और प्रो / सशुल्क संस्करण मौजूद हैं। इसका समर्थन करने वाली विशेषता का वर्णन यहां किया गया है: https://help.sonatype.com/repomanager3/node-packaged-modules-and-npm-registries

प्रासंगिक जानकारी को नीचे डुप्लिकेट किया गया है, यदि / जब उपरोक्त URL / लिंक काम करना बंद कर देता है तो जानकारी अभी भी यहाँ है।

एक रिपॉजिटरी समूह किसी भी और ग्राहक पक्ष विन्यास की आवश्यकता के बिना, अपने उपयोगकर्ता के लिए रिपॉजिटरी प्रबंधक से रिपॉजिटरी को अपने सभी npm रजिस्ट्रियों को उजागर करने के लिए अनुशंसित तरीका है। एक रिपॉजिटरी समूह आपको कई प्रॉक्सी और होस्ट किए गए रिपॉजिटरी की एकत्रित सामग्री को एक URL से npm और अन्य टूल के साथ उजागर करने की अनुमति देता है।

यह आपको निजी npm रजिस्ट्रियां बनाने की सुविधा देता है

एक निजी एनपीएम रजिस्ट्री का उपयोग आपके अपने पैकेजों के साथ-साथ तीसरे पक्ष के पैकेजों को अपलोड करने के लिए किया जा सकता है।

तथा

अपने डेवलपर्स और CI सर्वर के लिए डुप्लिकेट डाउनलोड को कम करने और डाउनलोड की गति में सुधार करने के लिए, आपको https://registry.npmjs.org पर होस्ट की गई रजिस्ट्री को प्रॉक्सी करना चाहिए । डिफ़ॉल्ट रूप से npm इस रजिस्ट्री को सीधे एक्सेस करता है। आप किसी अन्य रजिस्ट्रियों को भी प्रॉक्सी कर सकते हैं जिनकी आपको आवश्यकता है।

इस काम को पाने के लिए आपके द्वारा की जाने वाली चीजों की एक त्वरित बुलेटेड सूची है:

  • नेक्सस स्थापित करें

  • एक स्थानीय / निजी रेपो बनाएं (या किसी अन्य सर्वर पर अपने निजी रेपो को इंगित करें)

  • एक ग्रुप बनाएं जो आपके प्राइवेट रेपो और पब्लिक रेपो को सूचीबद्ध करे।

  • अभी बनाए गए "ग्रुप" को इंगित करने के लिए अपनी $ HOME / .npmrc फ़ाइल को कॉन्फ़िगर करें।

  • स्थानीय रेपो में अपने निजी npm संकुल प्रकाशित करें।

  • उपयोगकर्ता अब एक बार सेटअप चला सकते हैं।

npm config set registry https://nexus/content/groups/GROUP

  • तब उपयोगकर्ता सार्वजनिक या निजी पैकेज दोनों के माध्यम से स्थापित कर सकते हैं npm install npm install my-private-package npm install lodash any-other-public-package

और आपके सार्वजनिक और निजी पैकेज दोनों को एक साधारण npm installकमांड के माध्यम से स्थापित किया जा सकता है । Nexus समूह में कॉन्फ़िगर किए गए प्रत्येक रेपो को खोजता हुआ पैकेज पाता है और परिणाम लौटाता है। तो npm अभी भी सोचता है कि सिर्फ एक रजिस्ट्री है लेकिन पर्दे के पीछे कई रिपोज का इस्तेमाल किया जा रहा है।

महत्वपूर्ण नोट: जब आप अपने घटकों को प्रकाशित करते हैं, तो आपको npm publish --registry https://nexus/content/repositories/private-repo my-private-packageकमांड निर्दिष्ट करने की आवश्यकता होगी ताकि आपका पैकेज सही रेपो में प्रकाशित हो।


क्या मैं .npmrc फ़ाइल में दोनों रजिस्ट्री (अपनी खुद की कलाकृतियों को तैनात करने और सार्वजनिक कलाकृतियों को खींचने के लिए) को कॉन्फ़िगर कर सकता हूं ताकि मुझे एनटीपी प्रकाशित करने के लिए हर बार उल्लेख नहीं करना पड़े? अपनी कलाकृतियों को आगे बढ़ाने के लिए मैं अलग npm रिपॉजिटरी का उपयोग कर रहा हूं और सभी कलाकृतियों को खींचने के लिए मैं वर्चुअल रिपॉजिटरी का उपयोग कर रहा हूं। कृपया मुझे .npmrc फ़ाइल दोनों को कॉन्फ़िगर करने में मदद करें।
अंशिता सिंह

1
@AshshitaSingh मैं बस इसके माध्यम से चला गया। यदि आप मुझे पसंद करते हैं, तो प्रकाशन के लिए एक अलग रिपॉजिटरी है (उदाहरण npm-privateके लिए npm-group), आप अपने प्रोजेक्ट के विवरण registryमें -की ओवरराइड कर सकते हैं package.json( https://blog.sonatype.com/using-nexus-3-as-your-repository-part-2-npm-packagesविवरण के लिए देखें)। इसका उपयोग करके npm config set registry <url>आप इसे उदाहरण के लिए सेट कर सकते हैं npm-group, जिसमें npm-registry(रिपॉजिटरी को अग्रेषित करना) और npm-private(आपका अपना रिपॉजिटरी) शामिल है। मैंने इस समाधान का उपयोग किया, क्योंकि स्थानीय गिटलैब सीई की कलाकृतियां मिलना बहुत जटिल था।
इगोर

7

आप registryअपनी .npmrcफ़ाइल में प्रविष्टि के लिए कई रिपॉजिटरी सिंटैक्स का उपयोग कर सकते हैं :

registry=http://serverA.url/repository-uri/
//serverB.url/repository-uri/
//serverC.url/repository-uri/:_authToken=00000000-0000-0000-0000-0000000000000
//registry.npmjs.org/

यह आपके npm को विभिन्न सर्वरों में पैकेजों के लिए तैयार करेगा।


हाँ, पर serverA, serverBऔर serverCउदाहरण के खजाने अपने आंतरिक नेटवर्क है, तो आप के लिए अभ्यस्त काम से सब कर रहे हैं। मुझे नहीं पता कि यह आपके लिए उपयुक्त है, लेकिन अगर आपको लगता है कि आप आंतरिक भंडार के लिए नेक्सस रिपोजिटरी प्रबंधक को तैनात करने की कोशिश कर सकते हैं।
फर्नांडो फर्नांडीस

1
इस प्रतिक्रिया के अनुसार डबल स्लैश का कोई अर्थ नहीं है, इसलिए आप बिना मूल्यों की कुंजी सेट कर रहे हैं
PinguinoSod

1
जहाँ तक मैं npm / ini प्रॉपर्टी फाइल रीडर से देख सकता था, वास्तव में, // को बिना किसी मूल्य के कुंजी के रूप में पढ़ा जाएगा। वैसे, स्कोप किए गए वर्गों की तरह, यह माध्यमिक रजिस्ट्री सर्वर के रूप में संग्रहीत किया जाएगा। वे npm में मिल जाएंगे और npm के आंतरिक मूल्यांकन एल्गोरिदम के अनुसार रजिस्ट्री कॉन्फ़िगरेशन सर्वर के रूप में संसाधित होंगे।
फर्नांडो फर्नांडीस

1
किसी ने इस समाधान की कोशिश की है क्या यह काम करता है और फॉलबैक रिपॉजिटरी को कॉन्फ़िगर करने में मदद करता है?
ल्यूक पी। इस्साक

3

कुछ कदम आप आजमा सकते हैं। (इसके कार्यस्थल पर हम इसे कैसे करते हैं)

  • दो (या अधिक) भंडार स्रोत पते के साथ एक रजिस्ट्री समूह बनाएँ। एक आपका आंतरिक निजी होगा और दूसरा आंतरिक को प्राथमिकता देने वाले npmjs के लिए एक प्रॉक्सी होगा।
  • इस समूह को .npmrc फ़ाइल में अपनी रजिस्ट्री बनाएँ। इस तरह से एनपीएम हमेशा इसे आंतरिक से प्राप्त करने की कोशिश करेगा, अगर यह प्रॉक्सी से नहीं मिला

उम्मीद है की वो मदद करदे।


6
Npm में एक रजिस्ट्री समूह कैसे बनता है? इसका क्या मतलब है?
तुपुर्तनुत

1
@Tuupertunut रजिस्ट्री सबसे आसान तरीका यह है कि यह सोनटाइप नेक्सस की तरह कुछ प्रकार के भंडार प्रबंधक का उपयोग करने के लिए होगा। यह निजी रजिस्ट्रियों की मेजबानी कर सकता है, npmjs में प्रॉक्सी के साथ-साथ रिपॉजिटरी समूह भी बना सकता है।
कौस अंटवाले ने


1

मैं उसी समस्या का सामना करता हूं जब मेरी कंपनी अपनी रजिस्ट्री स्थापित करती है, इसलिए मैं इस समस्या को हल करने के लिए प्रॉक्सी-मल्टी- रजिस्ट्रियों में प्रॉक्सी- रजिस्ट्री पर बहुत अधिक काम करता हूं । आशा है यह आपकी मदद भी करेगा।


1

13 अप्रैल 2020 तक ऐसी कोई कार्यक्षमता नहीं है जब तक कि आप अलग-अलग स्कोप का उपयोग करने में सक्षम नहीं होते हैं, लेकिन आप पोस्टस्क्रिप्ट स्क्रिप्ट को वर्कअराउंड के रूप में उपयोग कर सकते हैं । यह हमेशा निष्पादित होता है, ठीक है , प्रत्येक npm स्थापित होने के बाद :

कहते हैं कि आपके पास आपका .npmrc आपके निजी गितुब रेपो से @ foo-org / foo-pack-private स्थापित करने के लिए कॉन्फ़िगर किया गया है , लेकिन @ foo-org / foo-pack-public सार्वजनिक पैकेज npm पर है (उसी दायरे के तहत: foo- ओआरजी )।

आपकी पोस्ट स्थापना इस तरह दिख सकती है:

"scripts": {
    ...
    "postinstall": "mv .npmrc .npmrcc && npm i @foo-org/foo-pack --dry-run && mv .npmrcc .npmrc".
}

मत भूलना दूर करने के लिए संगठन को foo @ foo-पैक / से निर्भरता सरणी सुनिश्चित करने के लिए NPM स्थापित करने की कोशिश नहीं करता है और GitHub से इसे पाने और जोड़ने के लिए --dry रन झंडा कि यह सुनिश्चित करती है package.json और पैकेज npm इंस्टॉल होने के बाद लॉक.जॉन अपरिवर्तित रहता है ।


0

मेरा दृष्टिकोण एक मामूली कमांड लाइन संस्करण बनाने का था जो रजिस्ट्री स्विच को जोड़ता है।

मैंने इन फ़ाइलों को नोडज फोल्डर में बनाया है जहाँ npm निष्पादन योग्य पाया जाता है:

npm-.cmd:

@ECHO OFF
npm --registry https://registry.npmjs.org %*

npm-:

#!/bin/sh
"npm" --registry https://registry.npmjs.org "$@"

अब, अगर मैं सामान्य npm रजिस्ट्री (जबकि मैं वीपीएन से जुड़ा नहीं हूं) के खिलाफ एक ऑपरेशन करना चाहता हूं, तो मैं बस वह टाइप करता npm-हूं जहां मैं आमतौर पर टाइप करता हूं npm

इस आदेश का परीक्षण करने और पैकेज के लिए रजिस्ट्री देखने के लिए, इस उदाहरण का उपयोग करें:

npm- view lodash

पुनश्च। मैं खिड़कियों में हूँ और यह बैश, सीएमडी, और पॉवर्सशेल में परीक्षण किया है। मैं भी

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