zx 노드를 만듭니다.pkg이 있는 2진 js 스크립트

7731 단어 javascriptnode
그래서 아주 멋진 라이브러리 zx 가 있습니다. bash 스크립트 대신 스크립트를 만들 수 있습니다.
그러나 그 단점 중 하나는 지금 노드를 가져야 한다는 것이다.js runtime는 이 스크립트를 실행해야 하는 컴퓨터에 설치됩니다.이것은 매우 슬프다.
하지만 스크립트와 노드를 포함하는 바이너리 파일을 만들 수 있다면?js가 실행될 때?
pkg 살려주세요!
우선, 간단한 zx 스크립트를 만듭니다.노드가 있는지 확인하십시오.js 16 + 를 기계에 설치한 다음 셸을 열고 다음 명령을 입력하여 새 디렉터리를 만들고 노드를 초기화합니다.js 프로젝트.
$ cd /my/projects
$ mkdir my-cli
$ cd my-cli
$ npm init -y
현재 package.json 파일이 있어야 합니다. 이 파일에 "type": "module"을 추가해야 zx가 정상적으로 작동할 수 있습니다.
{
  "name": "my-cli",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
+ "type": "module"
}
다음은 zx를 의존항으로 추가할 수 있습니다.
$ npm install zx
우리 예쁜 대본 쓸 준비 됐어!폴더src를 만들고 다음을 포함하는 파일을 추가합니다index.js.
// src/index.js
import { $ } from "zx";

async function main() {
  await $`date`;
}

main().catch((err) => console.log(err));
지금 껍질에서 써도 돼요.
$ node src/index.js
이것은 기계의 현재 날짜와 시간을 출력할 것이다.그러나 보시다시피, 스크립트 (또는 node 를 실행할 때 (예시에서 보듯이) 를 사용해야 합니다.예를 들어 기계에 노드가 없으면 이상적이지 않기 때문이다.js나 zx를 설치한 후 스크립트를 실행할 수 없습니다.
이 문제의 해결 방안은 실행할 때 우리의 스크립트와 실행 가능한 바이너리 파일로 포장한 다음, 기계가 설치되어 있지 않아도 실행할 수 있도록 하는 것이다.
포장에 대해서는 pkg 라이브러리를 사용할 것입니다.불행하게도, 우리는 zx"type": "module"에 추가하여 Pkgis not supporting ES modules을 설정합니다.따라서 Pkg을 사용하기 전에 ES 모듈을 사용하지 않는 버전으로 스크립트를 컴파일해야 합니다.우리는 esbuild를 사용하여 번역할 것이다.esbuild는 스크립트를 파일에 묶을 수 있기 때문에 컴파일된 파일에 package.json 폴더에 대한 의존 항목이 없습니다.설치하라고.
$ npm install --save-dev esbuild
node_modules 에 npm 스크립트를 추가하여 컴파일합니다.
{
  "name": "my-cli",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
-    "test": "echo \"Error: no test specified\" && exit 1"
+    "compile": "esbuild src/index.js --platform=node --target=node16 --bundle --outfile=dist/outfile.cjs"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "type": "module",
  "dependencies": {
    "zx": "^6.0.1"
  },
  "devDependencies": {
    "esbuild": "^0.14.27"
  }
}
이 npm 스크립트는 esbuild를 실행하고 package.json를 입구점으로 사용하며 esbuild를 출력 노드로 설정합니다.js v16 + 호환 파일 src/index.js.dist/outfile.cjs 파일의 끝은 매우 중요합니다. 그렇지 않으면 Pkg은 ES 모듈로 가방을 불러오려고 시도할 것입니다. 설령 우리가 그것을 컴파일했다 하더라도.
이제 스크립트를 컴파일할 수 있습니다.
$ npm run compile
너는 껍데기에서 유사한 것을 볼 수 있다.
> [email protected] compile
> esbuild src/index.js --platform=node --target=node16 --bundle --outfile=dist/outfile.cjs

  dist/outfile.cjs  439.1kb

⚡ Done in 246ms
다음에 pkg 라이브러리를 설치하고 npm 스크립트를 추가합니다.
$ npm install --save-dev pkg
.cjs: (스크립트를 컴파일한 후의 쉼표를 잊지 마세요)
{
  "name": "my-cli",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "compile": "esbuild src/index.js --platform=node --target=node16 --bundle --outfile=dist/outfile.cjs",
+   "package": "pkg dist/outfile.cjs --targets node16 --output dist/my-cli --debug"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "type": "module",
  "dependencies": {
    "zx": "^6.0.1"
  },
  "devDependencies": {
    "esbuild": "^0.14.27",
    "pkg": "^5.5.2"
  }
}
package.json 스크립트가 pkg을 실행하고 dist/outfile을 사용합니다.cjs를 입구점으로 합니다.그것은 또한 우리가 원하는 노드를 배치했다.js 16을 목표로 실행할 때 파일을 출력해야 합니다. package현재 dist/my-cli 스크립트를 실행하면, package 폴더에서 바이너리 파일을 보길 원할 것입니다.
$ npm run package
이것은 대량의 디버깅 정보를 출력합니다. 이 정보를 무시할 수 있습니다.하지만 문제가 있다면 유용한 정보를 통해 문제를 진단할 수 있다.
개발자 기계의 운영체제와 프로세서 체계 구조만 호환되는 바이너리 파일을 출력한다는 것을 기억하십시오.따라서 x64 프로세서가 있는 Windows 기기에서 dist 명령을 실행하면 바이너리 파일은 리눅스나 맥OS 기기에서 작업을 할 수 없습니다.그곳에서 작업을 하려면 더 많은 목표를 포함하기 위해 패키지 명령을 변경하거나 (참조 the documentation for that 같은 OS/프로세서 시스템 구조에서 패키지 명령을 실행해야 합니다.
현재, 파일 브라우저에서 사용자가 사용하는 운영체제에 따라 파일 npm run package 이나 dist/my-cli 을 볼 수 있습니다.이 파일은 셸에서 다음과 같은 호출을 통해 실행됩니다.
$ ./dist/my-cli
만일 모든 것이 정상이라면, 너는 현재의 날짜와 시간을 보아야 한다🥳
이 바이너리 파일은 현재 어떠한 운행도 할 수 없는 상황에서 사용할 수 있다. (같은 운영체제/프로세서 체계 구조에서만 실행할 수 있다면) 정말 좋다.
실행할 때 알 수 없는 위대한 스크립트를 작성하는 즐거움을 누리세요!
사진 작성자Markus SpiskeUnsplash

좋은 웹페이지 즐겨찾기