2 명령어 실행의 성공과 실패에 대한 이야기
3 매개변수에 대해서
4 앱을 좀더 그럴듯 하게 만들기
매개변수에 대해서
CLI 기반의 앱들은 사용할때 매개변수를 넘겨줍니다 예를들어 파일을 묶어주는 앱인 tar 의 경우는 tar cvfpz file.tgz data 와 같은식으로 띄어쓰기를 구분해서 매개변수를 넘겨줍니다 그러면 tar 앱은 전달받은 매개변수를 토대로 일을 처리하죠 코드로 표현해보자면 tar(cvfpz, file.tgz, data) 를 한것과 비슷한 느낌입니다 이제부터 hello 10 5 라고 실행했을때 두 숫자를 곱해주는 앱을 만들어봅시다
IyEvdXNyL2Jpbi9lbnYgbm9kZQpjb25zb2xlLmxvZyhwcm9jZXNzLmFyZ3Yp
#!/usr/bin/env node
console.log(process.argv)
먼저 소스코드에 다음과같에 입력하고 hello 10 5 라고 실행해봅시다 process.argv 는 [ '/usr/local/bin/node', '/usr/local/bin/hello', '10', '5' ] 와 같은 모습인 배열임을 알 수 있습니다 배열의 각 요소는 항상 문자열이라는 것도 알아둡시다. 여기까지 보고 이제부터 어떻게 해야할지 아이디어가 떠올랐을수도, 아닐수도 있을것이라 생각합니다. 아니라면 다음을 계속 봅시다
IyEvdXNyL2Jpbi9lbnYgbm9kZQpjb25zb2xlLmxvZyhOdW1iZXIocHJvY2Vzcy5hcmd2WzJdKSAqIE51bWJlcihwcm9jZXNzLmFyZ3ZbM10pKQ==
#!/usr/bin/env node
console.log(Number(process.argv[2]) * Number(process.argv[3]))
이렇게 하면 완성입니다 hello 10 5 실행하면 50이 잘 나옵니다 echo $? 해보면 성공을 의미하는 0이 출력되지요 hello 10 이렇게 숫자를 하나만 입력하면 곱하기를 못하겠지요? 이러면 에러코드를 내어주도록 해봅시다
IyEvdXNyL2Jpbi9lbnYgbm9kZQppZiAocHJvY2Vzcy5hcmd2WzNdID09PSB1bmRlZmluZWQpIHsKICAgIGNvbnNvbGUubG9nKCdUd28gbnVtYmVycyByZXF1aXJlZCcpOwogICAgcHJvY2Vzcy5leGl0KDEpOwp9CmNvbnNvbGUubG9nKE51bWJlcihwcm9jZXNzLmFyZ3ZbMl0pICogTnVtYmVyKHByb2Nlc3MuYXJndlszXSkp
#!/usr/bin/env node
if (process.argv[3] === undefined) {
console.log('Two numbers required');
process.exit(1);
}
console.log(Number(process.argv[2]) * Number(process.argv[3]))
이렇게하고 hello 10 실행해봅시다. echo $? 해보면 1 출력하지요 Two numbers required 라는 메세지에 색을 입혀서 출력해봅시다 package.json 파일이 있는 폴더 안에서 npm install chalk 실행해서 모듈 설치 후 코드에 포함시켜줍니다 (ansi-colors 란것도 있습니다) nodejs 에서 보통 require('chalk') 해서 불러올 수 있는데 chalk 는 ESM인 이유로 require를 사용할 수 없습니다. 따라서 아래와 같이 package.json 에 "type": "module", 를 지정해줍니다.
ewogICJ0eXBlIjogIm1vZHVsZSIsCiAgIm5hbWUiOiAibWNhcHAiLAogICJ2ZXJzaW9uIjogIjEuMC4wIiwKICAiZGVzY3JpcHRpb24iOiAiVGhpcyBpcyBteSBmaXJzdCBDTEkgYXBwIiwKICAibWFpbiI6ICJpbmRleC5qcyIsCiAgInNjcmlwdHMiOiB7CiAgICAidGVzdCI6ICJlY2hvIFwiRXJyb3I6IG5vIHRlc3Qgc3BlY2lmaWVkXCIgJiYgZXhpdCAxIgogIH0sCiAgImF1dGhvciI6ICIiLAogICJsaWNlbnNlIjogIklTQyIsCiAgImJpbiI6eyAiaGVsbG8iOiIuL215Y29kZS5qcyIgIH0KfQ==
{
"type": "module",
"name": "mcapp",
"version": "1.0.0",
"description": "This is my first CLI app",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"bin":{ "hello":"./mycode.js" }
}
그리고 소스코드에는 다음과 같이 넣어줍니다
IyEvdXNyL2Jpbi9lbnYgbm9kZQppbXBvcnQgY2hhbGsgZnJvbSAiY2hhbGsiOwppZiAocHJvY2Vzcy5hcmd2WzNdID09PSB1bmRlZmluZWQpIHsKICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQucmVkKCdUd28gbnVtYmVycyByZXF1aXJlZCcpKTsKICAgIHByb2Nlc3MuZXhpdCgxKTsKfQpjb25zb2xlLmxvZyhOdW1iZXIocHJvY2Vzcy5hcmd2WzJdKSAqIE51bWJlcihwcm9jZXNzLmFyZ3ZbM10pKQ==
#!/usr/bin/env node
import chalk from "chalk";
if (process.argv[3] === undefined) {
console.log(chalk.bold.red('Two numbers required'));
process.exit(1);
}
console.log(Number(process.argv[2]) * Number(process.argv[3]))
이렇게 코드 변경 후 hello 10 실행하면 에러메세지가 붉게 나옵니다 곱하기의 계산은 순식간에 되겠지만 가상으로 프로그레스를 넣어봅시다
IyEvdXNyL2Jpbi9lbnYgbm9kZQppbXBvcnQgY2hhbGsgZnJvbSAiY2hhbGsiOwppbXBvcnQgcmVhZGxpbmUgZnJvbSAicmVhZGxpbmUiOwppZiAocHJvY2Vzcy5hcmd2WzNdID09PSB1bmRlZmluZWQpIHsKICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQucmVkKCdUd28gbnVtYmVycyByZXF1aXJlZCcpKTsKICAgIHByb2Nlc3MuZXhpdCgxKTsKfQooYXN5bmMgKCkgPT4gewogICAgbGV0IHBlcmNlbnQgPSAwOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgICBwZXJjZW50Kys7CiAgICAgICAgcmVhZGxpbmUuY3Vyc29yVG8ocHJvY2Vzcy5zdGRvdXQsIDApOwogICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGBQcm9ncmVzcyAke2NoYWxrLmJvbGQueWVsbG93KGAke3BlcmNlbnR9YCl9ICVgKTsKICAgICAgICBpZiAocGVyY2VudCA9PT0gMTAwKSBicmVhazsKICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgMjApKTsKICAgIH0KICAgIGNvbnNvbGUubG9nKCcnKTsKICAgIGNvbnNvbGUubG9nKGBSZXN1bHQgaXMgJHtjaGFsay5ib2xkLmdyZWVuKE51bWJlcihwcm9jZXNzLmFyZ3ZbMl0pICogTnVtYmVyKHByb2Nlc3MuYXJndlszXSkpfWApOwogICAgcHJvY2Vzcy5leGl0KDApOwp9KSgpOw==
#!/usr/bin/env node
import chalk from "chalk";
import readline from "readline";
if (process.argv[3] === undefined) {
console.log(chalk.bold.red('Two numbers required'));
process.exit(1);
}
(async () => {
let percent = 0;
while (true) {
percent++;
readline.cursorTo(process.stdout, 0);
process.stdout.write(`Progress ${chalk.bold.yellow(`${percent}`)} %`);
if (percent === 100) break;
await new Promise(r => setTimeout(r, 20));
}
console.log('');
console.log(`Result is ${chalk.bold.green(Number(process.argv[2]) * Number(process.argv[3]))}`);
process.exit(0);
})();
이렇게 하고 실행.