Heroku에서 node.js 앱을 만들 때 git에 node_modules를 체크인해야합니까?


368

Heroku에서 node.js에 대한 기본 시작 지침을 따르십시오.

https://devcenter.heroku.com/categories/nodejs

이 명령어는 .gitignore node_modules를 생성하도록 지시하지 않으므로 node_modules를 git에 체크인해야 함을 의미합니다. git에 node_modules를 포함 시키면 시작하는 응용 프로그램이 올바르게 실행되었습니다.

더 고급 예를 따르면 :

https://devcenter.heroku.com/articles/realtime-polyglot-app-node-ruby-mongodb-socketio https://github.com/mongolab/tractorpush-server (소스)

gitgitore에 node_modules를 추가하도록 지시했습니다. 그래서 git에서 node_modules를 제거하고 .gitignore에 추가 한 다음 다시 배포했습니다. 이번에는 배포가 실패했습니다.

-----> Heroku receiving push
-----> Node.js app detected
-----> Resolving engine versions
       Using Node.js version: 0.8.2
       Using npm version: 1.0.106
-----> Fetching Node.js binaries
-----> Vendoring node into slug
-----> Installing dependencies with npm
       Error: npm doesn't work with node v0.8.2
       Required: node@0.4 || 0.5 || 0.6
           at /tmp/node-npm-5iGk/bin/npm-cli.js:57:23
           at Object.<anonymous> (/tmp/node-npm-5iGk/bin/npm-cli.js:77:3)
           at Module._compile (module.js:449:26)
           at Object.Module._extensions..js (module.js:467:10)
           at Module.load (module.js:356:32)
           at Function.Module._load (module.js:312:12)
           at Module.require (module.js:362:17)
           at require (module.js:378:17)
           at Object.<anonymous> (/tmp/node-npm-5iGk/cli.js:2:1)
           at Module._compile (module.js:449:26)
       Error: npm doesn't work with node v0.8.2
       Required: node@0.4 || 0.5 || 0.6
           at /tmp/node-npm-5iGk/bin/npm-cli.js:57:23
           at Object.<anonymous> (/tmp/node-npm-5iGk/bin/npm-cli.js:77:3)
           at Module._compile (module.js:449:26)
           at Object.Module._extensions..js (module.js:467:10)
           at Module.load (module.js:356:32)
           at Function.Module._load (module.js:312:12)
           at Module.require (module.js:362:17)
           at require (module.js:378:17)
           at Object.<anonymous> (/tmp/node-npm-5iGk/cli.js:2:1)
           at Module._compile (module.js:449:26)
       Dependencies installed
-----> Discovering process types
       Procfile declares types -> mongod, redis, web
-----> Compiled slug size is 5.0MB
-----> Launching... done, v9

"heroku ps"를 실행하면 충돌이 확인됩니다. 문제 없습니다. 변경 사항을 롤백하고 node_module을 git 저장소에 다시 추가하고 .gitignore에서 제거했습니다. 그러나 되 돌린 후에도 배포시 여전히 동일한 오류 메시지가 표시되지만 이제 응용 프로그램이 다시 올바르게 실행 중입니다. "heroku ps"를 실행하면 응용 프로그램이 실행되고 있음을 알 수 있습니다.

그래서 내 질문은 이것을하는 올바른 방법은 무엇입니까? node_modules 포함 여부 롤백 할 때 왜 여전히 오류 메시지가 표시됩니까? 내 생각에 git 저장소가 Heroku 쪽의 상태가 좋지 않습니까?


10
저는 Heroku의 노드 언어 소유자이며 대답은 간단합니다. 아니요 node_modules. Heroku 앱에 체크인하지 마십시오 .
hunterloftis가

@hunterloftis '음주 node_modules을 확인하지 '또는 'node_modules을 선택하지 '? 명확하게 말하면 Heroku의 노드 언어 소유자로서 git push를 통해 전체 node_modules를 업로드하겠습니까? 나는 대역폭 낭비와 Heroku가 내 자식 푸시 백엔드에서 그것들을 얻을 것이라는 사실을 선호하지 않습니다. 그러나 Heroku가 내 앱을로드하도록 내 node_modules에서 파일을 수동으로 편집해야했습니다. 따라서 node_modules에서 편집 된 파일이 포함 된 전체 모듈을 뺀 것을 무시해야 작동했습니다.
ZStoneDPM

