มีวิธีการกำหนดค่าการลงทะเบียนหลายรายการในไฟล์ npmrc ไฟล์เดียวหรือไม่


143

นี่คือปัญหาของฉัน เรามีรีจิสทรี NPM ส่วนตัวซึ่งใช้งานได้ใน VPN เท่านั้น ฉันต้องการรีจิสตรีทางเลือกhttps://registry.npmjs.orgเพื่อที่ว่าเมื่อฉันออกจาก VPN มันทำงานได้อย่างราบรื่น

ป.ล.ปัจจุบันฉันใช้npmrcซึ่งทำงานได้ดีในการสลับระหว่างไฟล์. npmrc เป็นวิธีแก้ปัญหา


8
ฉันชอบที่จะรู้ในสิ่งเดียวกัน อาจมีรีจิสทรีส่วนตัวของฉันได้รับการ ping ก่อนและหากล้มเหลวทางเลือกสู่การลงทะเบียนสาธารณะ หรือเปลี่ยนชื่อรีจิสทรีตามชื่อ wifi
ProLoser

1
สำหรับจิตวิญญาณที่หลงหายเหมือนตัวเองdoc ที่มีประโยชน์ถึง npmrc
Andreas

คำตอบ:


194

คุณสามารถมีหลายรีจิสเตอร์สำหรับแพ็คเกจที่กำหนดขอบเขตใน.npmrcไฟล์ของคุณ ตัวอย่างเช่น:

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

แพคเกจภายใต้@polymerขอบเขตจะได้รับจากhttps://registry.npmjs.orgแต่ส่วนที่เหลือจะได้รับจาก NPM ท้องถิ่นของคุณ


15
ขอบคุณสำหรับคำแนะนำนี้ คุณช่วยบอกได้ไหมว่าเป็นไปได้หรือไม่ที่จะเพิ่มการรับรองความถูกต้องให้กับการลงทะเบียนที่กำหนด เพราะฉันต้องการคีย์ _auth ในการลงทะเบียนหลักของฉัน
Bloomca

3
แพ็คเกจที่ถูกกำหนดขอบเขตคืออะไร? ฉันไม่เคยได้ยินเรื่องนี้
jcollum

1
@jcollum แพ็คเกจที่กำหนดขอบเขตเป็นเพียงแพ็คเกจที่จัดกลุ่ม (หรือกำหนดขอบเขต) ผ่านเนมสเปซ ดูdocs.npmjs.com/misc/scopeสำหรับรายละเอียด การกำหนดขอบเขตสามารถใช้เพื่อเชื่อมโยงแพ็คเกจต่างๆ (เช่น @angular) ซึ่งทำให้ง่ายต่อการรู้ว่าแพ็คเกจ (@ angular / core) เป็นส่วนหนึ่งของ Angular แต่อาจเป็น บริษัท เช่น @ mycompany / mypackage
PatS

6
สิ่งนี้เป็นไปได้หรือไม่หากไม่มีการกำหนดขอบเขต สมมติว่าหากเรากำลังมองหาแพ็คเกจนี้ให้ไปที่รีจิสตรีนี้หรือไปที่รีจิสตรีนั้น
PinguinoSod

2
@PinguinoSod ไม่เป็นยังเป็นไปไม่ได้ (เป็นของเดือนธันวาคม 2019) สำหรับแพ็คเกจที่ไม่มีการกำหนดขอบเขต Sonatype เป็นทางออกเดียวที่ฉันรู้ ดูstackoverflow.com/a/50995915/3281336
PatS

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) แล้วเผยแพร่
gjegadesh

1
โอเค แต่มีทางเลือกสำหรับรีจิสตรีนี้อย่างไร
CharybdeBE

1
ฉันได้รับInvalid package name "@npmjs/": name can only contain URL-friendly charactersเมื่อรันnpm i
umutesen

ฉันยังมีชื่อที่สามารถมีข้อผิดพลาดอักขระที่เป็นมิตรกับ URL
katwhocodes

วิธีนี้ดูสะอาดกว่าสำหรับฉัน มีวิธีทำใน package.json หรือไม่
Hari Krishna Gaddipati

19

