Có cách nào để cấu hình nhiều đăng ký trong một tệp npmrc không


143

Đây là vấn đề của tôi. Chúng tôi có một sổ đăng ký NPM riêng chỉ hoạt động trong VPN. Tôi muốn có một sổ đăng ký dự phòng https://registry.npmjs.org để khi tôi hết VPN, nó hoạt động trơn tru.

PS Hiện tại tôi đang sử dụng npmrc , một công việc tốt trong việc chuyển đổi giữa các tệp .npmrc như một cách giải quyết


8
Tôi thực sự rất muốn biết điều tương tự. Có thể có đăng ký riêng của tôi được ping trước và nếu nó không thành công trong sổ đăng ký công cộng (từ dự phòng cục bộ, không phải là một thiết lập trên máy chủ riêng). Hoặc thay thế chuyển đổi đăng ký của tôi dựa trên tên wifi của tôi.
ProLoser

1
đối với những linh hồn lạc lối như tôi, một tài liệu hữu ích cho npmrc
Andreas

Câu trả lời:


194

Bạn có thể có nhiều đăng ký cho các gói phạm vi trong .npmrctệp của bạn . Ví dụ:

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

Các gói trong @polymerphạm vi sẽ được nhận từ https://registry.npmjs.org , nhưng phần còn lại sẽ được nhận từ NPM địa phương của bạn.


15
Cảm ơn bạn cho lời khuyên này. Bạn có thể vui lòng cho biết, có thể thêm xác thực vào các đăng ký phạm vi này không? Bởi vì tôi cần khóa _auth cho sổ đăng ký chính của mình.
Bloomca

3
Một gói phạm vi là gì? Tôi chưa bao giờ nghe nói về điều này.
jcollum

1
@jcollum, Gói phạm vi chỉ đơn giản là các gói được nhóm (hoặc phạm vi) thông qua một không gian tên. Xem docs.npmjs.com/misc/scope để biết chi tiết. Phạm vi có thể được sử dụng để liên kết một số gói (như @angular) để dễ dàng biết rằng gói (@ angular / core) là một phần của Angular, nhưng cũng có thể là một công ty như @ mycompany / mypackage.
PatS

6
Điều này có thể mà không có gói phạm vi? giả sử nếu chúng tôi đang tìm kiếm gói cụ thể này, hãy đi đến sổ đăng ký này, nếu không hãy đến sổ đăng ký đó
PinguinoSod

2
@PinguinoSod, Không có gì (kể từ tháng 12 năm 2019) không thể áp dụng cho các gói không có phạm vi. Sonatype là giải pháp duy nhất mà tôi biết. Xem stackoverflow.com/a/50995915/3281336
PatS

71

Trên phiên bản 4.4.1, nếu bạn có thể thay đổi tên gói, hãy sử dụng:

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

@mycoPhạm vi gói của bạn ở đâu .

Bạn có thể cài đặt gói theo cách này:

npm install @myco/my-package

Để biết thêm thông tin: https://docs.npmjs.com/misc/scope


Nó cũng được yêu cầu để khởi tạo gói của bạn với phạm vi (npm init --scope = myco) và sau đó xuất bản nó.
gjegadesh

1
Ok nhưng làm thế nào có một dự phòng cho đăng ký đó
CharybdeBE

1
Tôi nhận được Invalid package name "@npmjs/": name can only contain URL-friendly characterskhi tôi chạynpm i
umutesen

Tôi cũng có tên chỉ có thể chứa lỗi ký tự thân thiện với URL
katwhocodes

Cách tiếp cận này có vẻ sạch hơn đối với tôi. Có cách nào để làm điều này trong gói.json không?
Hari Krishna Gaddipati

19

Đối với bất kỳ ai đang tìm kiếm một giải pháp để xác thực, tôi sẽ thêm vào giải pháp gói phạm vi mà bạn có thể có nhiều dòng trong .npmrctệp của mình :

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

Mỗi dòng đại diện cho một sổ đăng ký NPM khác nhau


4
Tôi sẽ sử dụng lệnh npm login --registry=npm.example.com. Nó sẽ lưu thông tin đăng nhập (authTokens) trong tệp .npmrc trong thư mục người dùng của bạn, vì vậy bạn không cần phải có nó trong mã nguồn ( docs.npmjs.com/cli/adduser )
magikMaker 26/11/18

nó hoạt động với tôi, cảm ơn, về cơ bản tôi đã đăng ký nexus riêng cho lib của mình nhưng Lib của tôi có một vài phụ thuộc khác cần cài đặt registry.npmjs.org, điều này hiệu quả với tôi
Chanuka Asanka

17

Không phải là cách tốt nhất nhưng nếu bạn đang sử dụng mac hoặc linux ngay cả trong windows, bạn có thể đặt bí danh cho các đăng ký khác nhau.

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

