package.json / package-lock.json 알고 사용하자 !

DONG EUN LEE·2023년 11월 27일
0

npm

목록 보기
1/1
post-thumbnail

개발자인 친구랑 이야기를 하다가 npm , yarn을 이용하여 패키지를 설치할때 생성되는 package.json , package-lock.json 파일에 대해 질문을 듣고 이참에 정리하고 알아보는 시간을 가져보려고 합니다.

Package Manager란 ?

  • 패키지 매니저는 소프트웨어 개발 프로젝트에서 필요한 패키지(라이브러리, 모듈 등)를 관리하고 설치하는 도구를 말합니다.

  • 대표적인 패키지 매니저로는 Node.js의 npm(Node Package Manager), Python의 pip, Ruby의 RubyGems 등이 있고 해당 포스팅에서는 Node.js 기준으로 작성을 해보려고합니다.


Package.json 이란 무엇일까?


출처: npm doc
npm doc 에서 설명하고 있는 package.json문서의 한부분이다. 위의 영문을 번역하면..

패키지에 package.json 파일을 추가하여 다른 사용자가 쉽게 관리하고 설치할 수 있도록 할 수 있습니다. 레지스트리에 발행된 패키지는 반드시 package.json 파일을 포함해야 합니다.

package.json 파일은 다음을 수행합니다.

  • 프로젝트가 의존하는 패키지 목록을 나열합니다.
  • 시맨틱 버전 규칙을 사용하여 프로젝트가 사용할 수 있는 패키지 버전을 지정합니다.
  • 빌드를 재현 가능하게 하여, 다른 개발자들과 쉽게 공유할 수 있습니다.

참고: 패키지를 npm 웹사이트에서 쉽게 찾을 수 있게 만들기 위해, package.json 파일에 사용자 정의 설명을 포함하는 것을 권장합니다.

GPT를 이용하여서 package.json 에 대하여 설명을 해달라고 했을때 아래와 같이 답변한 것도 같이 참고해보았다.

  • package.json 파일은 프로젝트의 메타데이터 및 종속성(dependency) 정보를 담고 있는 파일입니다.
  • 프로젝트 정보(프로젝트명, 버전, 설명 등)와 함께 필요한 패키지의 목록과 버전 정보가 기록됩니다.
  • 이 파일을 통해 프로젝트의 종속성을 다른 개발자와 공유하고, 프로젝트를 배포하거나 다시 설치할 때 사용됩니다.

즉, npm에서 오픈소스(패키지)를 설치하기 위해 사용하거나, 프로젝트의 의존성 관리를 하거나,배포를 위한 파일이구나라는 결론을 지어보았다.


package.json 구성요소 및 구조

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

  • 프로젝트의 진입점(main entry point)을 지정한다.

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 ..

출처:알고쓰자 package.json

dependenciesevDependencies

  • 프로젝트가 의존하는 패키지와 그 버전을 나타냅니다
  • dependencies: 프로젝트가 실행될 때 필요한 핵심 의존성
  • devDependencies: 개발 중에만 필요한 의존성

버전을 작성할때는 Semantic Versioning (SemVer)규칙에 기반하여 작성한다.
Semantic Versioning (SemVer) 은 나중에 정리를 해보려고 한다..

license

  • 프로젝트에 적용된 라이선스를 나타낸다

repository

  • 프로젝트의 소스 코드 저장소를 지정한다

package.json 작성규칙

  • must be lowercase, 소문자로 작성되어야 한다.
  • must be one word, 한 단어로 작성되어야 한다.
  • may contain hyphens and underscore, -(하이픈)이나 _(언더스코어)를 포함할 수 있다.

Package-lock.json 이란 무엇일까?

  • package-lock.json 파일은 npm 버전 5부터 사용되기 시작한 파일로, 의존성 트리를 정확하게 기록합니다.
  • package-lock.json 파일은 패키지 매니저가 패키지를 설치할 때, 각 패키지의 정확한 버전과 의존성을 고정시켜주는 역할을 합니다.
  • 다른 환경이나 다른 개발자가 동일한 패키지를 설치할 때, package-lock.json 파일이 있다면 정확한 의존성 버전을 사용하여 설치하게 됩니다.

자료를 찾아서 정리를 해보니 위와 같았지만 크게 와닿진 않았다..
자료를 찾던 중 예시를 통해 설명해주는 글을 보았다.

예시와 함께보니 나도 비슷하게 개발중인 프로젝트에서 package를 추가하고, package.json 만 커밋했던 기억이났었는데 이제야 이유를 알았다는 것이 놀라웠다....

package-lock.json 구성요소 및 구조

package-lock.jsonnpm 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은 패키지의 정확한 버전과 의존성 트리를 정확하게 기록한 파일이다 !

0개의 댓글