답변:


400

두 번째 업데이트

더 이상 FAQ를 사용할 수 없습니다.

의 문서에서 shrinkwrap:

패키지에 포함 된 특정 바이트를 잠 그려면 (예 : 배포 또는 빌드를 재현 할 수 있음을 100 % 확신하려면) 소스 제어에 대한 종속성을 확인하거나 확인할 수있는 다른 메커니즘을 찾아야합니다. 버전이 아닌 컨텐츠.

Shannon과 Steven은 이것을 전에 언급했지만, 나는 그것이 대답의 일부라고 생각합니다.


최신 정보

아래 권장 사항에 대한 소스 가 업데이 트되었습니다 . 더 이상 node_modules폴더를 커밋 할 것을 권장하지 않습니다 .

보통은 아닙니다. npm이 패키지의 종속성을 해결하도록 허용하십시오.

웹 사이트 및 앱과 같이 배포하는 패키지의 경우 npm shrinkwrap을 사용하여 전체 종속성 트리를 잠 가야합니다.

https://docs.npmjs.com/cli/shrinkwrap


원본 게시물

참고로, npm FAQ는 귀하의 질문에 명확하게 답변합니다 :

웹 사이트 및 앱과 같이 배포하는 항목에 대해서는 node_modules를 git로 확인하십시오. 재사용 할 라이브러리 및 모듈에 대해서는 node_modules를 git에 체크인하지 마십시오. npm을 사용하여 개발 환경에서는 종속성을 관리하지만 배포 스크립트에서는 종속성을 관리하지 않습니다.

이것에 대한 좋은 근거는 Mikeal Rogers의 게시물을 읽으 십시오 .


출처 : https://docs.npmjs.com/misc/faq#should-i-check-my-node-modules-folder-into-git


13
이것은 정확하지 않습니다-사실 그것은 매우 나쁜 생각입니다. Windows에서 개발 한 다음 Linux에 배포하는 경우 배포 할 때 node_modules를 다시 작성해야합니다. 어떤 의미-혼돈. 수정 된 파일이 많으며 수행 할 작업을 모릅니다.
user3690202 2016 년

8
불가능합니다. 일부 개발자는 타겟팅 창을 개발하고 다른 개발자는 Linux를 타겟팅하지만 동일한 코드 기반을 개발합니다. 가장 좋은 방법은 노드 모듈을 커밋하지 않는 것입니다.
user3690202

7
@ user3690202 표준이 아닌 매우 전통적인 경우가있는 것처럼 들리므로 "이것이 맞지 않습니다"라고 말하는 것은 과장된 표현 일 것입니다. 당신의 정확한 유스 케이스가 무엇인지 확실하지 않지만, 개발에 윈도우와 리눅스를 모두 사용하는 이유는 생각할 수 없습니다. 하나를 고수하고 지원하는 모든 플랫폼에서 테스트 또는 QA를 실행하십시오.
코스 티아

16
@Kostia 우리의 사용 사례는 매우 일반적인 것입니다. 우리는 자원 봉사자이며 회사가 아닌 자체 기계를 사용합니다. 오픈 소스의 경우 매우 일반적인 상황 인 것 같습니다.
Adam

4
@Adam 접선으로, 컴파일되는 파일을 추가 할 수 .gitignore있습니까? 그 방법은, 소스는 자식이며, 컴파일 된 구성 요소는 유사에없는 방법 dist또는 output폴더 꿀꿀하고 꿀꺽 꿀꺽 프로젝트에 gitignored된다.
코스 티아

160

git에 체크인 하지 않는 것에 대한 나의 가장 큰 관심 node_modules은 프로덕션 응용 프로그램이 여전히 사용 중일 때 npm이 없을 수 있다는 10 년의 길입니다. 또는 npm이 손상 될 수 있습니다. 또는 관리자가 저장소에서 의존하는 라이브러리를 제거하기로 결정할 수 있습니다. 또는 사용중인 버전이 잘릴 수 있습니다.

