返回

初窥 Node.js 命令行程序开发-通过交互式指令拉取代码

前端

看到vue-cli可以用交互式的命令来生成一个项目感觉很好玩,所以我也来学学如何做。通过在命令行交互式输入项目名、版本号、选择模板地址后远程(github/gitlab)拉取代码到本地并创建项目。搜索到了一篇Node.js 命令行程序开发教程,瞬间就有了方向。

像vue-cli这样的脚手架,它的主要功能是通过命令行交互式输入信息,创建和初始化一个项目,比如项目名、选择模板、版本号等等,运行的时候脚手架会按照用户的选择自动生成项目结构和项目文件。

让我觉得最神奇的地方在于它能够交互式地输入信息,并且能够在命令行输出各种各样的提示信息。在我看来这就是命令行程序的魅力所在,有了它可以做很多有意思的事情,例如像vue-cli那样根据用户的输入来创建项目,又或者是根据用户的输入来做一些自动化运维等等。

1. 入门

1.1 安装Node.js

首先需要在电脑上安装好Node.js,因为Node.js命令行程序需要依赖Node.js运行。在Node.js官网下载并安装对应电脑系统的安装包,安装完成后在命令行输入以下命令检查是否安装成功:

node -v

如果能正常显示Node.js的版本号,就说明安装成功了。

1.2 创建项目

创建一个名为my-cli的Node.js项目,在命令行中输入以下命令:

mkdir my-cli && cd my-cli

然后初始化一个npm项目,在命令行中输入以下命令:

npm init -y

这一步会生成一个package.json文件,它是Node.js项目的配置文件。

1.3 安装必要的依赖

接下来,我们需要安装必要的依赖库,在命令行中输入以下命令:

npm install inquirer

inquirer是一个命令行交互式输入库,它可以帮助我们轻松地创建交互式命令行程序。

2. 编写代码

2.1 创建一个简单的交互式命令行程序

在my-cli项目中创建一个名为index.js的文件,并输入以下代码:

const inquirer = require('inquirer');

inquirer.prompt([
  {
    type: 'input',
    name: 'projectName',
    message: 'What is the name of your project?'
  },
  {
    type: 'input',
    name: 'projectVersion',
    message: 'What is the version of your project?'
  },
  {
    type: 'list',
    name: 'projectTemplate',
    message: 'Which project template do you want to use?',
    choices: ['Empty Project', 'React Project', 'Vue Project']
  },
]).then((answers) => {
  console.log('Project Name:', answers.projectName);
  console.log('Project Version:', answers.projectVersion);
  console.log('Project Template:', answers.projectTemplate);
});

这段代码使用inquirer创建了一个简单的交互式命令行程序,它可以询问用户项目名、项目版本和项目模板。

2.2 运行程序

在命令行中输入以下命令来运行程序:

node index.js

程序运行后,它会向用户询问项目名、项目版本和项目模板,用户输入信息后,程序会将这些信息打印到控制台。

3. 进阶

3.1 使用命令行参数

我们可以使用命令行参数来传递信息给程序,在index.js文件中添加以下代码:

const args = process.argv.slice(2);

if (args.length > 0) {
  console.log('Project Name:', args[0]);
  console.log('Project Version:', args[1]);
  console.log('Project Template:', args[2]);
} else {
  inquirer.prompt([
    {
      type: 'input',
      name: 'projectName',
      message: 'What is the name of your project?'
    },
    {
      type: 'input',
      name: 'projectVersion',
      message: 'What is the version of your project?'
    },
    {
      type: 'list',
      name: 'projectTemplate',
      message: 'Which project template do you want to use?',
      choices: ['Empty Project', 'React Project', 'Vue Project']
    },
  ]).then((answers) => {
    console.log('Project Name:', answers.projectName);
    console.log('Project Version:', answers.projectVersion);
    console.log('Project Template:', answers.projectTemplate);
  });
}

这段代码判断了命令行参数的长度,如果命令行参数的长度大于0,就使用命令行参数作为项目名、项目版本和项目模板,否则就使用inquirer来交互式地输入信息。

3.2 使用模板引擎

我们可以使用模板引擎来生成项目文件,在index.js文件中添加以下代码:

const ejs = require('ejs');

const template = `
  module.exports = {
    name: '<%= projectName %>',
    version: '<%= projectVersion %>',
    template: '<%= projectTemplate %>'
  };
`;

const output = ejs.render(template, {
  projectName: args[0] || answers.projectName,
  projectVersion: args[1] || answers.projectVersion,
  projectTemplate: args[2] || answers.projectTemplate
});

console.log(output);

这段代码使用ejs模板引擎来生成一个项目配置文件,并将项目名、项目版本和项目模板作为模板变量传递给模板引擎。

3.3 创建项目

最后,我们可以使用模板引擎生成的项目配置文件来创建项目,在index.js文件中添加以下代码:

const fs = require('fs');

fs.mkdirSync(args[0] || answers.projectName);
fs.writeFileSync(`${args[0] || answers.projectName}/package.json`, output);

这段代码使用fs模块来创建项目目录和项目配置文件。

4. 结语

通过以上步骤,我们就编写了一个简单的Node.js命令行程序,它可以交互式地输入信息,并且能够根据输入的信息来生成项目文件。希望这篇教程能够帮助你入门Node.js命令行程序开发。