2
Một giải pháp tương tự là thiết lập một bí danh vượt qua tùy chọn --regology đến npm. Điều này có tác dụng tương tự, nhưng chỉ cho một lệnh duy nhất. Cú pháp làalias npm-sin=npm --registry https://localhost:4873/
PatS 17/07/19

11

Vì đã được một vài năm và dường như không thể làm điều này (chỉ sử dụng npm), một giải pháp cho vấn đề này là sử dụng Trình quản lý kho lưu trữ Nexus (từ Sonatype). Nexus hỗ trợ nhiều kho lưu trữ, cho phép bạn đặt hàng chúng và cả proxy / bộ nhớ cache để cải thiện tốc độ.

Một phiên bản miễn phí và phiên bản pro / trả phí tồn tại. Tính năng hỗ trợ này được mô tả tại: https://help.sonatype.com/repomanager3/node-packaged-modules-and-npm-registers

Thông tin liên quan được sao chép bên dưới để nếu / khi URL / liên kết ở trên ngừng hoạt động, thông tin vẫn ở đây.

Nhóm kho lưu trữ là cách được đề xuất để hiển thị tất cả các kho lưu trữ đăng ký npm của bạn từ trình quản lý kho lưu trữ cho người dùng của bạn, mà không cần bất kỳ cấu hình phía máy khách nào nữa. Một nhóm kho lưu trữ cho phép bạn hiển thị nội dung tổng hợp của nhiều kho lưu trữ proxy và được lưu trữ với một URL tới npm và các công cụ khác.

Nó cho phép bạn tạo đăng ký npm riêng

Một sổ đăng ký npm riêng có thể được sử dụng để tải lên các gói của riêng bạn cũng như các gói của bên thứ ba.

Để giảm tải xuống trùng lặp và cải thiện tốc độ tải xuống cho nhà phát triển và máy chủ CI của bạn, bạn nên ủy quyền đăng ký được lưu trữ tại https://registry.npmjs.org . Theo mặc định npm truy cập đăng ký này trực tiếp. Bạn cũng có thể ủy quyền bất kỳ đăng ký khác mà bạn yêu cầu.

Vì vậy, một danh sách gạch đầu dòng nhanh những việc bạn làm để làm việc này là:

  • Cài đặt Nexus

  • Tạo một repo cục bộ / riêng tư (hoặc trỏ đến repo riêng của bạn trên một máy chủ khác)

  • Tạo một NHÓM liệt kê repo riêng của bạn và repo công khai.

  • Định cấu hình tệp $ HOME / .npmrc của bạn để trỏ đến "NHÓM" vừa tạo.

  • Xuất bản các gói npm riêng của bạn lên repo địa phương.

  • Người dùng hiện có thể chạy thiết lập một lần.

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

  • Sau đó, người dùng có thể cài đặt cả gói công khai hoặc riêng tư thông qua npm install. npm install my-private-package npm install lodash any-other-public-package

Và cả gói công khai và riêng tư của bạn đều có thể được cài đặt thông qua một npm installlệnh đơn giản . Nexus tìm thấy gói tìm kiếm từng repo được cấu hình trong nhóm và trả về kết quả. Vì vậy, npm vẫn nghĩ rằng chỉ có một đăng ký nhưng đằng sau bức màn có nhiều repos đang được sử dụng.

LƯU Ý QUAN TRỌNG: Khi bạn xuất bản các thành phần của mình, bạn sẽ cần chỉ định npm publish --registry https://nexus/content/repositories/private-repo my-private-packagelệnh để gói của bạn được xuất bản thành repo chính xác.


Tôi có thể định cấu hình cả sổ đăng ký (để triển khai các tạo phẩm của riêng tôi và để kéo các tạo phẩm công cộng) trong tệp .npmrc để tôi không phải đề cập đến mỗi khi tôi đang xuất bản npm không? Để đẩy các tạo phẩm của tôi, tôi đang sử dụng kho lưu trữ npm riêng biệt và để kéo tất cả các tạo phẩm tôi đang sử dụng kho lưu trữ ảo. Xin hãy giúp tôi định cấu hình cả trong tệp .npmrc.
Anshita Singh