สำหรับทุกคนที่กำลังมองหาโซลูชันสำหรับการรับรองความถูกต้องฉันจะเพิ่มในโซลูชันแพ็คเกจที่กำหนดขอบเขตซึ่งคุณสามารถมีหลายบรรทัดใน.npmrcไฟล์ของคุณ:

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

แต่ละบรรทัดแสดงถึงรีจิสทรี NPM ที่แตกต่างกัน


4
npm login --registry=npm.example.comผมจะใช้คำสั่ง มันจะจัดเก็บข้อมูลรับรองการเข้าสู่ระบบ (authTokens) ในไฟล์. npmrc ในโฟลเดอร์ผู้ใช้ของคุณดังนั้นคุณไม่จำเป็นต้องใช้มันในซอร์สโค้ด ( docs.npmjs.com/cli/adduser )
magikMaker

มันทำงานให้ฉันขอบคุณโดยทั่วไปฉันมีรีจิสทรี Nexus ส่วนตัวถึง lib ของฉัน แต่ Lib ของฉันมีการอ้างอิงไม่กี่อื่นซึ่งจำเป็นต้องติดตั้งจาก registry.npmjs.orgนี้ทำงานให้ฉัน
Chanuka Asanka

17

ไม่ใช่วิธีที่ดีที่สุด แต่ถ้าคุณใช้ mac หรือ linux แม้ใน windows คุณสามารถตั้งชื่อแทนสำหรับการลงทะเบียนที่แตกต่างกัน

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

2
โซลูชันที่คล้ายกันคือตั้งค่านามแฝงที่ผ่านตัวเลือก --registry ไปยัง npm สิ่งนี้มีผลเหมือนกัน แต่สำหรับคำสั่งเดียวเท่านั้น ไวยากรณ์คือalias npm-sin=npm --registry https://localhost:4873/
PatS

11

เนื่องจากใช้เวลาเพียงไม่กี่ปีและดูเหมือนเป็นไปไม่ได้ที่จะทำเช่นนี้ (ใช้ NPM คนเดียว) วิธีแก้ปัญหานี้คือการใช้Nexus Repository Manager (จาก Sonatype) Nexus รองรับที่เก็บข้อมูลหลายแห่งช่วยให้คุณสามารถสั่งซื้อและยังมีพร็อกซี / แคชเพื่อปรับปรุงความเร็ว

มีรุ่นฟรีและรุ่น pro / Paid คุณลักษณะที่รองรับสิ่งนี้มีการอธิบายไว้ที่: https://help.sonatype.com/repomanager3/node-packaged-modules-and-npm-registries

ข้อมูลที่เกี่ยวข้องซ้ำซ้อนด้านล่างดังนั้นหาก / เมื่อ URL / ลิงค์ด้านบนหยุดทำงานข้อมูลยังอยู่ที่นี่

กลุ่มที่เก็บเป็นวิธีที่แนะนำในการแสดงที่เก็บข้อมูลการลงทะเบียน npm ทั้งหมดของคุณจากตัวจัดการที่เก็บไปยังผู้ใช้ของคุณโดยไม่จำเป็นต้องกำหนดค่าฝั่งไคลเอ็นต์เพิ่มเติม กลุ่มที่เก็บช่วยให้คุณเปิดเผยเนื้อหาที่รวมของหลายพร็อกซีและที่เก็บที่โฮสต์กับหนึ่ง URL ถึง npm และเครื่องมืออื่น ๆ

มันช่วยให้คุณสร้างการลงทะเบียน NPM ส่วนตัว

สามารถใช้รีจิสตรี npm ส่วนตัวเพื่ออัพโหลดแพ็คเกจของคุณเองรวมถึงแพ็คเกจของบุคคลที่สาม

และ

เพื่อลดการดาวน์โหลดที่ซ้ำกันและเพิ่มความเร็วในการดาวน์โหลดสำหรับนักพัฒนาและเซิร์ฟเวอร์ CI ของคุณคุณพร็อกซี่รีจิสทรีควรเจ้าภาพที่https://registry.npmjs.org โดยค่าเริ่มต้น npm เข้าถึงรีจิสทรีนี้โดยตรง คุณสามารถพร็อกซีการลงทะเบียนอื่น ๆ ที่คุณต้องการ

