npm 설치 및 분기 된 github 저장소 빌드


126

이것은 완전히 새로운 질문은 아니지만 지금은 좋은 곳을 찾고 있었고 해결책을 찾는 데 어려움을 겪고 있습니다.

angular-translate라는 앵귤러 앱에 모듈을 사용하고 있습니다. 그러나 모든 것이 원하는 방식으로 작동하도록 소스 코드를 약간 수정해야했으며 이제 이러한 변경 사항을 npm install. 동료가 소스 코드의 저장소를 포크하고 포크 된 저장소를 종속성으로 가리 키도록 제안했습니다. 예를 들어 이러한 방법으로 시도했습니다.

npm install https://github.com/myRepo/angular-translate
npm install https://github.com/myRepo/angular-translate/archive/master.tar.gz

첫 번째는 빌드없이 이와 같은 디렉토리를 제공합니다. package.json, .npmignore 및 일부 마크 다운 파일

-angular-translate
   .npmignore 
   .nvmrc
    CHANGELOG.md 
    package.json
    etc

두 번째 npm install는 전체 저장소를 제공하지만 명령을 사용할 때와 같은 빌드를 얻지 못합니다 npm install angular-translate. prepublish 스크립트를 실행하는 것에 대한 이야기를 보았지만 모든 모듈을 설치할 때 어떻게해야할지 모르겠습니다. 또한 포크를 npm 레지스트리에 자체 모듈로 게시하려고 시도했지만 다시 빌드가 없으며 이것이 올바른 작업인지 확신하지 못합니다.

나는 주제에 대한 나의 무지에 대해 사과드립니다. npm에 대한 경험이 많지 않습니다. 이 문제에 대한 피드백을 받고 싶습니다. 패키지의 소스 코드를 수정해야 할 때 일반적인 문제가 될 수 있습니까? 더 나은 해결책이 있을까요? 도움을 주셔서 미리 감사드립니다.

답변:


140

를 시도해보십시오 npm install <ghusername>/<repoName>. <ghUsername>여기서은 (는 @) GitHub 사용자 이름이고은 <repoName>저장소의 이름입니다. 올바르게 설치해야합니다. --save또는 --save-dev플래그를 install 명령과 함께 사용 하여 package.json.

제대로 작동하지 않으면 .npmignore파일 내용을 확인 하십시오.

설치 명령이 오래 걸리더라도 당황하지 마십시오. git 저장소에서 설치하는 것은 npm 레지스트리에서 설치하는 것보다 느립니다.


편집하다:

귀하의 문제는 귀하의 경우에 dist/repo에 커밋되지 않는다는 것입니다 ( .gitignore. 이것이 실제 코드가있는 곳입니다. 패키지가 npm 레지스트리에 게시되기 전에 dist/파일에서 빌드 src/되지만 dist/repo에 커밋되지 않습니다.

그것은 추한하지만,이 경우에는 제거해야합니다 dist/으로부터 .gitignore실행 다음과 :

npm run build
git add .
git commit
git push

( npm install먼저 실행했는지 확인하십시오 )

그러면 github에서 설치할 수 있습니다.

postinstall스크립트를 사용하여이 작업을 수행하는 다른 방법이있을 수 있지만 가능한지 잘 모르겠습니다. 나는 그것을 시도한 적이 없습니다.


2
네, 그것은 거의 해결책이었습니다. 또한 npm 설치를 수행하고 GruntFile을 약간 수정해야했지만 작동했습니다. 도와 주셔서 감사합니다 :)
hughesjmh

2
unignore dist 외에 다른 방법이 정말 없나요? 원본 저장소에 PR을 만들고 싶지만 dist와 함께라면 그가 좋아하지 않을까요?
Ka Mok

7
나는에, 또 다른 옵션에 생각 @KaMok package.json에서, 포크의 파일 scripts이름 바꾸기, prepublishprepare. 이 경우 것 npm install또는 npm install github:user_name/fork_name --save그것은 또한에 무엇이 실행 실행 (원사에 대한 동일) prepare스크립트. 이것은 prepublish이 패키지 의 스크립트가 일반적으로 빌드 파일을 생성 한다고 가정합니다 .
davidfrancisco

