Apakah ada cara untuk mengkonfigurasi beberapa pendaftar dalam satu file npmrc

143

Ini masalah saya. Kami memiliki registri NPM pribadi yang hanya berfungsi di VPN. Saya ingin memiliki registry cadangan https://registry.npmjs.org sehingga ketika saya keluar dari VPN berfungsi dengan baik.

PS Saat ini saya menggunakan npmrc yang melakukan pekerjaan yang baik dalam beralih antara file .npmrc sebagai solusinya

Abhijit Mazumder
sumber
8
Saya sebenarnya ingin tahu hal yang sama. Mungkin salah satu memiliki registri pribadi saya ping terlebih dahulu dan jika gagal mundur ke registri publik (dari fallback lokal, tidak satu pengaturan di server pribadi). Atau sebagai alternatif beralih registri saya berdasarkan nama wifi saya.
ProLoser
1
untuk jiwa-jiwa yang hilang seperti saya, sebuah dokumen yang berguna untuk npmrc
Andreas

Jawaban:

194

Anda dapat memiliki beberapa pendaftar untuk paket yang di - scoped dalam .npmrcfile Anda . Sebagai contoh:

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

Paket dalam @polymerlingkup akan diterima dari https://registry.npmjs.org , tetapi sisanya akan diterima dari NPM lokal Anda.

José Alberto Ruiz
sumber
15
Terima kasih atas saran ini. Bisakah Anda memberi tahu, apakah mungkin untuk menambahkan otentikasi ke pendaftar scoped ini? Karena saya perlu kunci _auth ke registri utama saya.
Bloomca
3
Apa itu paket scoped? Saya belum pernah mendengar ini.
jcollum
1
@ jcollum, paket Scoped hanyalah paket yang dikelompokkan (atau dicakup) melalui namespace. Lihat docs.npmjs.com/misc/scope untuk detailnya. Pelingkupan dapat digunakan untuk mengaitkan beberapa paket (seperti @angular) yang membuatnya mudah untuk mengetahui bahwa paket (@ angular / inti) adalah bagian dari Angular, tetapi juga bisa menjadi perusahaan seperti @ mycompany / mypackage.
PatS
6
Apakah ini mungkin tanpa paket scoped? katakanlah jika kita mencari paket khusus ini, pergi ke registri ini, jika tidak pergi ke registri itu
PinguinoSod
2
@PinguinoSod, Tidak, masih (per Des 2019) tidak mungkin untuk paket non-cakupan. Sonatype adalah satu-satunya solusi yang saya tahu. Lihat stackoverflow.com/a/50995915/3281336
PatS
71

Pada versi 4.4.1, jika Anda dapat mengubah nama paket, gunakan:

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

Di mana @mycoruang lingkup paket Anda.

Anda dapat menginstal paket dengan cara ini:

npm install @myco/my-package

Untuk info lebih lanjut: https://docs.npmjs.com/misc/scope

Gilberto Alexandre
sumber
Anda juga diharuskan untuk memasukkan paket Anda dengan ruang lingkup (npm init --scope = myco) dan kemudian menerbitkannya.
gjegadesh
1
Ok tapi bagaimana mundur dari registri itu
CharybdeBE
1
Saya mendapatkan Invalid package name "@npmjs/": name can only contain URL-friendly charactersketika saya menjalankannpm i
umutesen
Saya juga punya nama yang hanya bisa mengandung kesalahan karakter URL-friendly
katwhocodes
Pendekatan ini terlihat lebih bersih bagi saya. Apakah ada cara untuk melakukan ini di package.json?
Hari Krishna Gaddipati
19

Bagi siapa pun yang mencari solusi untuk otentikasi, saya akan menambahkan pada solusi paket scoped yang Anda dapat memiliki beberapa baris dalam .npmrcfile Anda :

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

Setiap baris mewakili registri NPM yang berbeda

Gregra
sumber
4
Saya akan menggunakan perintah npm login --registry=npm.example.com. Ini akan menyimpan kredensial masuk (authTokens) dalam file .npmrc di folder pengguna Anda, jadi Anda tidak perlu memilikinya dalam kode sumber ( docs.npmjs.com/cli/adduser )
magikMaker
itu bekerja untuk saya, terima kasih, Pada dasarnya saya punya nexus registry pribadi untuk lib saya tetapi Lib saya memiliki beberapa dependensi lain yang perlu diinstal registry.npmjs.org, ini bekerja untuk saya
Chanuka Asanka
17

