특정 버전의 Git에서 npm 설치


181

비공개로 유지하고 싶은 Node.js 용 모듈을 작성했다고 가정합니다. 나는 줄을 추가 할 수 있어야한다는 것을 알고있다.

"private": "true"

받는 package.json파일, 그리고 나 또한 알고 내가 할 수있는 npm install파일 시스템 경로 또는 GitHub의를 포함하여 자식 저장소에 대한 링크를 사용하여이 모듈.

또한 파일 시스템 경로 또는 git repo에 대한 링크를로 넣을 수 package.json있으므로 dependencies부분이 다음과 같이 보일 수 있습니다.

"dependencies": {
  "myprivatemodule": "git@github.com:..."
}

내가 지금 원하는 것은 최신 버전에 연결하는 것이 아니라 특정 버전에 연결하는 것입니다. 내가 아는 유일한 가능성은 ID를 사용하여 특정 커밋에 연결하는 것입니다. 그러나 이것은와 같은 버전 번호를 사용하는 것보다 읽기 쉽고 유지 관리하기가 쉽지 않습니다 0.3.1.

그래서 내 질문은 : 어쨌든 그러한 버전 번호를 지정하고 npm 이이 버전을 포함하는 최신 커밋에 대한 자식 저장소를 검색 할 수 있습니까?

그렇지 않은 경우 프로젝트에서이 문제를 어떻게 해결합니까? 커밋 ID로 살고 있습니까? 아니면 더 나은 해결책이 있습니까?

답변:


193

의존성이 (가)에서 사용할 수 있습니다 registry것만으로 설치 될 지정하는 version기술자를 .

프로젝트를 공개적으로 공유해서는 안되는 대신 자신의 레지스트리작성하고 사용할 수 있습니다 registry.npmjs.org.

그러나 레지스트리에 없으면 URL 또는 Git URL 로 참조해야합니다 . Git URL로 버전을 지정하려면 <commit-ish>끝에 태그와 같은 적절한을 URL 조각으로 포함하십시오 .

예를 들어, 이름이 0.3.1다음 과 같은 태그의 경우 :

"dependencies": {
  "myprivatemodule": "git@github.com:...#0.3.1"
}

참고 : 위의 스 니펫은 질문에 게시 된 것과 동일한 기본 URL을 보여줍니다.

스니핑 부분 ( ...)은 다음과 같이 채워야합니다.

"myprivatemodule": "git@github.com:{owner}/{project}.git#0.3.1"

SSH 액세스를 사용할 수없는 경우 다른 주소 형식이 필요합니다.

"myprivatemodule": "git://github.com/{owner}/{project}.git#0.3.1"

OS에 따라 linkGithub에서 복제 한 다른 폴더의 종속성에 의존 할 수도 있습니다 .


1
이 게시물의 링크 중 일부는 404 페이지로 연결되기 때문에 구식입니다. 이 중 일부는 내가 오랫동안 찾고 있던 정보이기 때문에 유감입니다.
MvG

5
내가 가진 특정 버전을 태그 git tag -a "1.0.0"와 밀 git push --tags, 그때는 추가 #v1.0.0의 말에 git+ssh의존. 그러나 npm update아무 일도 일어나지 않습니다.
loretoparisi

3
@loretoparisi 죄송합니다. 추가 v가 필요하다고 제안하지 않았습니다 . 애프터 #조각은 태그의 이름 (또는 다른 일치해야 commitsh를 ) - 귀하의 경우, #1.0.0.
Jonathan Lonowski

2016 년 7 월 현재 couchdb에서 마이크로 서비스로 전환함에 따라 자체 레지스트리 호스팅이 더욱 복잡해졌습니다.
Yan Foto

3
또는npm i {owner}/{project}#{tag}"{library}": "github:{owner}/{project}#{tag}"git@github.comgit://github.com
Mike W

237

받아 들인 대답이 효과가 없었습니다. github에서 패키지를 가져 오기 위해하고있는 일은 다음과 같습니다.

npm install --save "git://github.com/username/package.git#commit"

또는 package.json에 수동으로 추가하십시오.

"dependencies": {
  "package": "git://github.com/username/package.git#commit"
}

41
http / https를 사용하는 경우 "git +"접두사를 포함시켜야합니다."package": "git+https://github.com/username/package.git#commit"
Ates Goral

4
이것은 "npm install"까지 작동했지만 응용 프로그램을 실행하려고 할 때 require ( 'mymodule')가 패키지를 찾지 못했습니다. 패키지가 동일한 이름의 node_modules 디렉토리에 있더라도.
데릭

아, 문제의 모듈에는 내가 원하는 특정 커밋이있는 빌드가 포함되어 있지 않으므로 동일한 문제가 발생하면 수동으로 빌드해야 할 수도 있습니다.
데릭

1
당신은 또한 #tag보통 버전 번호를 가리키는 것을 사용할 수 있습니다
deltree