5
특정 지점이 필요한 경우npm install <ghusername>/<repoName>#branchName
DrMeers

2
@RyanZim 틀 렸습니다. git에서 설치는 제대로 설정되어있는 한 매우 잘 작동합니다. docs.npmjs.com/cli/install "설치중인 패키지에 prepare스크립트 가 포함되어있는 경우 패키지를 패키지화하고 설치하기 전에 해당 dependencies및 패키지가 설치되고 devDependencies준비 스크립트가 실행됩니다."
Cameron Tacklind 19 년

15

npm 5를 사용하는 사람들을위한 업데이트 :

npm @ 5부터 prepublish스크립트는 더 이상 사용되지 않습니다.

사용하여 prepare빌드 단계를하고 prepublishOnly업로드 전용을 위해.

"prepare": "npm run build"스크립트에 a 를 추가하면 모든 문제가 해결되었습니다.


저에게도 효과가있었습니다 (방금 만든 포크에서) — 감사합니다! 왜 모든 패키지에 기본적으로이 스크립트 구성이 포함되지 않는지 궁금합니다. 패키지 작성자가 git repo에서 설치하는 경우가 아니라 npm에서 패키지를 설치하는 사용 사례 만 고려하기 때문입니까? 그들은 단지 수동으로 실행하는 데 사용하고 그래서 npm run build하고 npm run publish, 어떤 문제 나 고통으로 실행하지 않는 그들은 언젠가 REPO를 통해 자식을 설치하려고하지 않는?
Tyler Rick

9

npmjs.com에 게시 된 코드는 종종 패키지의 저장소에있는 것이 아닙니다. 자바 스크립트 소스 파일을 라이브러리에서 일반적으로 사용할 수있는 버전으로 "컴파일"하는 것이 일반적입니다. 이것이 일반적으로 npmjs.com에 게시되는 내용입니다.

게시 하기 전에npm "빌드"단계를 자동으로 실행하는 기능인 것은 매우 일반적입니다 ( ). 이것은 원래 . Npm 은 개발 환경을 초기화하는 표준 방법이기 때문에 스크립트를 실행하는 것이 편리하다고 생각한 것 같습니다 .npm publishprepublishprepublishnpm install

이로 인해 커뮤니티에 큰 혼란이 생겼습니다. 이에 대해 github에는 매우 긴 문제가 있습니다.

결국, 이전 동작을 변경하지하기위한 노력의 일환으로, 그들은 두 개 더 자동 스크립트를 추가하기로 결정 prepublishOnly하고 prepare.

prepublishOnly당신이 기대하는 것을합니다. 에서 실행되지 않습니다 npm install. 많은 패키지 관리자가 맹목적으로 이것으로 전환했습니다.

그러나 사람들이 패키지 버전을 배포하기 위해 npmjs.com에 의존하지 않기를 원하는이 문제도있었습니다. Git 리포지토리는 자연스러운 선택이었습니다. 그러나 "컴파일 된"파일을 git에 커밋하지 않는 것이 일반적입니다. 그것이 prepare처리하기 위해 추가 된 것입니다 ...

prepare 올바른 방법입니다

소스 파일이있는 저장소가 있지만이를 사용하기 위해 "빌드"단계가 필요한
prepare경우 모든 경우에 원하는대로 정확히 수행합니다 (npm 4 기준).

prepare: 패키지가 압축되고 게시되기 전에 npm install인수없이 로컬에서 , git 종속성을 설치할 때 모두 실행합니다 .

빌드 종속성을 넣을 수도 있으며 실행 devDependencies되기 전에 설치됩니다 prepare.

다음은 이 방법을 사용하는 내 패키지의 입니다.


문제 .gitignore

