단일 npmrc 파일에서 여러 레지스트리를 구성하는 방법이 있습니까?


143

여기 내 문제가 있습니다. VPN에서만 작동하는 개인 NPM 레지스트리가 있습니다. VPN을 사용하지 않을 때 원활하게 작동하도록 폴백 레지스트리 https://registry.npmjs.org 를 갖고 싶습니다 .

추신 : 현재 npmrc 를 사용하고 있습니다 .npmrc 는 해결 방법으로 .npmrc 파일을 전환하는 데 효과적입니다.


8
나는 실제로 같은 것을 알고 싶습니다. 아마도 내 개인 레지스트리가 먼저 핑되고 퍼블릭 레지스트리로 폴백하지 못하는 경우 (개인 서버의 설정이 아닌 로컬 폴백에서). 또는 Wi-Fi 이름을 기반으로 레지스트리를 전환 할 수도 있습니다.
ProLoser

1
나 같은 잃어버린 영혼을 위해, 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 년 12 월 현재) 불가능합니다. Sonatype은 내가 아는 유일한 솔루션입니다.
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
Ok. 그러나 그 레지스트리에 대한 폴백
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

그것은 기본적으로 내가 내 lib 디렉토리에 개인 넥서스 레지스트리를했지만, 내 lib 디렉토리에서 설치해야하는 또 다른 몇 가지 의존성을 가지고, 나를 위해 덕분에 일 registry.npmjs.org이 나를 위해 일했다
Chanuka Asanka

17

가장 좋은 방법은 아니지만 Windows에서도 Mac 또는 Linux를 사용하는 경우 다른 레지스트리에 별명을 설정할 수 있습니다.

##############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 만 사용하여)이 작업을 수행 할 수없는 것처럼 보이 므로이 문제에 대한 해결책 은 Sonatype 의 Nexus Repository Manager 를 사용하는 것 입니다. Nexus는 여러 리포지토리를 지원하고 주문할 수 있으며 프록시 / 캐시도 속도를 향상시킵니다.

무료 버전과 무료 / 유료 버전이 있습니다. 이를 지원하는 기능은 https://help.sonatype.com/repomanager3/node-packaged-modules-and-npm-registries에 설명되어 있습니다.

위의 URL / 링크가 작동을 멈출 경우 정보가 여전히 여기에 있으므로 관련 정보가 아래에 복제됩니다.

리포지토리 그룹은 추가 클라이언트 측 구성 없이도 모든 npm 레지스트리 리포지토리를 리포지토리 관리자에서 사용자에게 공개하는 데 권장되는 방법입니다. 리포지토리 그룹을 사용하면 하나의 URL을 사용하여 여러 프록시 및 호스트 리포지토리의 집계 된 내용을 npm 및 기타 도구에 노출 할 수 있습니다.

그것은 당신이 개인 npm 레지스트리를 만들 수 있습니다

개인 npm 레지스트리를 사용하여 타사 패키지뿐만 아니라 자체 패키지를 업로드 할 수 있습니다.

중복 다운로드를 줄이고 개발자 및 CI 서버의 다운로드 속도를 향상 시키려면 https://registry.npmjs.org 에서 호스팅되는 레지스트리를 프록시해야합니다 . 기본적으로 npm은이 레지스트리에 직접 액세스합니다. 필요한 다른 레지스트리를 프록시 할 수도 있습니다.

따라서이 작업을 수행하기 위해 수행하는 빠른 글 머리 기호 목록은 다음과 같습니다.

  • Nexus 설치

  • 로컬 / 개인 저장소를 작성하거나 다른 서버에서 개인 저장소를 가리 킵니다.

  • 비공개 리포지토리와 공개 리포지토리를 나열하는 GROUP을 만듭니다.

  • 방금 생성 한 "GROUP"을 가리 키도록 $ 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패키지가 올바른 저장소에 게시되도록 명령 을 지정해야합니다 .


npm 게시를 할 때마다 언급 할 필요가 없도록 .npmrc 파일에 레지스트리 (내 자신의 아티팩트 배포 및 공개 아티팩트 풀)를 모두 구성 할 수 있습니까? 내 아티팩트를 푸시하려면 별도의 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>하는 예를로 설정할 수 있습니다 . 로컬 GitLab CE에서 아티팩트를 얻는 것이 너무 복잡했기 때문에이 솔루션을 사용했습니다. npm-groupnpm-registrynpm-private
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, serverBserverC예를 들어 저장소는 우리의 내부 네트워크, 당신을 위해 늘 직장에서 모두. 그것이 당신에게 적합한 지 모르겠지만 그것이 생각된다면 내부 저장소에 Nexus Repository Manager를 배포 할 수 있습니다.
페르난도 페르난데스

1
에 따라 이 응답 이중 슬래시 그래서 당신은 단지 값없이 키를 설정하고, 의미가 없습니다
PinguinoSod

1
npm / ini 속성 파일 판독기에서 볼 수 있듯이 //는 값이없는 키로 읽습니다. 그런데 범위가 지정된 섹션과 마찬가지로 보조 레지스트리 서버로 저장됩니다. npm으로 들어가 npm의 내부 평가 알고리즘에 따라 레지스트리 구성 서버로 처리됩니다.
페르난도 페르난데스

1
누구든지이 솔루션을 사용해 보도록하십시오. 대체 저장소를 구성하고 구성하는 데 도움이됩니까?
Luke P. Issac

3

시도해 볼 수있는 몇 가지 단계. (우리가 직장에서하는 방식)

  • 둘 이상의 저장소 소스 주소로 레지스트리 그룹을 작성하십시오. 하나는 당신의 내부 개인이고 다른 하나는 npmjs에 대한 프록시가 될 것입니다.
  • 이 그룹을 .npmrc 파일에서 레지스트리로 만드십시오. 이 방법으로 npm은 항상 내부에서 가져 오려고 시도하지만 프록시에서 찾지 못하면

희망이 도움이됩니다.


6
npm에서 레지스트리 그룹을 어떻게 만듭니 까? 그게 무슨 뜻이야?
Tuupertunut

1
@Tuupertunut registry 가장 쉬운 방법은 sonatype nexus와 같은 일종의 저장소 관리자를 사용하는 것입니다. 개인 레지스트리를 호스팅하고 npmjs에서 프록시를 수행하고 저장소 그룹을 작성할 수 있습니다.
Kaus Untwale



1

2020 년 4 월 13 일부터 다른 범위를 사용할 수 없으면 그러한 기능은 없지만 설치 후 스크립트를 해결 방법으로 사용할 수 있습니다 . 각 npm 설치 후 항상 실행됩니다 .

개인 github 저장소에서 @ foo-org / foo-pack-private 를 설치하도록 .npmrc를 구성 했지만 @ foo-org / foo-pack-public 공개 패키지는 npm에 있습니다 (같은 범위에서 : foo- org ).

귀하의 사후는 다음과 같습니다

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

의존성 배열 에서 @ foo-pack / foo-org를 제거하여 npm 설치 가 github에서 시도하지 않도록하고 package.jsonpackage-를 확인 하는 --dry-run 플래그 를 추가하는 것을 잊지 마십시오 lock.jsonnpm 설치 후 변경되지 않은 상태로 유지 됩니다.


0

내 접근 방식은 레지스트리 스위치를 추가하는 약간의 명령 줄 변형을 만드는 것이 었습니다.

npm 실행 파일이있는 nodejs 폴더에 이러한 파일을 만들었습니다.

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

추신. 나는 Windows에 있으며 Bash, CMD 및 Powershell에서 이것을 테스트했습니다. 나도

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.