인프런 커뮤니티 질문&답변

이태희님의 프로필 이미지
이태희

작성한 질문수

[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지

cli 질문

해결된 질문

작성

·

129

0

cli 

inquire 를 만들었습니다.

그런데 cli 명령어를 칠 경우 해당명령어가 없다고 나옵니다.

아무래도 소스에서 이부분이 문제가 되고 있는거 같습니다.

if (args) {
            console.log('해당 명령어를 찾을 수 없습니다.');
            program.help();
        }

전체 소스 

#!/usr/bin/env node 
const { program } = require('commander');
const fs = require('fs');
const path = require('path');
const inquirer = require('inquirer');

const htmlTemplate = `
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>Template</title>
    </head>
    <body>
        <h1>Hello</h1>
        <p>CLI</p>
    </body>
</html>
`;

const routerTemplate = `
const express = require('express');
const router = express.Router();

router.get('/', (req, res, next) => {
    try {
        res.send('ok');
    } catch (error) {
        console.error(error);
        next(error);
    }
});

module.expores = router;
`;

const exist = (dir) => { // 폴더 존재 확인 함수
    try {
        fs.accessSync(dir, fs.constants.F_OK | fs.constants.R_OK | fs.constants.W_OK);
        return true;
    } catch (e) {
        return false;
    }
};

const mkdirp = (dir) => { // 경로 생성 함수 
    const dirname = path
        .relative('.', path.normalize(dir))
        .split(path.sep)
        .filter(p => !!p);
    dirname.forEach((d, idx) => {
        const pathBuilder = dirname.slice(0, idx + 1).join(path.sep);
        if (!exist(pathBuilder)) {
            fs.mkdirSync(pathBuilder);
        }
    });
};

const makeTemplate = (type, name, directory) => { // 템플릿 생성 함수 
    mkdirp(directory);
    if (type === 'html') {
        const pathToFile = path.join(directory, `${name}.html`);
        if (exist(pathToFile)) {
            console.error('이미 해당 파일이 존재합니다.');
        } else {
            fs.writeFileSync(pathToFile, htmlTemplate);
            console.log(pathToFile, '생성 완료');
        }
    } else if (type === 'express-router') {
        const pathToFile = path.join(directory, `${name}.js`);
        if (exist(pathToFile)) {
            console.error('이미 해당 파일이 존재합니다.');
        } else {
            fs.writeFileSync(pathToFile, routerTemplate);
            console.log(pathToFile, '생성 완료');
        }
    } else {
        console.error('html 또는 express-router 둘 중 하나를 입력하세요.');
    }
};

program 
    .version('0.0.1', '-v, --version')
    .name('cli')

program 
    .command('template <type>')
    .usage('<type> -- filename [filename] --path [path]')
    .description('템플릿을 생성합니다.')
    .alias('tmpl')
    .option('-f --filename [filename]', '파일명을 입력하세요', 'index')
    .option('-d --directory [path]', '생성 경로를 입력하세요', '.')
    .action((type, options) => {
        makeTemplate(type, options.filename, options.directory);
    });

program
    .action((cmd, args) => {
        if (args) {
            console.log('해당 명령어를 찾을 수 없습니다.');
            program.help();
        } else {
            inquirer.prompt([{
                type: 'list',
                name: 'type',
                message: '템플릿 종류를 선택하세요.',
                choices: ['html', 'express-router'],
            }, {
               type: 'input',
               name: 'name',
               message: '파일의 이름을 입력하세요.',
               default: 'index',
            }, {
               type: 'input',
               name: 'directory',
               message: '파일이 위치할 폴더의 경로를 입력하세요.',
               default: '.',
            }, {
               type: 'confirm',
               name: 'confirm',
               message: '생성하시겠습니까?', 
            }])
            .then((answers) => {
                if (answers.confirm) {
                    makeTemplate(answers.type, answers.name, answers.directory);
                    console.log('터미널을 종료합니다.');
                }
            });
        }
    })
    .parse(process.argv);

답변 1

1

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

commander 버전을 확인해보세요. 제 강좌는 5버전 기준입니다. 현재 7버전 나왔는데 7버전 쓰면 작동하지 않습니다.

이태희님의 프로필 이미지
이태희

작성한 질문수

질문하기