maven과 같은 repo 관리자를 사용하면 항상 자신의 로컬 Nexus 또는 Artifactory를 사용하여 사용하는 패키지로 미러를 유지할 수 있기 때문에 완화 할 수 있습니다. 내가 이해하는 한, 그러한 시스템은 npm에 존재하지 않습니다. Bower 및 Jamjs와 같은 클라이언트 측 라이브러리 관리자도 마찬가지입니다.

파일을 자신의 git repo에 커밋 한 경우 원하는 경우 파일을 업데이트 할 수 있으며 반복 가능한 빌드와 일부 타사 작업으로 인해 앱이 중단되지 않는다는 지식이 편안합니다.



4
npmjs FAQ : "npm 에코 시스템에 의존하는 편집증이라면 개인 npm 미러 또는 개인 캐시를 실행해야합니다." 나는 이것이 당신이 말하는 문제를 지적한다고 생각합니다.
Taylan


2
Npm은 밤새 사라지지 않을 것이기 때문에 커밋 기록의 선명도 손실 및 번들 크기가 큰 이점과 실제로 이점이 잘 맞지 않습니다. 누군가 10 년 후에도 여전히 활성화 될 것으로 생각되는 응용 프로그램을 구축하는 경우 그 과정에서 많은 유지 보수를받을 것으로 기대하는 것이 합리적입니다. NPM 중단에 대한 요점은 훨씬 더 좋은 논거이지만, 소스에 커밋하는 것보다 위험을 완화 할 수있는 더 좋은 방법이있을 수 있습니다.
Sam P

3
종속성을 커밋하지 않으면 1 개월이 지나도 위험합니다 (바람직하게는 별도의 저장소에 있음). 어느 날 아침 프로젝트 중 하나를 복제하고 npm에서 패키지 버전이 제거 된 것을 발견했습니다. 나는 npm 업데이트가 작동하고 다시 빌드되도록 모든 계단식 종속성의 버전을 반나절 보냈습니다.
Richard

67

당신은해야합니다 포함되지 node_modules 귀하의 .gitignore(또는 오히려 당신이 포함되어야 node_modules 소스에 Heroku가 배포).

만약 node_modules:

  • 존재 한 후 npm install그 vendored libs와 사용하고 어떤 이진 종속성을 다시 작성합니다 npm rebuild.
  • 존재하지 않는 다음 npm install슬러그 컴파일 단계로 시간을 추가 모든 종속성 자체를 가져올 것입니다.

Node.js 빌드 팩 소스를 참조하십시오. 정확한 단계 하십시오.

그러나 원래 오류는 버전 간의 비 호환성으로 보이는 npmnode. 이러한 상황을 피하기 위해이 안내서 에 따라 engines섹션 을 항상 명시 적으로 설정하는 것이 좋습니다 .packages.json

{
  "name": "myapp",
  "version": "0.0.1",
  "engines": {
    "node": "0.8.x",
    "npm":  "1.1.x"
  }
}

이것은 dev / prod 패리티를 보장 하고 앞으로 그러한 상황의 가능성을 줄입니다.


도와 줘서 고마워 Ryan. npm 버전 오류가 발생했지만 이제 redis 패키지를 컴파일 할 때 실패합니다. 오류 메시지는 "OSError : [Errno 2] 해당 파일 또는 디렉토리가 없습니다 : '/ Users / Jason / tastemade / tastebase / node_modules / redis-url / node_modules / redis / node_modules / hiredis / build'"입니다. heroku 서버의 로컬 상자에서 경로를 사용하고있는 것 같습니다. .gitignore에 추가 해야하는 node_modules에 특정 파일이 있습니까?
Jason Griffin

특정 라이브러리에서 무슨 일이 일어나고 있는지 잘 모르겠지만이 경우 git에서 node_modules를 제외하고 그것이 도움이되는지 확인하려고합니다 (npm이 모든 것을 가져오고 새로운 빌드 환경을 보장하도록 강제하십시오).
Ryan Daigle

