-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
132 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,108 @@ | ||
--- | ||
title: npm install과 npm ci 명령어 알아보기 | ||
description: npm 패키지를 설치할때 대표적으로 사용되는 두 명령어를 알아보겠습니다. | ||
category: npm | ||
createdAt: 2023-11-08 | ||
thumbnail: https://github.com/yiyb0603/yiyb-blog/assets/50941453/81ec58db-916b-429a-b38f-50e55367e7aa | ||
--- | ||
|
||
안녕하세요! 오늘은 npm 패키지를 설치할 때 많이 사용되는 두가지 명령어, `npm install`과 `npm ci`란 무엇이고, 차이점은 무엇인지 알아보겠습니다. | ||
|
||
## 1. npm install ⚒️ | ||
|
||
`npm install` 명령어는 npm 패키지를 설치하기 위해서 가장 많이 사용되는 명령어입니다. 별칭 `npm i`를 사용해도 동일하게 작동합니다. | ||
|
||
<br /> | ||
|
||
`npm install`을 사용할 수 있는 방법은 대표적으로 두가지가 있습니다. | ||
|
||
첫번째는, `npm install` 명령어 뒤에 설치하려는 `패키지명`을 넣어서 곧바로 패키지를 설치하는 방법입니다. **프로젝트가 진행 중**일때는 해당 방법으로 가장 많이 패키지를 설치하기도 합니다. | ||
|
||
```shell | ||
npm install react // react 패키지 설치 | ||
``` | ||
|
||
두번째는, `package.json`에 명시된 모든 패키지를 설치하려고 할때 인데요. 예를들어 React.js로 만들어진 프로젝트를 GitHub에서 clone 하고나서 에디터를 열면, 해당 프로젝트에서 사용되는 패키지들을 모두 다운로드 해야하는 경우가 생깁니다. | ||
|
||
이때 `npm install` 명령어를 치면, 해당 명령어가 실행된 프로젝트의 `package.json` 파일에 명시된 모든 npm 패키지를 설치해줍니다. 내가 사용하려는 패키지 명과 버전이 `package.json`에 명시된 경우에는 이 방법을 많이 사용합니다. | ||
|
||
```shell | ||
npm install | ||
``` | ||
|
||
### 1-1. package-lock.json | ||
|
||
> 읽기 전에 패키지 버저닝 방법들인 **틸드와 캐럿**에 대해서 알고 계시면 좋습니다. | ||
> https://yiyb-blog.vercel.app/posts/npm-tilde-carrot | ||
만약 `package.json` 파일에 명시된 패키지가 틸드와 캐럿을 사용한 버저닝을 사용했을때 패키지를 로컬에서 설치할때마다 각기 다른 버전이 설치될 수 있는 문제가 있는데요. 특히 협업에서 이런 문제가 많이 발생합니다. | ||
|
||
```json | ||
{ | ||
"dependencies": { | ||
"next": "^12.2.0" | ||
} | ||
} | ||
``` | ||
|
||
위처럼 캐럿을 통해 명시된 버전이 있을때, A 개발자는 `12.2.0`, B 개발자는 `12.2.1`, C 개발자는 `12.3.0` 등 각기 다른 버전이 설치되어 예기치 않은 오류를 발생시킬 수 있습니다. | ||
|
||
<br /> | ||
|
||
이처럼 버전이 다르게 설치되지 않도록 해주는 파일이 바로 `package-lock.json` 입니다. `package-lock.json`은 캐럿, 틸드 버저닝의 패키지를 설치할때, 범위 내에서 정확하게 어떤 버전의 패키지를 설치할지 명시해주는 역할을 합니다. | ||
|
||
<br /> | ||
|
||
만약 `package-lock.json`을 소유한 프로젝트에서는 이제 모든 사람이 동일한 버전의 패키지를 설치하며, 위처럼 버전이 각기 다르게 설치되는 현상을 없앨 수 있습니다. | ||
|
||
```txt | ||
styled-components@^5.3.6: | ||
version "5.3.6" // ^5.3.6으로 지정된 버전은 5.3.6으로 설치 | ||
react@^17.0.2: | ||
version "17.0.2" // ^17.0.2으로 지정된 버전은 17.0.2으로 설치 | ||
``` | ||
|
||
npm, yarn, pnpm에서 사용할 수 있는 lock 파일명은 아래와 같습니다. | ||
|
||
| 패키지 매니저 | lock 파일명 | | ||
| ------------- | ----------------- | | ||
| npm | package-lock.json | | ||
| yarn | yarn.lock | | ||
| pnpm | pnpm-lock.yaml | | ||
|
||
## 2. npm ci 🧼 | ||
|
||
`npm ci`는 **clean install**의 줄임말로, `npm install`과 유사한 패키지 설치 명령어지만 조금의 차이가 있습니다. | ||
|
||
<br /> | ||
|
||
`npm ci`는 `package-lock.json` 파일을 필요로 하며 **(없을경우 오류 발생)** `package.json`과 버전이 매칭되는지 검사하여 `package-lock.json` 파일을 기반으로 패키지들을 설치합니다. | ||
|
||
> 한번에 프로젝트의 모든 의존성을 설치하는 역할이므로, 패키지 개별적으로 사용하는 것은 불가능합니다. | ||
<br /> | ||
|
||
**패키지 버전 범위에서 설치해야하는 버전을 알아내는 연산이 있는 `npm install`과 비교해서 해당 연산이 없기때문에 더 빠른 속도로 설치가 가능**합니다. 그렇기에 Jenkins, GitHub Actions와 같은 `CI 환경`에서 해당 명령어를 사용하면 시간을 단축시킬 수 있을것 같습니다. | ||
|
||
<br /> | ||
|
||
그리고 항상 이전의 `node_modules`를 삭제 후 재설치 한다는 특징이 있는데요. 이는 일관성 있는 패키지 설치 환경을 보장하고, 깨끗한 상태에서 시작합니다. | ||
|
||
<br /> | ||
|
||
npm, yarn, pnpm에서 사용할 수 있는 ci 명령어는 아래와 같습니다. | ||
|
||
| 패키지 매니저 | lock 파일명 | | ||
| ------------- | ------------------------------ | | ||
| npm | npm ci | | ||
| yarn | yarn install --frozon-lockfile | | ||
| pnpm | pnpm install --frozon-lockfile | | ||
|
||
## 3. 마치며 📌 | ||
|
||
오늘은 `npm install`, `npm ci`란 무엇이고, 차이점에 대해서 간단하게 알아보았는데요. 처음엔 `npm ci`라는 명령어가 낯설게 느껴졌는데, 자세히 알아보니 기존의 CI 성능에 도움이 되는 좋은 명령어였네요. | ||
|
||
<br /> | ||
|
||
많은분들이 이 글을 보고 도움이 되었다면 좋겠습니다. 이상으로 글을 마치겠습니다. 감사합니다! |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters