IT

Heroku에서 Node.js 앱을 만들 때 Git에 "node_modules" 폴더를 체크인해야 합니까?

itgroup 2023. 7. 2. 19:12
반응형

Heroku에서 Node.js 앱을 만들 때 Git에 "node_modules" 폴더를 체크인해야 합니까?

Heroku의 Node.js에 대한 기본 시작 지침을 따릅니다.

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

이러한 지침은 .gitignore node_modules를 생성하라는 것이 아니므로 node_modules 폴더가 Git에 체크인되어야 함을 의미합니다.Git 저장소에 node_modules를 포함시켰을 때 시작 응용 프로그램이 올바르게 실행되었습니다.

다음과 같은 고급 예를 따를 때:

.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 축소 랩을 사용하여 전체 종속성 트리를 잠가야 합니다.

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

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에 체크인하지 않는 것이 저를 위해 작동했습니다.

매번 패키지를 다운로드하기 때문에 배포 속도가 느릴 수 있지만 체크인할 때 패키지를 컴파일할 수 없습니다.헤로쿠는 내 로컬 박스에만 있는 파일을 찾고 있었습니다.

Git의 "node_modules"에서:

요약하자면.

  • 배포하는 애플리케이션에 대해서는 node_modules만 체크인하고 유지 관리하는 재사용 가능 패키지는 체크인하지 않습니다.
  • 컴파일된 종속성은 컴파일 대상이 아닌 원본을 체크인해야 하며 배포 시 $npm 재구축해야 합니다.

내가 가장 좋아하는 부분:

당신의 gitignore에 node_modules를 추가한 모든 사람들이여, 쓰레기를 제거하라, 오늘날, 그것은 우리 모두가 너무 기뻐서 남길 수 없는 시대의 인공물입니다.글로벌 모듈의 시대는 끝났습니다.

(원래 링크는 이 링크였지만 지금은 죽었습니다.@Flavio가 지적해 주셔서 감사합니다.)*

node_modules 폴더를 체크인하는 대신 패키지를 만듭니다.당신의 애플리케이션을 위한 json 파일.

패키지.json 파일은 응용 프로그램의 종속성을 지정합니다.그런 다음 Heroku는 npm에게 모든 종속성을 설치하라고 말할 수 있습니다.연결한 튜토리얼에는 패키지에 대한 섹션이 포함되어 있습니다.json 파일.

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

  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

  3. node_modulesnode_modules 및 렉토리및추가디node_modules.gitignore.

  4. 려달을 합니다.npm install.

  5. 하위 모듈 리포지토리 변경 사항을 커밋합니다.

  6. 프로젝트 리포지토리 변경사항을 커밋합니다.

쉽게 전환할 수 있습니다.node_modulesOS 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

반응형