์ƒ์„ธ ์ปจํ…์ธ 

๋ณธ๋ฌธ ์ œ๋ชฉ

[Node.js] 14์žฅ CLI ํ”„๋กœ๊ทธ๋žจ ๋งŒ๋“ค๊ธฐ

22-23/22-23 Node.js

by dev otcroz 2023. 1. 5. 10:00

๋ณธ๋ฌธ

728x90

๐Ÿ” CLI (Command Line Interface)

์ฝ˜์†” ์ฐฝ์„ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋žจ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ™˜๊ฒฝ

๊ทธ๋ž˜ํ”ฝ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋ฐ˜๋Œ€๋˜๋Š” ๊ฐœ๋…

  • ๋Œ€ํ‘œ์ ์ธ CLI ๋ฐฉ์‹ ์†Œํ”„ํŠธ์›จ์–ด : ๋ฆฌ๋ˆ…์Šค์˜ ์…ธ, ๋ธŒ๋ผ์šฐ์ €์˜ ์ฝ˜์†”, ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ
  • ๋Œ€ํ‘œ์ ์ธ GUI ๋ฐฉ์‹ ์†Œํ”„ํŠธ์›จ์–ด : ์œˆ๋„์™€ ๋งฅ ์šด์˜์ฒด์ œ, ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜

 

โœ… ์ฝ˜์†” ๋ช…๋ น์–ด

node๋‚˜ npm, nodemon์ฒ˜๋Ÿผ ์ฝ˜์†”์— ์ž…๋ ฅํ•˜์—ฌ ์–ด๋–ค ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฌธ์žฅ

ํŒจํ‚ค์ง€๋ช…๊ณผ ์ฝ˜์†” ๋ช…๋ น์–ด๋Š” ๋‹ค๋ฅด๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค

//package.json
{
	...
    "license": "ISC",
    "bin": {
    	"cli": "./index.js"
    }

bin : ์ฝ˜์†” ๋ช…๋ น์–ด์™€ ํ•ด๋‹น ๋ช…๋ น์–ด๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์‹คํ–‰ ํŒŒ์ผ์„ ์„ค์ •ํ•˜๋Š” ๊ฐ์ฒด

ํ˜„์žฌ ์ฝ˜์†” ๋ช…๋ น์–ด๋Š” cli, ์‹คํ–‰ ํŒŒ์ผ์€ index.js๋กœ ์ง€์ •

$ npm i -g   //์ฝ˜์†”์—์„œ ํ˜„์žฌ ํŒจํ‚ค์ง€ ์ „์—ญ ์„ค์น˜ 
$ cli     //index.js ์‹คํ–‰

 

๐Ÿ“Œ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ ๋ฐ›๊ธฐ

๋…ธ๋“œ์˜ ๋‚ด์žฅ ๋ชจ๋“ˆ readline ์‚ฌ์šฉ

//index.js
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();  // ์ž…์ถœ๋ ฅ ๊ณผ์ • ํ›„ ๋ฉ”์„œ๋“œ ์ข…๋ฃŒ
});

process.stdin ๊ณผ process.stdout : ์ฝ˜์†” ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์„ ๋‹ด๋‹นํ•˜๋Š” ์ŠคํŠธ๋ฆผ

readline ๋ชจ๋“ˆ : ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ ๋ฐ›๊ณ  ๊ทธ์— ๋”ฐ๋ฅธ ๊ฒฐ๊ณผ ์ถœ๋ ฅ

console.clear ๋ฉ”์„œ๋“œ : ์ฝ˜์†” ๋‚ด์šฉ์„ ์ง€์›€

 

๐Ÿ” commander์™€ inquirer

CLI ํ”„๋กœ๊ทธ๋žจ์„ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

commander๋Š” ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์ด ์ข€ ๋” ์ง๊ด€์ ์ด๋ฉฐ, inquirer์€ CLI ํ”„๋กœ๊ทธ๋žจ๊ณผ ์‚ฌ์šฉ์ž ๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ๋„์›€

 

