Search

[TIL] pnpm patch 하는 법

subtitle
Tags
자바스크립트
TIL
Created
2022/09/01
2 more properties

patch

pnpm 7.4.0 버전 이상이어야 한다
외부 라이브러리를 내 프로젝트에서 커스텀하게 바꿔서 사용할 수 있다.
pnpm_store에 설치된 라이브러리에 글로벌하게 적용되는 게 아니라 내 프로젝트에만 적용된다.

TL;DR

pnpm patch <patch할 패키지 이름>
private 경로에서 코드 수정 및 저장
pnpm patch-commit <private 경로>
Dockerfile 사용해서 배포하는 경우, patches 파일도 함께 COPY한다.

방법

1.
pnpm patch <patch할 패키지 이름>
package.json에 설치된 패키지를 패치한다. (해당 패키지의 현재 설치된 버전을 패치한다)
pnpm patch is-odd
Shell
패치할 수 있도록 pnpm이 기존 패키지 파일의 복사본을 private 경로에 만들어준다.
You can now edit the following folder: /private/var/folders/hl/s51yjywn6hj4v0w_mhrv8l540000gn/T/c682bc84c25ea88197cded12650f97c8/user
Shell
변수에 저장해주면 나중에 수정하기 편하다.
한 번 패치하고 나서 다시 패치할 때도 해당 경로에서 수정해야하기 때문에 저장해놓으면 좋다
자기가 원하는 directory로 설정해놓으면 좋을 것 같아서 issue/pr를 올려놓았다.
PR
5304
pull
IS_ODD=/private/var/folders/hl/s51yjywn6hj4v0w_mhrv8l540000gn/T/c682bc84c25ea88197cded12650f97c8/user
JavaScript
2.
해당 경로에서 원하는 대로 수정한 후 저장한다. (저장하지 않으면 반영 안됨)
code $IS_ODD
Shell
저장
'use strict'; const isNumber = require('is-number'); console.log('!!!PATCH!!!') // 변경된 부분 module.exports = function isOdd(value) { const n = Math.abs(value); if (!isNumber(n)) { throw new TypeError('expected a number'); } if (!Number.isInteger(n)) { throw new Error('expected an integer'); } if (!Number.isSafeInteger(n)) { throw new Error('value exceeds maximum safe integer'); } return (n % 2) === 1; };
JavaScript
3.
pnpm patch-commit <private 경로>
pnpm patch-commit $IS_ODD
JavaScript
patches 폴더가 추가된다: patches/변경된패키지-버전
diff --git a/index.js b/index.js index 79d1f22a8e7a27efb8841bb83cb682ea1ff3a59c..78603df3ee5bbc3cfd06e7419889726dab6f4039 100644 --- a/index.js +++ b/index.js @@ -5,21 +5,22 @@ * Released under the MIT License. */ -'use strict'; +"use strict"; -const isNumber = require('is-number'); +const isNumber = require("is-number"); + +console.log("!!!PATCH!!!"); // 변경된 부분 module.exports = function isOdd(value) { const n = Math.abs(value); if (!isNumber(n)) { - throw new TypeError('expected a number'); + throw new TypeError("expected a number"); } if (!Number.isInteger(n)) { - throw new Error('expected an integer'); + throw new Error("expected an integer"); } if (!Number.isSafeInteger(n)) { - throw new Error('value exceeds maximum safe integer'); + throw new Error("value exceeds maximum safe integer"); } - return (n % 2) === 1; + return n % 2 === 1; }; -
JavaScript
패치한 패키지를 한 번 더 패치하려면 처음에 주어진 private 경로에서 수정 후 다시 저장하면 된다.
새로 pnpm patch <패키지> 해서 패치 커밋하는 경우 기존 패치가 초기화되니 주의한다.
package.json에 patch 파일 경로가 저장된다.
"pnpm": { "patchedDependencies": { "is-odd@3.0.1": "patches/is-odd@3.0.1.patch" } }
JavaScript
4.
Dockerfile 사용해서 배포하는 경우, patches 파일도 함께 COPY한다.
COPY patches patches
Docker