@RyanDaigle npm ( npmjs.org/doc/… )과 heroku ( devcenter.heroku.com/articles/… )에서 권장하는 모범 사례 (2013 년 11 월) 는 node_modules를 git에 체크인하는 것입니다. 최고 청구서가 있으므로 답변을 업데이트 하시겠습니까?
Tim Diggins

heroku로 푸시하면서 "-----> 차후 빌드를위한 Caching node_modules 디렉토리"출력을 얻게됩니다. 이것은 미래의 슬러그 컴파일을 단축시키기위한 것입니다.
ph3nx 2016 년

node_modules 파일 경로가 커밋하기에 너무 길다는 문제가 있습니다. 힘내 파일을 찾을 수 없습니다.
Code Pharaoh

22

이 의견 후에 이것을 남겨 두려고했습니다. 두려고했습니다 .Heroku에서 node.js 앱을 만들 때 git_nodes를 체크인해야합니까?

그러나 stackoverflow는 이상한 형식이었습니다. 동일한 머신이없고 node_modules를 체크인하는 경우 기본 확장에서 .gitignore를 수행하십시오. .gitignore는 다음과 같습니다.

# Ignore native extensions in the node_modules folder (things changed by npm rebuild)
node_modules/**/*.node
node_modules/**/*.o
node_modules/**/*.a
node_modules/**/*.mk
node_modules/**/*.gypi
node_modules/**/*.target
node_modules/**/.deps/
node_modules/**/build/Makefile
node_modules/**/**/build/Makefile

먼저 모든 것을 체크인하여 테스트 한 다음 다른 개발자가 다음을 수행하도록하십시오.

rm -rf node_modules
git checkout -- node_modules
npm rebuild
git status

파일이 변경되지 않았는지 확인하십시오.


방금 추가했습니다. 내 문제를 해결했습니다. Windows github이 7000+ 이상의 node_module 파일을 넘어 가려고 계속 충돌했습니다. /
Batman

10

npm install프로덕션 환경에서 실행 하면 안된다고 생각 합니다. 잘못 될 수있는 몇 가지가 있습니다-npm 중단, 최신 종속성 다운로드 (shrinkwrap이 해결 된 것으로 보입니다)는 그 중 두 가지입니다.

반면 node_modules에 git에 커밋해서는 안됩니다. 크기가 크지 않더라도 커밋을 방해 할 수 있습니다.

가장 좋은 솔루션은 다음과 같습니다. npm install프로덕션 환경과 유사한 CI 환경에서 실행해야합니다. 모든 테스트가 실행되고 모든 종속성을 포함하는 압축 파일이 생성됩니다.


배포의 일부로 실행되지 않는 CI에서 실행되는 단계가있는 이유는 무엇입니까? 이것은 두 시스템 사이에 패리티가 없다는 것을 의미합니다! 위의 답변에서 알 수 있듯이 폴더 커밋은 기본 확장명을 무시하므로 npm 중단과 같은 사항에 대해 다루는 방식
Voycey

1
귀하의 의견에 감사드립니다. 프로덕션 서버에서 실행되는 node_modules는 개발자가 커밋 한 것이 아닌 npm 설치에서 생성되어야한다고 생각합니다. dev의 node_modules 폴더가 package.json 내용과 반드시 ​​일치 할 필요는 없습니다.
user2468170

8

node_modules 폴더 커밋과 수축 포장을 모두 사용했습니다. 두 솔루션 모두 나를 행복하게 만들지 못했습니다.

간단히 말해 커밋 된 node_modules는 저장소에 너무 많은 노이즈를 추가합니다.
그리고 shrinkwrap.json은 관리가 쉽지 않으며 몇 년 안에 축소 된 프로젝트가 빌드 될 것이라는 보장이 없습니다.

Mozilla가 프로젝트 중 하나에 별도의 저장소를 사용하고 있음을 발견했습니다 https://github.com/mozilla-b2g/gaia-node-modules

따라서이 아이디어를 노드 CLI 도구 https://github.com/bestander/npm-git-lock 에서 구현하는 데 오랜 시간이 걸리지 않았습니다.

모든 빌드 직전에
npm-git-lock --repo [git@bitbucket.org : your / dedicated / node_modules / git / repository.git]를 추가하십시오.

package.json의 해시를 계산하고 원격 저장소에서 node_modules 컨텐츠를 체크 아웃하거나이 package.json의 첫 번째 빌드 인 경우 정리를 수행 npm install하고 결과를 원격 저장소로 푸시합니다.


5

나를 위해 일한 것은 package.json ( "npm": "1.1.x")에 npm 버전을 명시 적으로 추가하고 node_modules에서 git에 체크인하지 않았습니다. 배포 할 때마다 속도가 느려질 수 있지만 (매번 패키지를 다운로드하므로) 패키지를 체크인 할 때 패키지를 컴파일 할 수 없었습니다. Heroku는 로컬 박스에만 존재하는 파일을 찾고있었습니다.


내 대답이 정답이라고 생각되면 수락하십시오. 감사합니다!
Ryan Daigle

경우 이것은 최대 논쟁 아직도, 나는 위의 질문의 거의 중복이 유래 포스트를 살펴 걸릴 것 : stackoverflow.com/questions/11459733/... 기본적를,이 협약이 node_modules에 확인하는 것입니다 것, 그리고 해당 모듈의 버전을 로컬에서 관리하십시오. 이것은 꽤 합리적이며 아마도 가장 간결한 설명은 다음과 같습니다. mikealrogers.com/posts/nodemodules-in-git.html 행운을 빌어 요!
전사 Postman

3

node_modules를 체크인하는 대신 앱의 package.json 파일을 만드십시오.

package.json 파일은 애플리케이션의 종속성을 지정합니다. 그러면 Heroku는 npm에게 이러한 모든 종속성을 설치하도록 지시 할 수 있습니다. 링크 된 학습서에는 package.json 파일에 대한 섹션이 있습니다.


package.json이 있습니다. { "name": "node-example", "version": "0.0.1", "dependencies": { "express": "2.5.x", "redis-url": "0.1. 0 ","mongodb ":"> = 0.9.9 "},"engines ": {"node ":"0.8.x "}}
Jason Griffin

node_modules 디렉토리를 만들기 위해 로컬 박스에서 작업했습니다. 이것이 내가 체크인 한 다음 제거하고 다시 추가 한 것입니다.
Jason Griffin

튜토리얼을 자세히 살펴보면 node_modules를 커밋하는 것처럼 보입니다. 이 경우 node_modules를 커밋하지 않는 방법이 있는지 확실하지 않습니다. 미안
matzahboy

3

이 솔루션을 사용하고 있습니다 :

  1. 를 보유하는 별도의 저장소를 작성하십시오 node_modules. 특정 플랫폼 용으로 빌드해야하는 기본 모듈이있는 경우 각 플랫폼마다 별도의 저장소를 작성하십시오.
  2. 다음을 사용하여이 저장소를 프로젝트 저장소에 연결하십시오 git submodule.

git submodule add .../your_project_node_modules_windows.git node_modules_windows

git submodule add .../your_project_node_modules_linux_x86_64 node_modules_linux_x86_64

  1. 플랫폼 별에서 링크 만들기 node_modulesnode_modules디렉토리를 추가 node_modules.gitignore.
  2. 를 실행하십시오 npm install.
  3. 서브 모듈 저장소 변경 사항을 커미트하십시오.
  4. 프로젝트 저장소 변경 사항을 커미트하십시오.

따라서 node_modules다른 플랫폼에서 쉽게 전환 할 수 있습니다 (예 : OS X에서 개발하고 Linux에 배포하는 경우).


3

에서 https://web.archive.org/web/20150212165006/http://www.futurealoof.com/posts/nodemodules-in-git.html :

편집 : 원래 링크는 이것 이지만 이제는 죽었습니다. 지적 해 주신 @Flavio에게 감사드립니다.

요약하자면.

  • 유지 관리하는 재사용 가능한 패키지가 아니라 배포 한 응용 프로그램에 대해서만 node_modules를 체크인하십시오.
  • 컴파일 된 종속성은 컴파일 대상이 아닌 소스를 체크인해야하며 배치시 $ npm을 다시 빌드해야합니다.

