Node.js로 CLI 도구 구축 시작하기

이 게시물에서는 Node.js로 CLI 도구를 빌드하는 방법을 살펴보겠습니다. 유일한 요구 사항은 Node v18+를 사용하는 것입니다. 더 낮은 버전의 Node를 사용할 수 있지만 작동하려면 일부 코드를 수정해야 합니다.

프로젝트 초기화



프로젝트용 폴더를 만들고 이 폴더에서 npm init를 실행합니다. 이렇게 하면 프로젝트의 루트에 package.json 파일이 생성됩니다. -y 플래그를 전달하여 기본값을 수락할 수 있습니다.

npm init -y



{
  "name": "cli-course",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}


기본적으로 프로젝트의 모듈 시스템은 CommonJS 또는 CJS가 됩니다. CJS의 가져오기 및 내보내기는 다음과 같이 작동합니다.

var myModule = require("my-module");

var result = myModule.doSomething();

module.exports = {
  result,
};


ECMAScript 모듈 또는 ESM에서는 다음과 같이 작동합니다.

import myModule from "my-module";

export const result = myModule.doSomething();


ESM을 사용하려면 package.json 속성을 type로 설정하여 module에서 활성화해야 합니다.

{
  "name": "cli-course",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "type": "module"
}


인수 구문 분석



노드에서 전역적으로 process 변수에 액세스할 수 있습니다. process의 내용을 콘솔에 인쇄하면 많은 정보를 볼 수 있습니다. argv 속성에서 스크립트에 전달된 인수에 액세스할 수 있습니다. 예를 들어 node index.js를 실행하면 다음과 유사한 내용이 인쇄됩니다.

console.log(process.argv);

/**
 * Output:
 * ["/usr/local/bin/node", "/projects/node-cli-course/index.js"]
 */


보시다시피 배열의 처음 두 요소는 노드 실행 파일의 경로와 스크립트의 경로입니다. 명령에 더 많은 인수를 전달하면 argv 배열에 추가됩니다. 예를 들어 node index.js --name=Jose를 실행하면 다음과 같이 인쇄됩니다.

["/usr/local/bin/node", "/projects/node-cli-course/index.js", "--name=jose"]


어떤 인수가 - 문자로 시작하는지 확인하는 스크립트에 전달된 플래그를 쉽게 구문 분석할 수 있습니다.

const flags = [];

process.argv.forEach((arg) => {
  if (arg.startsWith("-")) {
    flags.push(arg.replaceAll("-", ""));
  }
});


( node index.js --hi ) 명령을 사용하면 flags array['hi'] 와 같습니다.
그런 다음 깃발로 무언가를 할 수 있습니다.

if (flags.includes("hi")) {
  console.log("Hello World!");
}


사용자 입력 읽기



노드에는 Readline이라는 사용자 입력을 읽는 내장 모듈이 있습니다.

사용자 입력을 읽으려면 새 항목interface을 만들고 이를 입력 및 출력과 연결해야 합니다. 이 경우 process 변수에서 직접 사용할 수 있는 표준 입력 및 출력을 사용할 것입니다. 인터페이스 개체를 사용하여 사용자에게 매우 쉽게 질문할 수 있습니다.

완료되면 프로세스를 중지하기 위해 인터페이스를 닫아야 합니다.

import * as readline from "node:readline/promises";

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

const answer = await rl.question("What's your name? ");

console.log(`Your name is ${answer}`);

rl.close();

/**
 * Output:
 * What's your name? Jose
 * Your name is Jose
 */


스크립트를 전역적으로 실행 가능하게 만들기



스크립트를 전역적으로 실행 가능하게 만드는 쉬운 방법은 스크립트를 실행할 새 파일을 만드는 것입니다.
이 새 파일의 이름은 명령 이름과 같아야 합니다. 예를 들어, 우리의 경우 명령 이름을 사용하고 싶습니다 cli-course . 그래서 내 스크립트 파일을 실행하는 cli-course라는 파일을 만들었습니다.

node index.js


그런 다음 chmod +x cli-course를 실행하여 새 파일을 실행 가능하게 만듭니다.

마지막으로 프로젝트의 경로를 PATH 환경 변수에 추가합니다.

export PATH=$PATH:/path/to/project/


이제 터미널에 cli-course를 입력하여 스크립트를 전역적으로 실행할 수 있습니다.

$ cli-course
What's your name? Jose
Your name is Jose


결론



다음 단계에 따라 Node.js로 기본 CLI 도구를 만들 수 있습니다. 우리는 콘솔에 텍스트를 인쇄하는 방법, 인수를 구문 분석하는 방법, 사용자 입력을 읽는 방법 및 스크립트를 전역적으로 실행 가능하게 만드는 방법을 배웠습니다.

이것이 충분하지 않으면 Inquirer.js 과 같은 라이브러리를 사용할 수 있습니다. 이 라이브러리를 사용하여 다음을 수행할 수 있습니다.
  • 오류 피드백 제공
  • 질문하기
  • 구문 분석 입력
  • 답변 확인
  • 계층 프롬프트 관리

  • 도구에 외부 라이브러리가 필요한지 여부는 사용자가 결정해야 합니다.

    자원


  • process - Node.js documentation
  • Readline - Node.js documentation
  • Inquirer.js
  • 좋은 웹페이지 즐겨찾기