Bukan cara terbaik tetapi Jika Anda menggunakan mac atau linux bahkan di windows Anda dapat mengatur alias untuk pendaftar yang berbeda.

##############NPM ALIASES######################
alias npm-default='npm config set registry https://registry.npmjs.org'
alias npm-sinopia='npm config set registry http://localhost:4873/'
bawa g
sumber
2
Solusi serupa adalah dengan mensetup alias yang meneruskan opsi --registry ke npm. Ini memiliki efek yang sama, tetapi hanya untuk perintah tunggal. alias npm-sin=npm --registry https://localhost:4873/
Sintaksnya
11

Karena sudah beberapa tahun dan sepertinya tidak mungkin untuk melakukan ini (menggunakan npm saja), solusi untuk masalah ini adalah dengan menggunakan Manajer Repositori Nexus (dari Sonatype). Nexus mendukung beberapa repositori, memungkinkan Anda memesannya, dan juga proxy / cache untuk meningkatkan kecepatan.

Ada versi gratis dan versi pro / berbayar. Fitur yang mendukung ini dijelaskan di: https://help.sonatype.com/repomanager3/node-packaged-modules-and-npm-registries

Informasi yang relevan diduplikasi di bawah ini jadi jika / ketika URL / tautan di atas berhenti bekerja informasinya masih di sini.

Grup repositori adalah cara yang disarankan untuk mengekspos semua repositori registrasi npm Anda dari manajer repositori ke pengguna Anda, tanpa memerlukan konfigurasi sisi klien lebih lanjut. Grup repositori memungkinkan Anda untuk mengekspos konten gabungan dari beberapa proxy dan repositori yang di-host dengan satu URL ke npm dan alat lainnya.

Ini memungkinkan Anda membuat pendaftar npm pribadi

Registri npm pribadi dapat digunakan untuk mengunggah paket Anda sendiri serta paket pihak ketiga.

Dan

Untuk mengurangi unduhan duplikat dan meningkatkan kecepatan unduhan untuk pengembang dan server CI Anda, Anda harus mem-proksi registri yang dihosting di https://registry.npmjs.org . Secara default, npm mengakses registri ini secara langsung. Anda juga dapat mem-proxy pendaftar lain yang Anda butuhkan.

Jadi daftar singkat hal-hal yang Anda lakukan untuk mendapatkan pekerjaan ini adalah:

  • Instal Nexus

  • Buat repo lokal / pribadi (atau arahkan ke repo pribadi Anda di server lain)

  • Buat GROUP yang mencantumkan repo pribadi Anda, dan repo publik.

  • Konfigurasikan file $ HOME / .npmrc Anda untuk menunjuk ke "GROUP" yang baru saja dibuat.

  • Publikasikan paket npm pribadi Anda ke repo lokal.

  • Pengguna sekarang dapat menjalankan pengaturan satu kali.

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

  • Kemudian pengguna dapat menginstal paket publik atau pribadi melalui npm install. npm install my-private-package npm install lodash any-other-public-package

Dan paket publik dan pribadi Anda dapat diinstal melalui npm installperintah sederhana . Nexus menemukan paket yang mencari setiap repo yang dikonfigurasi dalam grup dan mengembalikan hasilnya. Jadi npm masih berpikir hanya ada satu registri tetapi di balik tirai ada beberapa repo yang digunakan.

CATATAN PENTING: Ketika Anda menerbitkan komponen Anda, Anda harus menentukan npm publish --registry https://nexus/content/repositories/private-repo my-private-packageperintah sehingga paket Anda dipublikasikan ke repo yang benar.

