최근 npm을 하나 만들면서 npmignore에 대해 궁금중이 생겼습니다.
.npmignore은 package에 포함되지 않을 내용을 지정할 수 있습니다.
.npmignore이 존재하지 않을시에는 .gitignore의 내용을 패키지에 포함 시키지 않습니다.
제가 겪었던 상황은 다음과 같습니다.
.npmignore에 추가했지만 npm으로 배포를 했을때 npmignore의 내용들이 포함이 되어서 배포가 되었습니다.
제가 내린 결론은 다음과 같습니다. (공식적인 정답은 찾지 못하였습니다)
공식문서에서의 내용
package.json의 files에 포함된 파일들은 .npmignore와 .gitignore로 인해 제외될수 없습니다.
1. package.json에 있는 entry_point들의 내용들과 files의 리스트에 포함된 내용은 npmignore에 포함되어 있더라도 배포 됩니다.
(main, bin, files에 포함된 파일들)
2. npmignore에 있는 내용들은 entry_point내에 존재하지 않아야만 배포되지 않습니다.
여기서 entry_point는 실행파일 + files에 포함된 파일들로 정의하겠습니다.
실행파일은 main에 정의된 실행파일과 bin내에 포함된 실행파일입니다.
테스트 해보았던 경우들에 대해 사진과 함께 설명하겠습니다.
테스트는 npm pack 명령어를 통해 확인하였습니다.
npm pack을 입력하면 패키지의 압축파일(tarball => .tar, .tgz 압축파일)을 생성해줍니다.
이 압축파일이 우리가 npm을 다운받았을때 다운받아지는 파일 입니다.
파일의 구조는 이미지로 첨부하겠습니다.
1. entry_point에 추가 x, npmignore에 추가 x
=> 아무것도 포함하지 않았기 때문에 전체가 압축되는 것을 확인할 수 있습니다
2. entry_point에 추가 x, npmignore에 추가 o
=> npmignore에 포함된 내용들이 압축되지 않은것을 확인할 수 있습니다.
3. entry_point에 추가 o, npmignore에 추가 x => 1번의 경우와 동일
4. entry_point에 추가 o, npmignore에 추가 o
=> npmignore에 포함되어있지만 files에서 해당 폴더들을 참조하고 있어 같이 압축된 것을 확인할 수 있습니다
=> src 폴더는 같이 압축되지 않은것을 확인할 수 있습니다. entry_point에 포함되어 있지 않아 npmignore로 인해 포함되지 않은것을 확인할 수 있습니다.
=> entry_point의 main에서는 dist폴더를 bin에서는 src폴더를 참조하고 있어 두 개의 폴더가 같이 압축된 것을 확인할 수 있습니다.
아래는 npm 문서에서 ignore에 대한 설명이 나와있는 부분을 번역한 내용입니다.
Keeping files out of your Package
패키지 외부에 파일을 관리하기위해 .npmignore 파일을 사용하세요. 만약 .npmignore 파일이 없고 .gitignore 파일이 있다면 npm은 .gitignore 파일에 있는 것들을 무시할것입니다. .gitignore 파일로 인해 제외된 것들중 일부를 포함하고 싶다면 빈 .npmignore 파일을 만들고 override 할수 있습니다. git과 같이 npm은 root directory 뿐만 아니라 패키지의 모든 하위 디렉토리들에서 .npmignore과 .gitignore파일들을 찾습니다.
.npmignore 파일들은 .gitignore 파일들과 같은 규칙을 따릅니다 :
- 빈 줄과 #으로 시작하는 줄은 무시됩니다(주석 같은 의미)
- glob 패턴을 따릅니다.
- 패턴을 /로 끝내서 디렉토리를 지정할 수 있습니다.
- !로 시작하여 패턴을 부정할수 있습니다.
기본적으로 아래의 경로와 파일들은 무시됩니다. .npmignore에 포함할 필요가 없습니다 :
- .*.swp
- ._*
- .DS_Store
- .git
- .gitignore
- .hg
- .npmignore
- .npmrc
- .lock-wscript
- .svn
- .wafpickle-*
- config.gypi
- CVS
- npm-debug.log
추가적으로 node_modules에 있는 번들 의존성을 제외한 모든것들은 무시되어집니다. npm은 자동적으로 이것들을 다루어서 .npmignore에 node_modules를 포함시키지 않아도 됩니다.
아래의 경로와 파일들은 절대 무시되지 않습니다. .npmignore에 포함시키는 것은 무의미한 일입니다 :
- package.json
- README (and its variants)
- CHANGELOG (and its variants)
- LICENSE / LICENCE
프로젝트의 구조에 따라 .npmignore를 유지하는 것이 골치아플경우 package.json의 files 속성을 추가하는것이 좋을수도 있습니다.
files 속성은 패키지에 포함되어야 하는 file과 directory들의 이름으로 구성된 배열입니다. 금지 리스트를 다루는 것보다 어떤것이 허가되는지 직접 선택하는 것이 쉬울수도 있습니다.
Testing whether your .npmignore or files config works
배포되었을때 어떤 파일들이 추가되는지 점검하고 싶다면 배포 방식과 같이 작업 폴더에 tarball 압축파일을 생성하는 npm pack 명령어를 통해 개발 환경에서 확인할수 있습니다.
files
optional files는 패키지가 의존성으로서 설치되었을때 포함되어야 하는 file 패턴들의 배열입니다. 파일 패턴들은 .gitignore의 문법과 유사한 문법을 따르지만 파일, 폴더, glob 패턴을 포함하여 pack되었을때 tarball에 파일들이 포함되도록 만들어 줍니다.
file은 기본값은 모든 파일들을 포함하는 "*"입니다. 몇몇 특별한 파일들과 폴더들은 file 배열에 존재하는것과 상관없이 포함되거나 제외됩니다.
.npmignore파일을 패키지의 root나 서브폴더에서 제공해줌으로써 file들이 포함되어 지는것을 방지할 수 있습니다. 패키지의 root에서는 files를 override 하지 않지만 서브폴더 에서는 override 됩니다. .npmignore 파일은 .gitignore와 같이 동작합니다. 만약 .gitignore파일이 있고 .npmignore파일이 없다면 .gitignore내의 내용들이 대신 사용됩니다.
package.json의 files에 포함된 파일들은 .npmignore와 .gitignore로 인해 제외될수 없습니다.
특정 파일들은 설정과 상관없이 항상 포함됩니다.
- package.json
- README
- LICENSE / LICENCE
- The file in the "main" field
README & LICENSE 는 어떤 확장자든 가질수 있습니다.
반대로 몇몇 파일들은 무조건 무시됩니다. :
- .git
- CVS
- .svn
- .hg
- .lock-wscript
- .wafpickle-N
- .*.swp
- .DS_Store
- ._*
- npm-debug.log
- .npmrc
- node_modules
- config.gypi
- *.orig
- package-lock.json (use npm-shrinkwrap.json if you wish it to be published)
'Node' 카테고리의 다른 글
nestjs 의존성 주입, 싱글턴 패턴 (0) | 2022.02.28 |
---|---|
npm 만드는 법 && 출시 (0) | 2022.02.07 |
algorithm-cli 생성기 (0) | 2022.02.07 |
console.log vs process.stdout.write (0) | 2022.01.26 |
서버 기본 세팅 (0) | 2022.01.03 |