1
@AnshitaSingh Tôi vừa trải qua điều này. Nếu bạn thích tôi có một kho lưu trữ khác để xuất bản (ví dụ npm-privatethay vì npm-group), bạn có thể ghi đè registry-key trong package.jsondự án của bạn (xem https://blog.sonatype.com/using-nexus-3-as-your-repository-part-2-npm-packagesđể biết chi tiết). Sử dụng npm config set registry <url>bạn có thể đặt nó thành ví dụ npm-group, chứa npm-registry(kho chuyển tiếp) và npm-private(kho lưu trữ của riêng bạn). Tôi đã sử dụng giải pháp này, vì việc lấy các tạo phẩm của GitLab CE cục bộ quá phức tạp.
Igor

7

Bạn có thể sử dụng nhiều cú pháp kho lưu trữ cho registrymục nhập trong .npmrctệp của mình :

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

Điều đó sẽ làm cho npm của bạn tìm kiếm các gói trong các máy chủ khác nhau.


Vâng, nhưng serverA, serverBserverCkho ví dụ là tất cả từ mạng nội bộ của chúng tôi, công việc sẽ không dành cho bạn. Tôi không biết nó có phù hợp với bạn không nhưng nếu nghĩ là bạn có thể thử triển khai Trình quản lý kho lưu trữ Nexus cho các kho lưu trữ nội bộ.
Fernando Fernandes

1
theo phản hồi này , dấu gạch chéo kép không có ý nghĩa gì, vì vậy bạn chỉ cài đặt các phím không có giá trị
PinguinoSod

1
Theo như tôi có thể thấy từ trình đọc tệp thuộc tính npm / ini, thực sự, // sẽ được đọc dưới dạng khóa không có giá trị. Nhân tiện, giống như các phần trong phạm vi, nó sẽ được lưu trữ dưới dạng máy chủ đăng ký phụ. Họ sẽ truy cập vào npm và sẽ được xử lý như các máy chủ cấu hình đăng ký theo thuật toán đánh giá nội bộ của npm.
Fernando Fernandes

1
Có ai đã thử giải pháp này. Nó hoạt động và giúp cấu hình một kho lưu trữ dự phòng?
Luke P. Issac

3

Một số bước bạn có thể thử. (đó là cách chúng tôi làm việc tại nơi làm việc của tôi)

  • Tạo một nhóm đăng ký với hai (hoặc nhiều) địa chỉ nguồn lưu trữ. Một cái sẽ là riêng tư nội bộ của bạn và cái còn lại là proxy cho npmjs ưu tiên cho cái bên trong.
  • Đặt nhóm này đăng ký của bạn trong tệp .npmrc. Bằng cách này, npm sẽ luôn cố gắng lấy nó từ nội bộ, nếu không tìm thấy hãy lấy nó từ proxy

Mong rằng sẽ giúp.


6
Làm thế nào để tạo một nhóm đăng ký trong npm? Điều đó nghĩa là gì?
Tuupertunut

1
@Tuupertunut đăng ký Cách dễ nhất để làm điều đó là sử dụng một số loại trình quản lý kho lưu trữ, như sonatype nexus. Nó có thể lưu trữ các đăng ký riêng, proxy trong npmjs cũng như tạo các nhóm kho lưu trữ.
Kaus Untwale


1

Tôi gặp phải vấn đề tương tự khi công ty của tôi thiết lập sổ đăng ký của riêng mình, vì vậy tôi đã sửa đổi rất nhiều về đăng ký proxy thành nhiều cơ quan đăng ký proxy để giải quyết vấn đề này. Hy vọng nó cũng sẽ giúp bạn.


1

Tính đến 13 tháng 4 năm 2020 không có chức năng như vậy, trừ khi bạn có thể sử dụng phạm vi khác nhau, nhưng bạn có thể sử dụng postinstall kịch bản như một cách giải quyết. Nó luôn luôn được thực thi, cũng , sau mỗi NPM cài đặt :

Giả sử bạn đã cấu hình .npmrc để cài đặt @ foo-org / foo-pack-private từ repo github riêng tư của bạn, nhưng gói công khai @ foo-org / foo-pack-public nằm trên npm (trong cùng phạm vi: foo- tổ chức )

Cài đặt bài đăng của bạn có thể trông như thế này:

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

Đừng quên xóa @ foo-pack / foo-org khỏi mảng phụ thuộc để đảm bảo cài đặt npm không thử và lấy nó từ github và thêm cờ --dry-run để đảm bảo gói.jsongói- lock.json không thay đổi sau khi cài đặt npm .


0

Cách tiếp cận của tôi là tạo ra một biến thể dòng lệnh nhỏ có thêm công tắc đăng ký.

Tôi đã tạo các tệp này trong thư mục nodejs nơi tìm thấy tệp thực thi npm:

npm-.cmd:

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

npm-:

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

Bây giờ, nếu tôi muốn thực hiện một thao tác đối với sổ đăng ký npm bình thường (trong khi tôi không được kết nối với VPN), tôi chỉ cần nhập npm-nơi tôi thường gõ npm.

Để kiểm tra lệnh này và xem sổ đăng ký cho một gói, sử dụng ví dụ này:

npm- view lodash

Tái bút Tôi đang ở trong windows và đã thử nghiệm điều này ở Bash, CMD và Powershell. tôi cũng vậy

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.