ดังนั้นรายการสิ่งที่คุณทำเพื่อให้ได้ผลคือ:

  • ติดตั้ง Nexus

  • สร้าง repo ในพื้นที่ / ส่วนตัว (หรือชี้ไปที่ repo ส่วนตัวของคุณบนเซิร์ฟเวอร์อื่น)

  • สร้างกลุ่มที่แสดงรายการซื้อคืนส่วนตัวของคุณและซื้อคืนสาธารณะ

  • กำหนดค่าไฟล์ $ HOME / .npmrc ของคุณให้ชี้ไปที่ "GROUP" ที่เพิ่งสร้างขึ้น

  • เผยแพร่แพคเกจ NPM ส่วนตัวของคุณไปยัง repo ท้องถิ่น

  • ขณะนี้ผู้ใช้สามารถเรียกใช้การตั้งค่าครั้งเดียว

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 ค้นหาแพ็คเกจที่ค้นหาแต่ละ repo ที่กำหนดค่าในกลุ่มและส่งคืนผลลัพธ์ ดังนั้น npm ยังคงคิดว่ามีเพียงรีจิสตรีเดียว แต่อยู่ด้านหลังม่านมีรีโพสหลายตัวที่ใช้อยู่

หมายเหตุสำคัญ: เมื่อคุณเผยแพร่ส่วนประกอบของคุณคุณจะต้องระบุnpm publish --registry https://nexus/content/repositories/private-repo my-private-packageคำสั่งเพื่อให้แพ็คเกจของคุณถูกเผยแพร่ไปยัง repo ที่ถูกต้อง


ฉันสามารถกำหนดค่ารีจิสทรีทั้งสอง (สำหรับการปรับใช้สิ่งประดิษฐ์ของฉันเองและเพื่อดึงสิ่งประดิษฐ์สาธารณะ) ในไฟล์. npmrc เพื่อที่ฉันไม่ต้องพูดถึงทุกครั้งที่ฉันกำลังเผยแพร่ npm? สำหรับการผลักดันสิ่งประดิษฐ์ของฉันฉันใช้ที่เก็บ npm แยกต่างหากและเพื่อดึงสิ่งประดิษฐ์ทั้งหมดที่ฉันใช้ที่เก็บเสมือน โปรดช่วยฉันกำหนดค่าทั้งในไฟล์. npmrc
Anshita Singh

1
@ AnshitaSingh ฉันเพิ่งผ่านสิ่งนี้ ถ้าคุณชอบฉันมีพื้นที่เก็บข้อมูลที่แตกต่างกันสำหรับการเผยแพร่ (เช่นnpm-privateแทนnpm-group) คุณสามารถแทนที่registry-key ใน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(พื้นที่เก็บข้อมูลของคุณเอง) ฉันใช้โซลูชันนี้เนื่องจากการลบสิ่งประดิษฐ์ออกจาก GitLab CE ในท้องถิ่นนั้นซับซ้อนเกินไป
Igor

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เก็บตัวอย่างมีทั้งหมดจากเครือข่ายภายในของเราเคยชินทำงานสำหรับคุณ ฉันไม่รู้ว่ามันเหมาะกับคุณหรือไม่ แต่ถ้าคิดว่าเป็นเช่นนั้นคุณสามารถลองใช้ตัวจัดการพื้นที่เก็บข้อมูล Nexus สำหรับ repos ภายใน
Fernando Fernandes

1
ตามการตอบสนองนี้เฉือนคู่ไม่มีความหมายเพื่อให้คุณเป็นเพียงการตั้งค่าปุ่มโดยไม่มีค่า
PinguinoSod

1
เท่าที่ฉันจะเห็นได้จากตัวอ่านไฟล์คุณสมบัติ npm / ini แท้จริงแล้ว // จะถูกอ่านเป็นคีย์โดยไม่มีค่า โดยวิธีการเช่นเดียวกับส่วนที่กำหนดขอบเขตมันจะถูกเก็บไว้เป็นเซิร์ฟเวอร์รีจิสทรีรอง พวกเขาจะเข้าสู่ npm และจะถูกประมวลผลเป็นเซิร์ฟเวอร์การกำหนดค่ารีจิสทรีตามอัลกอริทึมการประเมินผลภายในของ npm
เฟอร์นันโดเฟอร์นันเดส