Pat
sumber
dapatkah saya mengkonfigurasi kedua registri (untuk menggunakan artefak saya sendiri dan untuk menarik artefak publik) dalam file .npmrc sehingga saya tidak perlu menyebutkan setiap kali saya melakukan npm publish? Untuk mendorong artefak saya, saya menggunakan repositori npm terpisah dan untuk menarik semua artefak saya menggunakan repositori virtual. Tolong bantu saya untuk mengkonfigurasi keduanya dalam file .npmrc.
Anshita Singh
1
@AnshitaSingh Saya baru saja melewati ini. Jika Anda menyukai saya memiliki repositori berbeda untuk penerbitan (mis. npm-privateAlih-alih npm-group), Anda dapat mengganti registry-key di package.jsonproyek Anda (lihat https://blog.sonatype.com/using-nexus-3-as-your-repository-part-2-npm-packagesuntuk detailnya). Menggunakan npm config set registry <url>Anda dapat mengaturnya ke misalnya npm-group, yang berisi npm-registry(meneruskan repositori) dan npm-private(repositori Anda sendiri). Saya menggunakan solusi ini, karena mengeluarkan artefak dari GitLab CE lokal terlalu rumit.
Igor
7

Anda dapat menggunakan beberapa sintaks repositori untuk registryentri dalam .npmrcfile Anda :

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

Itu akan membuat npm Anda mencari paket di server yang berbeda.

Fernando Fernandes
sumber
Ya, tetapi serverA, serverBdan serverCcontoh repositori semuanya dari jaringan internal kami, tidak akan berfungsi untuk Anda. Saya tidak tahu apakah itu cocok untuk Anda, tetapi jika menurut Anda, Anda dapat mencoba menggunakan Nexus Repository Manager untuk repo internal.
Fernando Fernandes
1
menurut respons ini , garis miring ganda tidak memiliki arti, jadi Anda hanya mengatur kunci tanpa nilai
PinguinoSod
1
Sejauh yang saya bisa lihat dari pembaca file properti npm / ini, memang, // akan dibaca sebagai kunci tanpa nilai. By the way, seperti bagian cakupan, itu akan disimpan sebagai server registri sekunder. Mereka akan masuk ke npm dan akan diproses sebagai server konfigurasi registri sesuai dengan algoritma evaluasi internal npm.
Fernando Fernandes
1
Adakah yang mencoba solusi ini. Apakah itu berfungsi dan membantu mengkonfigurasi repositori fallback?
Luke P. Issac
3

Beberapa langkah yang bisa Anda coba. (bagaimana kami melakukannya di tempat kerja saya)

  • Buat grup registri dengan dua (atau lebih) alamat sumber repositori. Yang satu akan menjadi pribadi internal Anda dan yang lainnya merupakan proksi ke npmjs yang mengutamakan yang internal.
  • Jadikan grup ini registri Anda dalam file .npmrc. Dengan cara ini npm akan selalu berusaha mendapatkannya dari internal, jika tidak ditemukan mendapatkannya dari proxy

Semoga itu bisa membantu.

Kaus Untwale
sumber
6
Bagaimana cara membuat grup registri di npm? Apa artinya?
Tuupertunut
1
@Tuupertunut registry Cara termudah untuk melakukannya adalah dengan menggunakan semacam manajer repositori, seperti sonatype nexus. Ia dapat meng-host registrasi pribadi, proxy di npmjs serta membuat grup repositori.
Kaus Untwale
1

Saya menghadapi masalah yang sama ketika perusahaan saya mengatur registri sendiri, jadi saya banyak mengerjakan ulang proxy-registri menjadi proxy-multi-pendaftar untuk menyelesaikan masalah ini. Semoga ini juga akan membantu Anda.

xymopen
sumber
1

Pada 13 April 2020 tidak ada fungsi seperti itu kecuali Anda dapat menggunakan lingkup yang berbeda, tetapi Anda dapat menggunakan skrip postinstall sebagai solusi. Itu selalu dieksekusi, well , setelah setiap instalasi npm :

Katakanlah Anda memiliki .npmrc Anda dikonfigurasi untuk menginstal @ foo-org / foo-pack-private dari repo github pribadi Anda, tetapi paket publik publik @ foo-org / foo-pack-publik ada di npm (di bawah cakupan yang sama: foo- org ).

Postinstall Anda mungkin terlihat seperti ini:

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

Jangan lupa untuk menghapus @ foo-pack / foo-org dari array dependensi untuk memastikan npm install tidak mencoba dan mendapatkannya dari github dan menambahkan flag --dry-run yang memastikan package.json dan package- lock.json tetap tidak berubah setelah instalasi npm .

Vasilescu Andrei
sumber
0

Pendekatan saya adalah membuat varian sedikit baris perintah yang menambahkan saklar registri.

Saya membuat file-file ini di folder nodejs di mana npm executable ditemukan:

npm-.cmd:

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

npm-:

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

Sekarang, jika saya ingin melakukan operasi terhadap registry npm normal (sementara saya tidak terhubung ke VPN), saya cukup mengetik di npm-mana saya biasanya mengetik npm.

Untuk menguji perintah ini dan melihat registri untuk suatu paket, gunakan contoh ini:

npm- view lodash

PS. Saya di windows dan telah menguji ini di Bash, CMD, dan Powershell. saya juga

Mark Whitfeld
sumber