๐Ÿ“Œ commander ์‚ฌ์šฉ๋ฒ•

  • version : ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฒ„์ „ ์„ค์ •, node -v๋กœ ํ”„๋กœ๊ทธ๋žจ ๋ฒ„์ „ ํ™•์ธ ๊ฐ€๋Šฅ
  • usage : ๋ช…๋ น์–ด์˜ ์‚ฌ์šฉ๋ฒ• ์„ค์ •
  • name : ๋ช…๋ น์–ด์˜ ์ด๋ฆ„์„ ์ ์Œ
  • command : ๋ช…๋ น์–ด ์„ค์ •ํ•˜๋Š” ๋ฉ”์„œ๋“œ
  • description : ๋ช…๋ น์–ด์— ๋Œ€ํ•œ ์„ค๋ช…์„ ์„ค์ •ํ•˜๋Š” ๋ฉ”์„œ๋“œ
  • alias : ๋ช…๋ น์–ด์˜ ๋ณ„์นญ ์„ค์ •
  • option : ๋ช…๋ น์–ด์— ๋Œ€ํ•œ ๋ถ€๊ฐ€์ ์ธ ์˜ต์…˜ ์„ค์ •
  • requiredOption : ํ•„์ˆ˜๋กœ ์ž…๋ ฅํ•ด์•ผ ํ•˜๋Š” ์˜ต์…˜ ์ง€์ •
  • action : ๋ช…๋ น์–ด์— ๋Œ€ํ•œ ์‹ค์ œ ๋™์ž‘ ์ •์˜
  • help : ์„ค๋ช…์„œ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์˜ต์…˜
  • parse : process.argv๋ฅผ ์ธ์ˆ˜๋กœ ๋ฐ›์•„ ๋ช…๋ น์–ด์™€ ์˜ต์…˜ ํŒŒ์‹ฑ

 

๐Ÿ“Œ commander์—์„œ ์•Œ์•„๋‘์–ด์•ผ ํ•  ๊ฒƒ

๊ธฐ๋ณธ ๋ช…๋ น์–ด(cli)๋Š” * ๋ช…๋ น์–ด์— ํ•ด๋‹นํ•˜์ง€ ์•Š๋Š”๋‹ค

์ด ๋ช…๋ น์–ด์— ๋™์ž‘์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด * ๋ช…๋ น์–ด๋ฅผ ์—†์• ๊ณ  ์ผ๋ฐ˜ action์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋”ฐ๋ผ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผ ํ•จ

 

๐Ÿ“Œ inquirer ์‚ฌ์šฉ๋ฒ•

inquirer ๊ฐ์ฒด๋Š” prompt ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง€๋Š”๋ฐ, ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋Š” ์ธ์ˆ˜๋กœ ์งˆ๋ฌธ ๋ชฉ๋ก์„ ๋ฐ›๊ณ  ํ”„๋กœ๋ฏธ์Šค๋ฅผ ํ†ตํ•ด ๋‹ต๋ณ€์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค

 

โœ… ์งˆ๋ฌธ ๊ฐ์ฒด์˜ ์†์„ฑ

  • type : ์งˆ๋ฌธ์˜ ์ข…๋ฅ˜
  • name : ์งˆ๋ฌธ์˜ ์ด๋ฆ„
  • message : ์‚ฌ์šฉ์ž์—๊ฒŒ ํ‘œ์‹œ๋˜๋Š” ๋ฌธ์ž์—ด
  • choices : type์ด checkbox, list ๋“ฑ์ธ ๊ฒฝ์šฐ ์„ ํƒ์ง€๋ฅผ ๋„ฃ๋Š” ๊ณณ
  • default : ๋‹ต์„ ์ ์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ ์ ์šฉ๋˜๋Š” ๊ธฐ๋ณธ๊ฐ’

 

๐Ÿ” chalk ํŒจํ‚ค์ง€

์ฝ˜์†” ํ…์ŠคํŠธ์— ์Šคํƒ€์ผ์„ ์ถ”๊ฐ€ํ•  ๋•Œ ์‚ฌ์šฉ

  • ๋ฐฐ๊ฒฝ์ƒ‰ ์ง€์ • : bgGreen, bgYellow, bgRgb, bgHex
  • ํ…์ŠคํŠธ ์Šคํƒ€์ผ ์ง€์ • : bold, underline

chalk.rgb(12, 34, 56)(ํ…์ŠคํŠธ) ๋˜๋Š” chalk.hex('#123456')(ํ…์ŠคํŠธ) ์ฒ˜๋Ÿผ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

chalk.red.bgBlue.bold(ํ…์ŠคํŠธ) ์ฒ˜๋Ÿผ ๊ธ€์ž์ƒ‰, ๋ฐฐ๊ฒฝ์ƒ‰, ์Šคํƒ€์ผ ๋™์‹œ ์ง€์ • ๊ฐ€๋Šฅ

 

 

 


Node.js 

Editor : dori

728x90

๊ด€๋ จ๊ธ€ ๋”๋ณด๊ธฐ