[ 살펴보기 ] PNPM - Commands Line Interface
![[ 살펴보기 ] PNPM - Commands Line Interface](https://cdn.hashnode.com/res/hashnode/image/upload/v1729242996573/f9e543cf-377d-4ce2-b5b8-0b150569257e.jpeg)
PNPM이 제공하는 Command Line Interface는 NPM의 Command Line Interface와 크게 다르지 않다. 목적별 사용할 수 있는 PNPM CLI를 살펴보자.
pnpm add
Pacakge를 설치할 때 사용한다. npm에선 install command를 통해 package를 설치하듯 pnpm에서는 add command를 통해 package를 설치한다.
pnpm add @tanstack/react-query
- @tanstack/react-query를 dependency로 설치한다.
pnpm add -D @tanstack/react-query
- @tanstack/react-query를 dev dependency로 설치한다.
pnpm add -O @tanstack/react-query
- @tanstack/react-query를 optional dependency로 설치한다.
add command를 통해 package를 설치하면 default registry인 npm registry로부터 package를 설치한다.
만약 workspace안에서 add command를 실행하면 같은 workspace내 다른 project가 해당 package를 사용하고 있는지 체크하며 사용하고 있다면 이미 사용되고 있는 package의 허용 range안에서 package가 설치된다.
함께 사용할 수 있는 option은 다음과 같다.
-g 또는 --global: package를 global level로 설치한다.-D 또는 --save-dev: package를 devDependencies로 설치한다.-O 또는 --save-optional: package를 optionalDependencies로 추가한다.-E 또는 --save-exact: package를 설치할 때 semver range에 해당하는 version이 아닌 정확한 version을 설치한다.--save-peer: package를 peerDependencies에 추가하고 devDependencies로 설치한다.
pnpm install
package.json에 정의되어 있는 모든 project dependencies를 설치한다. node_modules 폴더가 없을 때 npm install을 실행하는 것과 같은 역할을 한다.
pnpm install
함께 사용할 수 있는 option은 다음과 같다.
--offline: package를 설치할 때 offline 모드로 설치한다. 즉, local에 존재하는 global store로 부터 package를 설치한다.--frozen-lockfile: install을 실행할 때 pacakge.json에 정의된 package version과 pnpm-lock.yaml에 정의된 package version의 차이가 있으면 command 실행에 실패한다. install을 실행할 때 pnpm-lock.yaml 파일이 없어도 command 실행에 실패한다.--lockfile-only: pnpm-lock.yaml의 package version 정보를 package.json이 package version 정보에 맞게 업데이트한다.--prod: prod option을 통해 production 환경에서 install을 실행하는지 여부를 정의할 수 있다. production 환경에서 install을 실행하면 devDependencies에 정의된 package를 설치되지 않는다. prod option을 별개로 설정하지 않으면 환경변수 NODE_ENV 값에 따르며 NODE_ENV가 production일 때는 true로 production이 아닐때는 false가 default로 적용된다. prod option을 사용하며 NODE_ENV 값이 아닌 prod option에 전달한 값이 사용된다.
pnpm update
Package.json에 정의된 pacakge의 허용된 version range에서 가장 최근 version으로 업데이트 한다.
pnpm update @tanstack/react-query
만약 package.json에 다음과 같이 package가 정의되어 있다면
"dependencies": {
"@tanstack/react-query": "~5.8.2"
},
pnpm update @tanstack/react-query명령어를 실행하면 ~ ( Tilde ) range rule에 따라 minor veriosn은 변하지 않으며 patch version중 가장 최근 package인 5.8.9 version으로 update된다.
만약 update command 뒤에 특정 package를 정의하지 않으면 package.json의 모든 package가 정의된 range에서 허용된 최신 version으로 update된다.
만약 package.json에 설정된 range rule을 무시하고 latest tag를 가진 package version으로 update를 하고자 한다면 --latest option을 추가로 전달해준다.
pnpm remove
project에서 사용하고 있는 package를 삭제한다. npm의 uninstall과 같은 역할을 한다.
pnpm remove @tanstack/react-query
pnpm link
현재 작업중인 project의 package를 다른 project에서도 사용할 수 있도록 link를 생성한다. 만약 현재 /test라는 directroy에서 작업하고 있는 상태에서 pnpm link --dir ../hotel라고 명령어를 실행하면 hotel project의 node_modules에 현재 작업중인 test package에 대한 link가 형성된다.
만약 현재 project의 node_modules에 다른 package에 대한 link를 생성하고자 한다면 다음과 같이 실행한다.
pnpm link ../test
만약 현재 /hotel이라는 project directory에서 작업 중이고 위의 command를 실행한다면 결과는 다음과 같다.
- hotel
- node_modules
- test
- test
반면에 내가 현재 /hotel project directory에서 작업 중인 상태에서 pnpm link --dir ../test 명령어를 실행하면 결과는 다음과 같다.
- test
- node_modules
- hotel
- hotel
pnpm prune
Project에서 불필요한 package를 제거한다. 함께 사용할 수 있는 options은 다음과 같다.
--prod: devDependencies에 기입된 packages를 proejct node_modules에서 제거한다.-no-optional: optionalDependencies에 기입된 packages를 project node_modules에서 제거한다.
pnpm patch
설치한 package를 수정해서 사용해야 할 때 유용한 명령어다. 만약 현재 proejct에 radash라고하는 functional utility 함수를 제공하는 package를 사용하고 있고 그 중 flat이라는 함수에 console.log를 추가 해야 한다고 가정해보자. project package.json은 다음과 같다.
{
"type": "module",
"packageManager": "pnpm@9.11.0+sha512.0a203ffaed5a3f63242cd064c8fb5892366c103e328079318f78062f24ea8c9d50bc6a47aa3567cabefd824d170e78fa2745ed1f16b132e16436146b7688f19b",
"dependencies": {
"radash": "^12.1.0"
}
}
위의 상황에서 우리가 수정을 적용해야 할 package는 radash@12.1.0이다. 다음과 같이 patch command를 실행한다.
pnpm patch radash@12.1.0
위의 명령어를 실행하면 설치했던 package와는 별개로 patch를 적용할 수 있는 patch package directory를 생성하고 해당 경로를 알려준다.
patch package directory 경로로 이동하면 수정할 package의 코드를 확인할 수 있으며 해당 코드에 원하는 수정사항을 적용한다. 테스트를 위해 간단히 console.log를 flat 함수에 추가 해보자.
...
const flat = (lists) => {
console.log(' ::: flat invoked ::: ')
...
};
...
원하는 수정 사항을 추가 했으면 이제 수정 사항을 commnit해야 한다. commit은 다음과 같이 patch-commit <path>형식으로 할 수 있으며 <path>부분은 patch package directory의 경로를 입력한다. 만약 patch directory의 경로가 D:\test\node_modules\.pnpm_patches\radash@12.1.0라면 다음과 같이 commit을 실행한다.
pnpm patch-commit D:\test\node_modules\.pnpm_patches\radash@12.1.0
위의 명령어를 통해 patch 사항을 commit하면 다음과 같이 package.json에 patch 관련 내용이 추가된 것을 확인할 수 있다.
{
"type": "module",
"packageManager": "pnpm@9.11.0+sha512.0a203ffaed5a3f63242cd064c8fb5892366c103e328079318f78062f24ea8c9d50bc6a47aa3567cabefd824d170e78fa2745ed1f16b132e16436146b7688f19b",
"dependencies": {
"radash": "^12.1.0"
},
"pnpm": {
"patchedDependencies": {
"radash@12.1.0": "patches/radash@12.1.0.patch"
}
}
}
그리고 project 경로에 patches 폴더가 추가되어 있는 걸 확인할 수 있다. 폴더 안을 보면 우리가 위에서 수정한 내용을 담고 있는 파일을 확인할 수 있다. 그렇기에 이후에도 같은 version을 설치하면 우리가 수정한 내용을 PNPM에서 내부적으로 적용해준다.
...
package.json
index.js
/patches
radash@12.1.0.patch
이제 index.js에서 radash의 flat function을 실행하면 우리가 추가한 log가 함께 출력되는 것을 확인할 수 있다.
import { flat } from "radash";
const result = flat([[1], [2]]);
console.log(result);
만약 patch file을 다시 지우고 싶다면 patch-remove를 통해 삭제한다.
pnpm patch-remove radash@12.1.0
위의 명령어는 package.json에 추가된 radash@12.1.0 patch 정보와 project와 patches 폴더에 있는 radash@12.1.0에 대한 patch file만 제거하므로 patch를 생성할 때 생긴 patch package directory는 별개로 삭제해주어야 한다.
기타 command lines
pnpm run : package.json에 설정된 script을 실행한다. npm run과 같은 역할을 한다.
pnpm exec : project scope에서 shell command를 실행한다. ex )
pnpm exec ls > filelist.txtpnpm dlx : pnpx는 pnpm dlx의 alias이므로 같은 역할을 한다. Package를 project의 dependency로 설치하지 않고 registry에서 fetch해온 package의 default command를 실행한다.
pnpm list : 현재 project에 설치된 package의 list를 출력한다.
pnpm outdated : 현재 project에 설치된 package 중 최근 version이 아닌 package를 체크한다.
위에서 살펴본 command lines 외에도 다른 command lines이 있으므로 모든 command lines은 documentation을 통해 확인할 수 있다. ( PNPM - CLI commands )
![[ 살펴보기 ] RDB - Relationships](https://cdn.hashnode.com/res/hashnode/image/upload/v1739711556668/48dc9e84-a621-42aa-9c9f-5fc5c436f0ec.jpeg)
![[ 살펴보기 ] MySQL - Data types](https://cdn.hashnode.com/res/hashnode/image/upload/v1739593589113/530f8704-4d27-42c9-a451-bb5c63150b99.jpeg)
![[ 살펴보기 ] TypeORM - Transactions, Migration](https://cdn.hashnode.com/res/hashnode/image/upload/v1739106042581/980b8133-61d4-406a-a026-65be9c28eace.jpeg)
![[ 살펴보기 ] TypeORM - Relations](https://cdn.hashnode.com/res/hashnode/image/upload/v1738666874402/b688bd0b-b6bb-4f43-87d8-c1b46b59f1b7.jpeg)
![[ 살펴보기 ] TypeORM - Basics](https://cdn.hashnode.com/res/hashnode/image/upload/v1738666803591/bef5df17-7dc7-4123-ae55-004d5042df39.jpeg)