CLI 프로그램 만들기

index.js 파일 제일 위에 #!/usr/bin/env node 를 적어 준다.

윈도우에서는 아무 역할이 없지만 리눅스나 맥에서는 이 파일을 노드로 실행하라는 역할을 한다.

 

#!/usr/bin/env node
console.log("hello cli");

 

package.json 파일에 bin 부분을 추가한다.

cli를 실행하면 index.js가 실행된다.

 

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

 

아래처럼 글로벌로 설치하면 index.js 가 프로그램을 설치가 된 것이다.

D:\code\node\cli>npm i -g

added 1 package in 1s

 

실행을 하면 console가 실행되는 것을 확인할 수 있다.

D:\code\node\cli>npx cli
hello cli

 

아래와 같이 코드를 수정했어도 다시 설치할 필요 없이 정상적으로 실행이 된다.

//index.js 파일

#!/usr/bin/env node
console.log("hello cli", process.argv);

 

D:\code\node\cli>npx cli
hello cli [
  'C:\\Program Files\\nodejs\\node.exe',
  'C:\\Users\\john\\AppData\\Local\\npm-cache\\_npx\\bc67c92c0f4afb79\\node_modules\\node-cli\\index.js'
]

 

process.argv 는 매개변수를 불러올 수 있다.

 

D:\code\node\cli>npx cli one two three four
hello cli [
  'C:\\Program Files\\nodejs\\node.exe',
  'C:\\Users\\john\\AppData\\Local\\npm-cache\\_npx\\bc67c92c0f4afb79\\node_modules\\node-cli\\index.js',
  'one',
  'two',
  'three',
  'four'
]

 

터미널에서 사용자의 답변을 듣는 코드를 작성하고 실행 화면이다.

// index.js 파일

#!/usr/bin/env node
const readline = require("readline");

const rl = readline.createInterface({
  input: process.stdin, // 터미널 인풋
  output: process.stdout, // 터미널 아웃풋
});

rl.question("예제가 재밌나요?(y/n)", (answer) => {
  if (answer === "y") {
    console.log("감사합니다.");
  } else if (answer === "n") {
    console.log("죄송합니다.");
  } else {
    console.log("y 또는 n 만 입력하세요.");
  }
  rl.close();
});

 

D:\code\node\cli>npx cli                        
예제가 재밌나요?(y/n)b
y 또는 n 입력하세요.

D:\code\node\cli>npx cli
예제가 재밌나요?(y/n)y
감사합니다.

D:\code\node\cli>npx cli
예제가 재밌나요?(y/n)n
죄송합니다.

 

아래와 같이 package.json 이 수정되면 다시 설치를 해줘야 한다.

cli : 이 부분이 index.js → template.js 로 변경

 

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

 

D:\code\node\cli>npm i -g

up to date in 831ms

 

template를 자동으로 만들어 주는 cli 프로그램을 수행한 결과 화면

자동으로 html 파일을 만들고 안에 내용을 채워진 것을 확인

 

 

설치한 npx cli를 지울 때는 아래 명령어 사용 가능

 

D:\code\node\cli>npm rm -g node-cli

Commander, Inquirer 사용하기

자주 쓰이는 패키지 2개를 알아보자.

버전에 따라서 명령어가 달라질 수 있어서 버전까지 지정해서 설치

D:\code\node\cli>npm i commander@9 inquirer@8

added 53 packages, and audited 54 packages in 7s

15 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

 

command.js 만들고 package.json 수정 필요, 다시 설치

// package.json 파일
"bin": {
    "cli": "./command.js"
  },

 

// 다시 설치
D:\code\node\cli>npm i -g

up to date in 964ms

 

필수값 , 선택값 구분

program
  .command("template <type>") // <type> 은 필수값, [type] 은 선택 값

 

버전 확인

D:\code\node\cli>npx cli -v
0.0.1

 

설명내용을 확인 가능

D:\code\node\cli>npx cli -h
Usage: cli [options] [command]

Options:
  -v, --version                   output the version number
  -h, --help                      display help for command

Commands:
  template|tmpl [options] <type>  템플릿을 생성합니다.
 
 

 

명령어를 실행하면 아래와 같이 템플릿이 포함된 파일을 자동으로 만들어 준다.

 

아래는 inquirer 버전 URL 이다.

https://www.npmjs.com/package/inquirer?activeTab=versions

 

npx cli 로 실행하고 선택할 때는 화살표로 움직일 수 있다.

D:\code\node\cli>npx cli
? 템플릿 종류를 선택하세요. html    
? 파일의 이름을 입력하세요. new
? 파일이 위치할 폴더의 경로를 입력하세요. public/html
? 생성하시겠습니까? Yes    
이미 해당 파일이 존재합니다
터미널을 종료합니다.

 

조금 더 꾸며볼 수 있다.

chalk 를 설치하면 색깔을 입힐 수 있게 해준다.

 

D:\code\node\cli>npm i chalk@4

up to date, audited 54 packages in 1s

15 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

 

에러 내용 같은 경우에 아래와 같이 빨간색 볼드체로 보이게 할 수 있다.

console.error(chalk.bold.red("이미 해당 파일이 존재합니다"));

 

성공은 아래와 같이 초록색으로 보이게 할 수 있다.

console.log(chalk.green(pathToFile, "생성 완료"));

 

아래는 색상이 변경된 결과 화면이다.

 

'Javascript > Node' 카테고리의 다른 글

노드 교과서 섹션 8  (0) 2023.08.23
노드 교과서 섹션 9  (0) 2023.08.22
노드 교과서 섹션 10  (0) 2023.08.19
노드 교과서 섹션 11  (0) 2023.08.18
노드 교과서 섹션 12  (0) 2023.08.17

+ Recent posts