라이브러리나 프레임워크를 사용하다보면 모듈을 자주 깔게 된다. 예를 들어 리액트를 사용할때면 yarn create react-app <project_name>
이런 식으로 사용하곤 한다.
그런데 가끔 보면 cli 명령문 뒤에 -D
와같이 다양한 옵션이 붙는 경우가 있다. 이게 무엇일까? 나는 이에 대해 궁금했고 공부 후 정리해보고자 글을 쓰게 됐다.
yarn 은 페이스북이 만든 javascirpt 의 package manager 이다.
npm은 yarn에 비해 성능이 떨어지고 보안 이슈, 의존 패키지의 버저닝 이슈 등이 있어 yarn을 자주 쓴다.
버저닝 이슈는 예를 들면 로컬에서 특정 패키지의 버전이 1.0.0인데 배포를 위한 빌드 서버에서는 시점에 따라 1.0.3으로 업데이트 될 수도 있음을 뜻한다.
속도 차이 참고 링크
yarn으로 프로젝트를 하다보면 루트 디렉토리에 yarn.lock
이란 파일이 생기는데(npm인 경우 package-lock.json
) 매번 이게 무엇을 하는 파일인지 궁금했다. 그래서 이번 기회에 간단하게 무엇인지 알아봤다.
예를 들어 프로젝트를 개발자 두명이서 진행하는데 서로 react 버전이 다르다면
A: 16.13.0
B: 16.13.1
위와 같이 설치 버전이 다를수 있다. 만약 이렇게 된다면 A는 제대로 작동하지만 B는 작동이 안되는 경우가 발생할 수 있다. 이러한 상황은 패키지 매니저에서 패키지 잠금이 지원되지 않던 시절에 문제가 됐으며 이것을 해결하기 위한 패키지 잠금이 나타났다.
package-lock.json
이나 yarn.lock
과 같은 패키지 잠금 파일에는 프로젝트에 패키지에 최초로 추가될 당시에 정확히 어떤 버전이 설치가 되었는지 기록한다.
앞으로 나올 Yarn Command와 CLI option들은 전체를 다루지 않았으며
내가 지금까지 한번은 봤던 것들로만 이루어져 있다.
Yarn-CLI 공식 문서를 참고했다.
각 command별로 option을 정리하겠다.
yarn
뒤에 다른 명령어 없이 실행하게되면 기본적으로yarn install
이 실행된다.
yarn <script> [<args>]
는 사용자가 정의한 스크립트를 실행한다. 아래 yarn run에서 자세히 설명하겠다.
틸드(~): 버전의 마지막 자리의 범위에서만 자동으로 업데이트한다.
ex)
~0.0.1: >=0.0.1 and <0.1.0
~0.1.1: >=0.1.1 and <0.2.0
캐럿(^)을 설명하기 전에 먼저 Semantic Versioning(보통 SemVer라고 부른다.)를 설명해야 하는데 Node.js와 npm의 모듈은 모두 SemVer를 따른다. SemVer는 MAJOR.MINOR.PATCH의 버저닝을 따르는데 각 의미는 다음과 같다.
- MAJOR version when you make incompatible API changes,
- MINOR version when you add functionality in a backwards-compatible manner, and
- PATCH version when you make backwards-compatible bug fixes.
즉, MAJOR 버전은 API의 호환성이 깨질만한 변경사항을 의미하고 MINOR 버전은 하위호환성을 지키면서 기능이 추가된 것을 의미하고 PATCH 버전은 하위호환성을 지키는 범위내에서 버그가 수정된 것을 의미한다.
캐럿(^): Node.js 모듈이 이 SemVer의 규약을 따른다는 것을 신뢰한다는 가정하에서 동작한다. 그래서 MINOR나 PATCH버전은 하위호환성이 보장되어야 하므로 업데이트를 할수 있다.
ex)
^1.0.2 >=1.0.2 and <2.0
^1.0 >=1.0.0 and <2.0
^1 >=1.0.0 and <2.0
package를 다운받을때 사용하는 명령어이다.
- yarn add <package...>: dependencies에 추가한다.
- yarn add <package...> [--dev/-D]: devDependencies에 추가한다.
yarn global <add/bin/list/remove/upgrade> [--prefix]:
패키지를 시스템 전역에서 설치, 업데이트, 삭제한다.
--prefix옵션이 패지키가 설치되는 경로를 지정하는것 같다.
yarn create < starter-kit-package > [< args >]:
create starter kits
을 이용해 프로젝트를 설치한다.
yarn create react-app my-app --template typescript
와 같이 --template이 옵션인것 같다.공식문서에서 아래와 같이 CRA를 똑같이 할수 있다고 한다.
$ yarn global add create-react-app
$ create-react-app my-app
yarn init
:package.json
을 생성한다.
yarn init --yes/-y
뒤에 옵션은package.json
을 설정하는 질문을 모두 default로 넘어간다.
yarn install
:pcakgae.json
의 의존성 모듈을 설치한다.
이때yarn.lock
도 같이 생긴다..
package.json
{
"name": "my-package",
"scripts": {
"build": "babel src -d lib",
"test": "jest"
}
}
위와 같은 package.json
이 있을때
yarn run [script][<args>]: scripts에 있는 스크립트를 실행 가능하다.
yarn run test
와 같이 가능하다.
yarn run test -o --watch
처럼 스크립트 뒤에 옵션을 달아줄 경우jest -o --watch
처럼 스크립트에 대응하는 명령문 뒤에 옵션이 붙는다.
yarn test -o --watch
와 같이 run은 생략이 가능하다.
+) --watch 옵션은 jest의 CLI옵션으로 파일이 변경되면 다시 테스트를 진행하는것 같다.
+) -o 옵션또한 jest의 CLI옵션으로 --onlyChanged의 별칭이고 프로젝트에서 변경된 파일을 기준으로 테스트를 하는것 같다. 깃헙이나 Mercurial프로젝트만 가능하다고 한다.
yarn upgrade [package | package@tag | package@version | --scope @scope]... [--ignore-engines] [--pattern]
:
package.json
에 명시된 범위내에서 패키지의 버젼을 최신으로업그레이드 해주는 기능이다.
yarn upgrade --latest
: --latest옵션은 upgrade처럼 작동하지만package.json
의 범위가 아닌 최신버전으로 설치가 된다.
yarn upgrade left-pad@^1.0.0
이와 같이 직접 버젼을 설정해줄수도 있다.
오늘은 내가 궁금했던 CLI 옵션들을 공식문서를 읽으면서 정리해봤다. 그런데 내 의도와는 다르게 옵션들보다 yarn의 명령어를 더 정리한것 같다. 그래도 나름대로 옵션들에 대해 알수 있어서 만족한다.
오늘 내가 정리한a것은 yarn의 간의 기별만도 못한것 같다. 공식문서에 나와있는걸 보면 다양한 명령어들과 옵션들이 나와있다.
앞으로 개발을 하면서 더 많은 Command, CLI option들을 마주하게 될것이고 그때 마다 내 머릿속으로 집어 넣을 것이다.