Heroku에서 Node.js 앱을 만들 때 Git에 "node_modules" 폴더를 체크인해야 합니까?
Heroku의 Node.js에 대한 기본 시작 지침을 따릅니다.
https://devcenter.heroku.com/categories/nodejs
이러한 지침은 .gitignore node_modules를 생성하라는 것이 아니므로 node_modules 폴더가 Git에 체크인되어야 함을 의미합니다.Git 저장소에 node_modules를 포함시켰을 때 시작 응용 프로그램이 올바르게 실행되었습니다.
다음과 같은 고급 예를 따를 때:
- Node.js, Ruby, MongoDB 및 Socket을 사용한 실시간 폴리글롯 애플리케이션 구축.IO
- https://github.com/mongolab/tractorpush-server (출처)
.gitignore 파일에 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
"herokups"를 실행하면 충돌이 확인됩니다.좋아요, 문제 없습니다. 그래서 저는 변경 사항을 롤백하고, node_module 폴더를 Git 저장소에 다시 추가한 후 파일 .gitignore에서 제거했습니다.그러나 복구한 후에도 배포 시 동일한 오류 메시지가 표시되지만 이제 애플리케이션이 다시 올바르게 실행되고 있습니다."herokups"를 실행하면 응용 프로그램이 실행 중임을 알 수 있습니다.
어떻게 하는 게 좋을까요?node_modules 폴더를 포함하시겠습니까?롤백할 때 오류 메시지가 표시되는 이유는 무엇입니까?헤로쿠 측의 Git 저장소 상태가 좋지 않은 것 같습니다.
두 번째 업데이트
FAQ는 더 이상 제공되지 않습니다.
의 설명서에서:
패키지에 포함된 특정 바이트를 잠그려면, 예를 들어 배포나 빌드를 복제할 수 있다는 확신을 100% 확보하려면 소스 제어에 종속성을 확인하거나 버전이 아닌 내용을 확인할 수 있는 다른 메커니즘을 사용해야 합니다.
Shannon과 Steven은 전에 이것을 언급했지만, 저는 그것이 받아들여진 답변의 일부가 되어야 한다고 생각합니다.
갱신하다
아래 권장 사항에 대해 나열된 소스가 업데이트되었습니다.그들은 더 이상 추천하지 않습니다.node_modules
폴더가 커밋됩니다.
보통은 아니구요.npm이 패키지에 대한 종속성을 해결할 수 있도록 허용합니다.
웹 사이트 및 앱과 같이 배포하는 패키지의 경우 npm 축소 랩을 사용하여 전체 종속성 트리를 잠가야 합니다.
원본 게시물
참고로, 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
Git에 node_modules 폴더를 확인하지 않은 것에 대한 가장 큰 우려는 프로덕션 애플리케이션이 아직 사용 중인 10년 후에는 npm이 없을 수도 있다는 것입니다.또는 npm이 손상되거나 유지 관리자가 사용자가 의존하는 라이브러리를 저장소에서 제거하기로 결정하거나 사용자가 사용하는 버전이 트리밍될 수 있습니다.
Maven과 같은 저장소 관리자를 사용하면 언제든지 로컬 Nexus(소나 유형) 또는 Artificory를 사용하여 사용하는 패키지로 미러를 유지 관리할 수 있으므로 이러한 문제를 완화할 수 있습니다.제가 알기로는 npm에는 그런 시스템이 없는 것으로 알고 있습니다.Bower 및 Jam.js와 같은 클라이언트 측 라이브러리 관리자도 마찬가지입니다.
자신의 Git 저장소에 파일을 커밋한 경우 원하는 때에 파일을 업데이트할 수 있으며, 반복 가능한 빌드를 사용할 수 있으며 일부 타사 작업으로 인해 애플리케이션이 손상되지 않을 수 있습니다.
.gitignore 파일에 node_modules 폴더를 포함해서는 안 됩니다(또는 Heroku에 배포된 소스에 node_modules 폴더를 포함해야 합니다).
node_modules 폴더인 경우:
- 그때 존재합니다.
npm install
에서는 이러한 하여 재구성합니다.npm rebuild
. - 존재하지 않는 경우
npm install
슬러그 컴파일 단계에 시간을 추가하는 모든 종속성 자체를 가져와야 합니다.
이러한 정확한 단계는 Node.js 빌드 팩 소스를 참조하십시오.
그러나 원래 오류는 npm 버전과 Node.js 버전 간의 비호환성으로 보입니다.항상 명시적으로 설정하는 것이 좋습니다.engines
다음과 같은 상황을 방지하기 위해 이 가이드에 따라 packages.json 파일의 섹션을 참조하십시오.
{
"name": "myapp",
"version": "0.0.1",
"engines": {
"node": "0.8.x",
"npm": "1.1.x"
}
}
이를 통해 개발/생산 패리티를 보장하고 향후 이러한 상황이 발생할 가능성을 줄일 수 있습니다.
저는 이 댓글을 남기고 가려고 했습니다.Heroku에서 Node.js 앱을 만들 때 Git에 "node_modules" 폴더를 체크인해야 합니까?
그런데 스택 오버플로가 이상하게 포맷하고 있었습니다.
동일한 시스템이 없고 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
변경된 파일이 없는지 확인합니다.
나는 그렇게 믿어요.npm install
운영 환경에서 실행하면 안 됩니다.잘못될 수 있는 몇 가지가 있습니다. npm 운영 중단, 새로운 종속성 다운로드(축소 포장이 이를 해결한 것으로 보입니다).
반면에 node_modules 폴더는 Git에 커밋되지 않아야 합니다.그들의 큰 크기와는 별개로, 그들을 포함한 커밋은 주의를 산만하게 할 수 있습니다.
.npm install
운영 환경과 유사한 CI 환경에서 실행해야 합니다.모든 테스트가 실행되고 모든 종속성을 포함하는 압축 릴리스 파일이 생성됩니다.
node_modules 폴더 커밋과 축소 래핑을 모두 사용하고 있습니다.두 가지 해결책 모두 저를 행복하게 하지 못했습니다.
요약: 커밋된 node_modules 폴더는 저장소에 너무 많은 노이즈를 추가합니다.그리고 shrinkwrap.json은 관리하기가 쉽지 않으며 몇 년 안에 일부 축소된 프로젝트가 구축될 것이라는 보장도 없습니다.
Mozilla가 프로젝트 중 하나를 위해 별도의 저장소를 사용하고 있다는 것을 알게 되었습니다. https://github.com/mozilla-b2g/gaia-node-modules
따라서 Node.js CLI 도구(https://github.com/bestander/npm-git-lock 에서 이 아이디어를 구현하는 데 오래 걸리지 않았습니다.
모든 빌드 직전에 다음을 추가합니다.
npm-git-lock --repo [git@bitbucket.org:your/dedicated/node_modules/git/repository.git]
패키지의 해시를 계산합니다.json 파일이며 원격 저장소에서 폴더 node_dll 컨텐츠를 체크아웃하거나, 이 패키지의 첫 번째 빌드인 경우.json 파일, 청소를 할 것입니다.npm install
원격 저장소에 결과를 푸시할 수 있습니다.
파일 패키지에 명시적으로 anpm 버전을 추가합니다.json("npm": "1.1.x")과 node_modules 폴더를 Git에 체크인하지 않는 것이 저를 위해 작동했습니다.
매번 패키지를 다운로드하기 때문에 배포 속도가 느릴 수 있지만 체크인할 때 패키지를 컴파일할 수 없습니다.헤로쿠는 내 로컬 박스에만 있는 파일을 찾고 있었습니다.
요약하자면.
- 배포하는 애플리케이션에 대해서는 node_modules만 체크인하고 유지 관리하는 재사용 가능 패키지는 체크인하지 않습니다.
- 컴파일된 종속성은 컴파일 대상이 아닌 원본을 체크인해야 하며 배포 시 $npm 재구축해야 합니다.
내가 가장 좋아하는 부분:
당신의 gitignore에 node_modules를 추가한 모든 사람들이여, 그 쓰레기를 제거하라, 오늘날, 그것은 우리 모두가 너무 기뻐서 남길 수 없는 시대의 인공물입니다.글로벌 모듈의 시대는 끝났습니다.
(원래 링크는 이 링크였지만 지금은 죽었습니다.@Flavio가 지적해 주셔서 감사합니다.)*
node_modules 폴더를 체크인하는 대신 패키지를 만듭니다.당신의 애플리케이션을 위한 json 파일.
패키지.json 파일은 응용 프로그램의 종속성을 지정합니다.그런 다음 Heroku는 npm에게 모든 종속성을 설치하라고 말할 수 있습니다.연결한 튜토리얼에는 패키지에 대한 섹션이 포함되어 있습니다.json 파일.
이 솔루션을 사용하고 있습니다.
node_modules 폴더를 포함하는 별도의 저장소를 만듭니다.특정 플랫폼용으로 구축해야 하는 네이티브 모듈이 있는 경우 각 플랫폼에 대해 별도의 리포지토리를 만듭니다.
다음을 사용하여 이러한 리포지토리를 프로젝트 리포지토리에 연결합니다.
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
node_modules
node_modules
및 렉토리및추가디node_modules
.gitignore
.려달을 합니다.
npm install
.하위 모듈 리포지토리 변경 사항을 커밋합니다.
프로젝트 리포지토리 변경사항을 커밋합니다.
쉽게 전환할 수 있습니다.node_modules
OS X에서 개발하고 Linux로 배포하는 경우 등 다양한 플랫폼에서 사용할 수 있습니다.
시나리오 1:
하나의 시나리오:
당신은 npm에서 제거된 패키지를 사용합니다.만약 당신이 node_modules 폴더에 모든 모듈을 가지고 있다면, 그것은 당신에게 문제가 되지 않을 것입니다.패키지에 패키지 이름만 있는 경우.제이슨, 당신은 더 이상 그것을 얻을 수 없습니다.
패키지가 24시간 미만이면 npm에서 쉽게 제거할 수 있습니다.24시간 이상 지난 제품이라면 연락을 주셔야 합니다.
그러나:
지원팀에 연락하면 해당 버전의 패키지를 제거하면 다른 설치가 중단되지 않는지 확인할 수 있습니다.그렇다면 제거하지 않을 것입니다.
가능성은 낮지만 시나리오 2는...
시나리오 2:
이에 해당하는 또 다른 시나리오:
소프트웨어의 엔터프라이즈 버전 또는 매우 중요한 소프트웨어를 개발하고 패키지에 기록합니다.json:
"dependencies": {
"studpid-package": "~1.0.1"
}
방법을 사용합니다.function1(x)
그 소포의.
이제 studpid-package의 개발자들은 메소드의 이름을 바꿉니다.function1(x)
로.function2(x)
그리고 그들은 잘못을 저지릅니다.그들은 패키지의 버전을 에서 변경합니다.1.0.1
로.1.1.0
그건 문제가 됩니다. 왜냐하면 당신이 전화할 때npm install
다음 번에, 당신은 버전을 받아들일 것입니다.1.1.0
당신이 타일을 사용했기 때문에 ("studpid-package": "~1.0.1"
).
부르기function1(x)
이제 오류와 문제를 일으킬 수 있습니다.
전체 node_modules 폴더(종종 100MB 이상)를 저장소로 푸시하면 메모리 공간이 손실됩니다.몇 kb(패키지).json만 해당)을 수백 MB(패키지)와 비교합니다.json & node_vmdk)...생각해 보세요.
다음과 같은 경우에 할 수 있습니다.
소프트웨어는 매우 중요합니다.
무언가가 실패할 때 돈이 듭니다.
당신은 npm 레지스트리를 신뢰하지 않습니다. npm은 중앙 집중화되어 있고 이론적으로 종료될 수 있습니다.
다음과 같은 경우 99.9%의 경우 node_modules 폴더를 게시할 필요가 없습니다.
당신은 당신 자신만을 위한 소프트웨어를 개발합니다.
당신은 무언가를 프로그래밍했고 다른 누군가가 그것에 관심을 가질 수 있기 때문에 단지 GitHub에 결과를 게시하고 있습니다.
node_modules를 저장소에 저장하지 않으려면 다음을 생성합니다..gitignore
줄을 정리하여 추가합니다.node_modules
.
응용프로그램별 모듈을 직접 롤링하는 경우 다음 중 하나를 수행할 수 있습니다.
애플리케이션의 데이터 저장소에 데이터 저장소(및 데이터 저장소)
/node_modules
다른 모든 종속성을 상위 항목으로 폴더 및 이동../node_modules
폴더를 누릅니다.이것은 NodeJS Common 방식 때문에 작동합니다.JS 모듈 시스템은 트리의 루트에 도달할 때까지 상위 디렉터리로 이동하는 방식으로 작동합니다.참조: https://nodejs.org/api/modules.html아니면 모두 무시하세요.
/node_modules/*
당신의 것을 제외하고는/node_modules/your-modules
참고 항목: .gitignore에서 일부 파일을 제외한 모든 파일을 무시하도록 설정
이 사용 사례는 매우 훌륭합니다.응용프로그램을 위해 특별히 만든 모듈을 잘 보관하고 나중에 설치할 수 있는 종속성을 복잡하게 만들지 않습니다.
언급URL : https://stackoverflow.com/questions/11459475/should-i-check-in-folder-node-modules-to-git-when-creating-a-node-js-app-on-he
'IT' 카테고리의 다른 글
Python panda: 데이터 프레임 행을 한 행씩 채우기 (0) | 2023.07.02 |
---|---|
프로젝트에서 엔티티 프레임워크의 최신 버전을 참조하고 있습니다... - 오류 (0) | 2023.07.02 |
MongoDB의 ObjectIds는 어떻게 생성됩니까? (0) | 2023.06.27 |
model.find()가 mongoose에서 비어 있음을 반환합니다. (0) | 2023.06.27 |
긴 줄에 gitdiff를 어떻게 사용해야 합니까? (0) | 2023.06.27 |