1
@surjikal git에서 버전 번호를 사용하려면 릴리스에 태그를 지정해야합니다. 예를 들어 git tag -a v1.0.1 && git push --tag && git push@Jonathan Lonowski도 의견에서 말했다.
dotnetCarpenter

80

버전별로 태그 또는 릴리스를 의미하는 경우 github은 해당 링크에 대한 다운로드 링크를 제공합니다. 예를 들어 가져 오기 버전 0.3.2 (npm에서는 사용할 수 없음) 를 설치하려면 package.json아래에 추가하십시오 dependencies.

"fetch": "https://github.com/github/fetch/archive/v0.3.2.tar.gz",

커밋 해시 접근 방식과 비교할 때 유일한 단점은 해시가 변경된 코드를 나타내지 않지만 태그를 교체 할 수 있다는 것입니다. 고맙게도 이것은 거의 발생하지 않습니다.

최신 정보:

요즘 내가 사용하는 접근 방식은 GitHub에서 제공하는 종속성에 대한 간단한 표기법입니다.

"dependencies": {
  "package": "github:username/package#commit"
}

커밋은 태그와 같은 커밋이 될 수 있습니다. GitHub의 경우 초기 값 github:이므로 기본값을 삭제할 수 있습니다 .


아카이브 모드는 커밋에도 작동합니다. 예를 들어,`원사 추가 github.com/github/fetch/archive/... `
bvj

가장 깨끗한 솔루션.
Charley Bodkin

8

위의 @qubyte에 대한 내 예제 주석이 잘려서 읽을 수있는 내용이 있습니다 ...

위에서 설명한 @surjikal 방법 은 브랜치 커밋에 작동하지만 포함하려고 시도한 트리 커밋 에는 작동하지 않았습니다 .


보관 모드는 커밋에도 작동합니다. 예를 들어, fetch @ a2fbf83

npm :

npm install  https://github.com/github/fetch/archive/a2fbf834773b8dc20eef83bb53d081863d3fc87f.tar.gz

원사 :

yarn add  https://github.com/github/fetch/archive/a2fbf834773b8dc20eef83bb53d081863d3fc87f.tar.gz

형식 :

 https://github.com/<owner>/<repo>/archive/<commit-id>.tar.gz


모드 가 필요한 트리 커밋은 다음과 같습니다 /archive/.

yarn add  https://github.com/vuejs/vuex/archive/c3626f779b8ea902789dd1c4417cb7d7ef09b557.tar.gz

관련 vuex 커밋


8

이 명령 username/package은 특정 git commit에서 npm 패키지 를 설치합니다 .

npm install https://github.com/username/package#3d0a21cc

여기에 3d0a21cc첫 번째 해시를 커밋의 8 자입니다.


3

여기서는 실행할 때 직면 한 문제에 대해 설명 npm install합니다. 패키지가 나타나지 않습니다 node_modules.

문제는 설치된 패키지 의 namepackage.json이 가져온 패키지의 이름과 다릅니다 ( package.json내 프로젝트의 키 ).

따라서 설치된 프로젝트 이름이 some-package(이름 값 package.json) 인 경우 package.json프로젝트에 다음을 작성하십시오 "some-package": "owner/some-repo#tag".


나는 당신의 대답이 더 일찍 발견되기를 바랍니다. 😓-같은 문제로 잠시 동안 어려움을 겪었습니다. 이 name요구 사항은 인터넷에서 자주 언급되지 않습니다. (적어도 그럴 수는 없습니다).
카마 페더

"전체 범위의 패키지 이름을 지정하여 package.json에 패키지 종속성을 추가하십시오." -실제로 강조하지는 않습니다 : help.github.com/en/articles/…
Kamafeather

나는 npm install --save git+https://<remote-github-repo-url>이것이 나중에이 문제에 다시 부딪치지 않는 매우 안전한 방법 이라는 것을 알았습니다 .
카마 페더

2

tfjs-core 의 두 가지 버전을 실행해야했으며 둘 다 설치 후 빌드해야한다는 것을 알았습니다.

package.json :

"dependencies": {
  "tfjs-core-0.14.3": "git://github.com/tensorflow/tfjs-core#bb0a830b3bda1461327f083ceb3f889117209db2",
  "tfjs-core-1.1.0": "git://github.com/tensorflow/tfjs-core#220660ed8b9a252f9d0847a4f4e3c76ba5188669"
}

그때:

cd node_modules/tfjs-core-0.14.3 && yarn install && yarn build-npm && cd ../../
cd node_modules/tfjs-core-1.1.0  && yarn install && yarn build-npm && cd ../../

마지막으로 라이브러리를 사용하려면

import * as tf0143 from '../node_modules/tfjs-core-0.14.3/dist/tf-core.min.js';
import * as tf110 from '../node_modules/tfjs-core-1.1.0/dist/tf-core.min.js';

이것은 훌륭하게 작동했지만 가장 확실합니다.


1
감사합니다. 상상할 수있는 다른 방법으로 가져 오려고 노력했습니다. 파일에서 직접 가져와야한다는 것을 알기 위해 스 니펫을보아야했습니다.
빅터 이븐 스

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