내가 가장 좋아하는 부분 :

gitignore에 node_modules를 추가 한 모든 사람들은 그 똥을 제거합니다. 오늘날 우리가 너무 행복하게 남겨 두는 시대의 인공물입니다. 글로벌 모듈의 시대는 끝났습니다.


연결 한 사이트가 만료되어 현재는 스팸 광고로 가득 차 있습니다. 이러한 광고가 "우리 모두 너무 기뻐서 버릴 수없는 시대의 인공물"이되기를 바랍니다.
Flavio Copes

1
@FlavioCopes Wayback Machine의 링크로 답변을 업데이트했습니다.
Benjamin Crouzier

2

http://nodejs.org/api/modules.html

[...] 노드는 현재 모듈의 상위 디렉토리에서 시작하여을 추가 /node_modules하고 해당 위치에서 모듈을로드하려고 시도합니다.

디렉토리 가 없으면 트리의 루트에 도달 할 때까지 상위 디렉토리로 이동합니다 .

앱에 자신의 모듈 별을 압연하는 경우, 당신은 그 (유지할 수 있습니다 만 그 앱의의를) /node_modules. 다른 모든 종속성을 상위 디렉토리로 이동하십시오.

이 멋진 사용 사례는 앱을 위해 특별히 만든 모듈을 앱으로 멋지게 유지하고 나중에 설치할 수있는 종속성으로 앱을 어지럽히 지 않습니다.


1

시나리오 1 :

한 시나리오 : npm에서 제거 된 패키지를 사용합니다. node_modules 폴더에 모든 모듈이 있으면 문제가되지 않습니다. package.json에 패키지 이름 만 있으면 더 이상 얻을 수 없습니다. 패키지가 24 시간 미만인 경우 npm에서 쉽게 제거 할 수 있습니다. 24 시간이 지난 경우 연락해야합니다. 그러나:

지원 부서에 문의하면 해당 버전의 패키지를 제거하면 다른 설치가 중단되는지 확인합니다. 그렇다면 제거하지 않습니다.

더 읽어보기

따라서이 가능성은 낮지 만 시나리오 2가 있습니다 ...


시나리오 2 :

이 경우의 다른 시나리오 : 소프트웨어의 엔터프라이즈 버전 또는 매우 중요한 소프트웨어를 개발하고 package.json에 작성하십시오.

"dependencies": {
    "studpid-package": "~1.0.1"
}

function1(x)해당 패키지 의 방법 을 사용합니다 .

이제 studpid 패키지의 개발자는 방법 이름을 변경 function1(x)하는 방법에 대해 function2(x)그들은 그들은에서 자신의 패키지의 버전을 변경 ... 고장을 1.0.11.1.0. npm install다음에 전화 할 때 1.1.0물결표 ( "studpid-package": "~1.0.1") 를 사용했기 때문에 버전을 수락 하기 때문에 문제가됩니다 .

전화 function1(x)하면 오류와 문제가 발생할 수 있습니다.


전체 node_modules 폴더 (보통 100MB 이상)를 저장소로 푸시하면 메모리 공간이 필요합니다. 수백 MB (package.json & node_modules)에 비해 몇 kb (package.json 만 해당) ... 생각해보십시오.

당신은 그것에 대해 생각해야 / 그것을 할 수 있는 경우 :

  • 소프트웨어는 매우 중요합니다.

  • 문제가 발생하면 비용이 발생합니다.

  • npm 레지스트리를 신뢰하지 않습니다. npm은 중앙 집중식이며 이론적으로 종료 될 수 있습니다.

다음 과 같은 경우 99.9 %의 경우 node_modules 폴더를 게시 할 필요가 없습니다 .

  • 자신만을위한 소프트웨어를 개발합니다.

  • 무언가를 프로그래밍하고 다른 누군가가 관심을 가질 수 있기 때문에 GitHub에 결과를 게시하려고합니다.


node_modules를 저장소에 두지 않으려면 .gitignore파일을 만들고 행을 추가하십시오 node_modules.

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