개발자인 친구랑 이야기를 하다가 npm , yarn을 이용하여 패키지를 설치할때 생성되는
package.json
,package-lock.json
파일에 대해 질문을 듣고 이참에 정리하고 알아보는 시간을 가져보려고 합니다.
패키지 매니저는 소프트웨어 개발 프로젝트에서 필요한 패키지(라이브러리, 모듈 등)를 관리하고 설치하는 도구를 말합니다.
대표적인 패키지 매니저로는 Node.js의 npm(Node Package Manager), Python의 pip, Ruby의 RubyGems 등이 있고 해당 포스팅에서는 Node.js 기준으로 작성을 해보려고합니다.
출처: npm doc
npm doc 에서 설명하고 있는 package.json
문서의 한부분이다. 위의 영문을 번역하면..
패키지에 package.json 파일을 추가하여 다른 사용자가 쉽게 관리하고 설치할 수 있도록 할 수 있습니다. 레지스트리에 발행된 패키지는 반드시 package.json 파일을 포함해야 합니다.
package.json 파일은 다음을 수행합니다.
참고: 패키지를 npm 웹사이트에서 쉽게 찾을 수 있게 만들기 위해, package.json 파일에 사용자 정의 설명을 포함하는 것을 권장합니다.
GPT를 이용하여서 package.json 에 대하여 설명을 해달라고 했을때 아래와 같이 답변한 것도 같이 참고해보았다.
즉, npm에서 오픈소스(패키지)를 설치하기 위해 사용하거나, 프로젝트의 의존성 관리를 하거나,배포를 위한 파일이구나라는 결론을 지어보았다.
npm init -y
을 통해 package.json을 생성할 수 있다.
{
"name": "my-project",
"version": "1.0.0",
"description": "My project description",
"main": "index.js",
"scripts": {
"start": "node index.js",
"test": "mocha"
}
"dependencies": {
"express": "^4.17.1",
"lodash": "^4.17.21"
},
"devDependencies": {
"eslint": "^7.32.0",
"mocha": "^9.0.0"
}
"keywords": [],
"author": "",
"license": "MIT",
"repository": {
"type": "git",
"url": "https://github.com/username/my-project.git"
}
}
package.json
파일은 Node.js 프로젝트의 루트 디렉토리에 위치하며, 프로젝트의 구성과 의존성을 기술하는 JSON 형식의 파일이다.
name
version
semantic versioning guidelines
를 따르며, x.x.x의 형태로 작성해야한다.description
main
scripts
다른 개발자분의 블로그를 참고하여, 예시를 가져와 보았다.
facebook/create-react-app/package.json
{
"scripts": {
"build": "cd packages/react-scripts && node bin/react-scripts.js build",
"changelog": "lerna-changelog",
"create-react-app": "node tasks/cra.js",
"e2e": "tasks/e2e-simple.sh",
"e2e:docker": "tasks/local-test.sh",
"postinstall": "npm run build:prod -w react-error-overlay",
"publish": "tasks/publish.sh",
"start": "cd packages/react-scripts && node bin/react-scripts.js start"
// ...
}
}
value로 일련의 command(명령어)를 정의해 두고 key로 지정한 alias를 이용해 간편하게 호출 할 수 있다.
ex) npm start , npm create-react-app ..
dependencies
및 evDependencies
버전을 작성할때는 Semantic Versioning (SemVer)규칙에 기반하여 작성한다.
Semantic Versioning (SemVer) 은 나중에 정리를 해보려고 한다..
license
repository
package-lock.json
파일은 npm 버전 5부터 사용되기 시작한 파일로, 의존성 트리를 정확하게 기록합니다.package-lock.json
파일은 패키지 매니저가 패키지를 설치할 때, 각 패키지의 정확한 버전과 의존성을 고정시켜주는 역할을 합니다.package-lock.json
파일이 있다면 정확한 의존성 버전을 사용하여 설치하게 됩니다.자료를 찾아서 정리를 해보니 위와 같았지만 크게 와닿진 않았다..
자료를 찾던 중 예시를 통해 설명해주는 글을 보았다.
예시와 함께보니 나도 비슷하게 개발중인 프로젝트에서 package를 추가하고, package.json 만 커밋했던 기억이났었는데 이제야 이유를 알았다는 것이 놀라웠다....
package-lock.json
은 npm install
명령어를 사용하여 패키지를 설치할때 생성된다.
{
"name": "my-project",
"version": "1.0.0",
"lockfileVersion": 1,
"dependencies": {
"express": {
"version": "4.17.1",
"resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
"integrity": "sha512-...",
"dev": true,
"dependencies": {
// Express 패키지의 의존성 정보
}
},
"lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-...",
"dev": true
},
// 다른 패키지들의 의존성 정보
}
}
lockfileVersion
package-lock.json
파일의 버전을 나타냅니다. 현재는 1이 가장 일반적으로 사용되고 있다requires
package-lock.json
파일이 생성된 npm 버전을 나타냅니다.dependencies
"dependencies": {
"express": {
"version": "4.17.1",
"resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
"integrity": "sha512-...",
"dev": true,
"dependencies": {
// Express 패키지의 의존성 정보
}
},
"lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-...",
"dev": true
},
}
version
: 패키지의 정확한 버전을 나타냅니다.resolved
: 패키지가 실제로 위치한 경로 또는 URL입니다.integrity
: 패키지의 무결성 체크를 위한 해시값입니다.dev
: 패키지가 dependencies
또는 devDependencies
에 속하는지 여부를 나타냅니다.dependencies
: 패키지의 의존성 정보가 있을 경우, 해당 의존성 정보도 포함됩니다.결론:
package.json
은 패키지 설치, 배포, 의존성 등에 대한 정보를 가지고 있으며,package-lock.json
은 패키지의 정확한 버전과 의존성 트리를 정확하게 기록한 파일이다 !