이 옵션에는 많은 사람들을 끌어들이는 한 가지 문제가 있습니다. 종속성을 준비 할 때 Npm 및 Yarn은의 섹션에 나열된 파일 유지 합니다 .filespackage.json

하나는 볼 수있는 files모든 파일에 기본적으로 포함되어 있으며이 완료 생각합니다. 무엇 쉽게 누락되어 있다는 것입니다 .npmignore 주로 재정의 files지시를 하고 , 경우에 .npmignore존재하지 않는, .gitignore대신 사용됩니다.

당신이 나열된 내장 된 파일이있는 경우 그래서, .gitignore온전한 사람 등을하고 다른 작업을 수행하지 않는 prepare같다 깨진

files빌드 된 파일 만 포함하도록 수정 하거나 빈을 추가하면 .npmignore모든 설정이 완료된 것입니다.

내 권장 사항은 실제로 게시 된 유일한 파일 이 게시 된 패키지의 사용자에게 필요한 파일 이되도록 설정 files(또는 반전에 의해 .npmignore) 하는 것입니다. Imho, 게시 된 패키지에 컴파일되지 않은 소스를 포함 할 필요가 없습니다.


원래 답변 : https://stackoverflow.com/a/57503862/4612476


1
PREPARE가 POSTINSTALL 대신 나를 위해 일했습니다. 준비에서 npm run build를 실행했습니다.
Milind

6

@RyanZim의 훌륭한 답변을 피기 백 postinstall하는 것은 확실히 유효한 옵션입니다.

다음 중 하나를 수행하십시오.

  1. 분기 된 저장소에서 package.json을 업데이트하여 postinstall 요소를 스크립트에 추가하십시오. 여기에서 컴파일 된 출력을 얻는 데 필요한 모든 것을 실행하십시오 (선호).
  2. package.json을 업데이트하고 node_modules에서 필요한 디렉토리를 업데이트하는 사후 설치를 추가하십시오.

다른 사람 저장소를 포크 한 경우 GitHub를 통한 패키지 설치가 스크립트를 빌드하는 데 필요한 수단을 제공하지 않기 때문에 작동하지 않는 문제를 설명하기 위해 문제를 제기 할 가치가 있습니다. 거기에서 PR을 수락하여 설치 후이 문제를 해결하거나 거부하고 # 2를 수행 할 수 있습니다.


# 2를 수행하는 방법에 대해 설명하거나 리소스가 있습니까? 어떤 명령은 gitrepo은 SRC DIST하지 포함되어있는 경우 나 설치 NPM 후에 실행해야합니까
다니엘

1
@Daniel Apologies, 나는 과거에 이것을 한 상황을 기억하려고 노력하고 있습니다. 나는 # 2에서 최상위 답변 단계를 실행하는 기본 packages.json에 설치 후 단계를 추가하려고했기 때문에 "postinstall": "cd node_modules/scrape-twitter/ && npm install && npm run build"문제를 일으키는 패키지가 애플리케이션이 실행되기 전에 빌드되도록하기 위해 의 라인을 따라 무언가를 추가했습니다 . 하지만 말했듯이, 저는 리포지토리를 내 사용자에게 포크하고, 패키지 자체에 설치 후를 추가하고, 내 애플리케이션에서 사용하는 방법을 선호합니다.
Mike B

npm에서 설치하는 경우 이미 dist / dir이 포함되어 있기 때문에 추가 건물을 할 필요가 없기 때문에 준비를 위해 추가하는 것이 선호되어야한다고 생각합니다 (@Simon의 대답). docs.npmjs.com/misc/scripts를 참조하십시오 . "준비 : 패키지가 압축되고 게시되기 전에 ... 그리고 git 종속성을 설치할 때 모두 실행"
Tyler Rick

postinstall올바른 솔루션에 한 단계 부족합니다. 그냥 사용하십시오 prepare. 2020 년입니다.
Cameron Tacklind

2

명령을 사용하십시오 npm install git+https://git@github.com/myRepo/angular-translate.git. 감사.

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