pkg는 nodejs가 설치되어 있지 않은 환경에서 실행할 수 있도록, standalone의 바이너리 파일을 만들어서 배포해주는 모듈이다.
이번에 외부 개발자에게 배포해야할 일이 생겨 적용해 보았고, 사용 방법에 대해 간략하게 기술한다.
설치는 다음과 같다.
npm install -g pkg
글로벌 설치하지 않고 devDependancy 에만 적용하고 싶다면,
npm install --save-dev pkg
설치 되었다면 package.json에 설정값을 추가한다.
"bin": {
"app": "./bin/www"
},
"scripts": {
"start": "nodemon --exec babel-node ./bin/www",
"build": "pkg . --debug --out-path dist"
},
"pkg": {
"assets": ["public/**/*"]
- bin에 실행 명령어를 지정한다. 아래 scripts의 build 명령어에 'pkg .' 라고 지정했기 때문이다.
- pkg에 assets, targets를 배열 형태로 추가할 수 있다. 바이너리가 만들어지면 파일구조가 pkg에서 새로 구성하기 때문에 필요한 리소스 등이 있다면 여기에 추가해야 한다.
- targets에 아무런 값이 없을 경우 windows/linux/mac 3개의 바이너리가 생성된다. 특정 노드 버전, OS, architecture(x86 x64 arm 등)를 지정하고 싶다면 옵션을 추가하자. ( ex) "targets": ["node16-linux-x86"] )
문법을 섞으니 문제가 발생
처음부터 es6를 적용하지 않고, 중간에 babel을 이용하여 적용하도록 만들다보니 문법이 섞였는데 pkg에서 build 시 해당 부분에서 에러가 발생하였다. package.json에 모듈 옵션을 적용하면 된다고 하였으나, 해당 옵션을 적용하면 구문법을 모두 신문법을 적용해야 했고 양이 너무 방대했다.고민 끝에 구문법으로 바꾸는게 작업량이 적다고 판단되어 변경하였고, 정상적으로 빌드되는 것을 확인하였다.
이런식으로 외부로 배포할 줄은 몰랐지만... 앞으로는 이런 구조에 대해서도 대비해야할 듯.
pkg 옵션 예제
https://www.npmjs.com/package/pkg Examples:– Makes executables for Linux, macOS and Windows
$ pkg index.js
– Takes package.json from cwd and follows 'bin' entry
$ pkg .
– Makes executable for particular target machine
$ pkg -t node14-win-arm64 index.js
– Makes executables for target machines of your choice
$ pkg -t node12-linux,node14-linux,node14-win index.js
– Bakes '--expose-gc' and '--max-heap-size=34' into executable
$ pkg --options "expose-gc,max-heap-size=34" index.js
– Consider packageA and packageB to be public
$ pkg --public-packages "packageA,packageB" index.js
– Consider all packages to be public
$ pkg --public-packages "*" index.js
– Bakes '--expose-gc' into executable
$ pkg --options expose-gc index.js
– reduce size of the data packed inside the executable with GZip
$ pkg --compress GZip index.js
댓글