1
มีใครลองวิธีนี้ มันใช้งานได้และช่วยในการกำหนดค่าพื้นที่เก็บข้อมูลทางเลือก?
ลุค P. Issac

3

บางขั้นตอนที่คุณสามารถลอง (เป็นวิธีที่เราทำในที่ทำงานของฉัน)

  • สร้างกลุ่มรีจิสทรีที่มีที่อยู่ต้นทางของที่เก็บสองแห่งขึ้นไป หนึ่งจะเป็นส่วนตัวภายในของคุณและอื่น ๆ พร็อกซีเพื่อ npmjs ให้ความสำคัญกับหนึ่งภายใน
  • ทำให้กลุ่มนี้เป็นรีจิสตรีของคุณในไฟล์. npmrc วิธีนี้ npm จะพยายามรับจากภายในหากไม่พบรับจากพร็อกซี

หวังว่าจะช่วย


6
จะสร้างกลุ่มรีจิสตรีใน npm ได้อย่างไร? นั่นหมายความว่าอย่างไร?
Tuupertunut

1
@Tuupertunut registry วิธีที่ง่ายที่สุดในการทำคือใช้ตัวจัดการพื้นที่เก็บข้อมูลบางอย่างเช่น sonatype nexus มันสามารถโฮสต์การลงทะเบียนส่วนตัวพร็อกซีใน npmjs เช่นเดียวกับการสร้างกลุ่มพื้นที่เก็บข้อมูล
Kaus Untwale


1

ฉันพบปัญหาเดียวกันเมื่อ บริษัท ของฉันตั้งค่ารีจิสทรีของตัวเองดังนั้นฉันจึงทำงานหนักอีกครั้งในproxy-registryในproxy-multi-registriesเพื่อแก้ไขปัญหานี้ หวังว่ามันจะช่วยคุณได้


1

ตั้งแต่วันที่ 13 เมษายน 2020 จะไม่มีการทำงานดังกล่าวเว้นแต่ว่าคุณจะสามารถใช้ขอบเขตที่แตกต่างกัน แต่คุณอาจใช้สคริปต์postinstallเป็นวิธีแก้ปัญหา มันจะถูกดำเนินการเสมอกันหลังจากแต่ละNPM ติดตั้ง :

สมมติว่าคุณมี. npmrc ของคุณได้รับการกำหนดค่าให้ติดตั้ง@ foo-org / foo-pack-privateจาก gitub repo ส่วนตัวของคุณ แต่แพ็คเกจ@ foo-org / foo-pack-publicสาธารณะอยู่ที่ npm (ภายใต้ขอบเขตเดียวกัน: foo- องค์กร )

postinstallของคุณอาจมีลักษณะเช่นนี้:

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

อย่าลืมที่จะลบ@ foo-pack / foo-orgจากอาร์เรย์การพึ่งพาเพื่อให้แน่ใจว่าการติดตั้ง npmไม่ได้ลองและรับมาจาก github และเพื่อเพิ่ม--dry-run flag ที่ทำให้แน่ใจว่าpackage.jsonและpackage- lock.jsonอยู่หลังจากที่ไม่เปลี่ยนแปลงNPM ติดตั้ง


0

แนวทางของฉันคือสร้างตัวแปรบรรทัดคำสั่งเล็กน้อยซึ่งเพิ่มสวิตช์รีจิสตรี

ฉันสร้างไฟล์เหล่านี้ในโฟลเดอร์ nodejs ซึ่งพบไฟล์เรียกคืน npm:

npm-.cmd:

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

npm-:

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

ตอนนี้ถ้าผมต้องการที่จะดำเนินการกับรีจิสทรี NPM ปกติ (ในขณะที่ผมไม่ได้เชื่อมต่อกับ VPN) ให้ฉันเพียงแค่พิมพ์ที่ผมมักจะพิมพ์npm-npm

ในการทดสอบคำสั่งนี้และดูรีจิสตรีสำหรับแพ็คเกจใช้ตัวอย่างนี้:

npm- view lodash

PS ฉันอยู่ใน windows และได้ทดสอบสิ่งนี้ใน Bash, CMD และ Powershell ฉันยัง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.