使用nodejs开发cli项目实例

下面是使用nodejs开发cli项目的完整攻略:

什么是CLI项目?

CLI(Command Line Interface)是指通过命令行界面与程序交互的方式。CLI项目是为命令行界面设计的应用程序。使用CLI项目可以在终端中执行特定的命令,实现特定的功能,比如,创建文件、删除文件、安装软件等。

开始构建CLI项目

  1. 创建项目文件夹

在终端中选择一个合适的位置,使用以下命令创建项目文件夹:

mkdir myCLI
  1. 初始化项目

在项目文件夹中执行以下命令初始化一个npm项目:

npm init -y
  1. 安装依赖

在终端中执行以下命令安装所需的依赖:

npm install commander inquirer chalk --save

上面这条命令用来安装使用CLI必备的三个npm模块:commander、inquirer和chalk。

  1. 创建代码文件

在项目文件夹内创建一个index.js文件。该文件将包含整个项目的代码。

  1. 编写CLI程序

编写CLI程序的过程可以看成是两个部分:定义命令和编写命令处理函数。

定义命令

在项目的index.js文件中编写以下代码,以定义CLI程序要支持的命令:

const { program } = require('commander');
program.version('0.1.0');

program
  .command('create <name>')
  .description('create a new project')
  .option('-s, --style <style>', 'add style language support')
  .option('-f, --force', 'overwrite existing files')
  .action((name, options) => {
    console.log('run create command', name, options);
  });

program.parse(process.argv);

上面这段代码定义了一个create命令,用于创建新的项目。该命令包含两个选项:-s和-f,在创建项目时可以使用这两个选项来指定一些参数。该命令使用console.log()函数来输出命令执行时的一些信息。

编写命令处理函数

在上面的代码中,以.action()方法指定了一个回调函数,在命令执行时将被调用。下面是一个示例回调函数:

const fs = require('fs');
const { promisify } = require('util');
const chalk = require('chalk');
const inquirer = require('inquirer');

const writeFile = promisify(fs.writeFile);

async function createApp(name, options) {
  // 检查是否指定了文件夹名字
  if (!name) {
    console.log(chalk.red('Please specify the project name'));
    return;
  }
  // 检查文件夹是否已存在
  const exists = fs.existsSync(name);
  if (exists && options.force) {
    console.log(chalk.yellow('Project exists, but overwriting existing files'));
    await createFiles(name); // 在已存在的文件夹中创建项目文件
    console.log(chalk.green('Project created successfully!'));
  } else if (exists) {
    console.log(chalk.red('Project already exists, please use another name or use the --force option to overwrite existing files!'));
  } else {
    await createFiles(name); // 创建一个新的文件夹和项目文件
    console.log(chalk.green('Project created successfully!'));
  }
}

async function createFiles(name) {
  // 创建新的文件夹
  fs.mkdirSync(name);

  // 创建package.json文件
  const pkg = {
    name,
    description: name,
    version: '1.0.0',
    scripts: {
      start: 'node index.js'
    },
    dependencies: {},
    devDependencies: {}
  };
  await writeFile(`${name}/package.json`, JSON.stringify(pkg, null, 2));

  // 创建index.js文件
  await writeFile(`${name}/index.js`, `console.log("Hello, ${name}!");\n`);
  console.log(chalk.green('Project files created successfully!'));
}

上面这段代码中,createApp()函数是实现“创建项目”逻辑的核心代码。在该函数中,主要做三件事:

  • 检查是否指定了文件夹名字;
  • 检查文件夹是否已存在,如果已存在,根据选项来覆盖原来的文件夹或者提示错误信息;
  • 在文件夹中创建项目文件。

createFiles()函数是具体用来创建项目文件的代码。

测试CLI程序

在完成编写CLI程序的过程以后,我们需要在终端中测试该程序。在终端中执行以下命令安装该程序:

npm install -g .

其中的“.”意味着将当前目录下的文件安装为全局模块。

安装好后,我们在终端中执行以下命令:

myCLI create myproject

执行该命令后,我们可以在当前目录下看到myproject文件夹被创建。如果多次执行同样的命令,可以看到不同的输出结果。

示例说明

下面我们通过两个实际例子说明如何使用nodejs开发CLI项目:

1. 创建文本文件

本例子中,我们将开发一个CLI程序用来在终端中创建文本文件。该程序需要接受文件名参数和文本内容参数,以便在特定位置创建一个文本文件,并把特定内容写入到该文件中。

首先初始化一个npm项目并安装需要的依赖:

npm init -y
npm install commander --save

然后,我们在项目根目录下创建一个index.js文件。在该文件中,我们定义了create命令,用于创建文本文件。该命令接收两个参数:文件名和文件内容,文件名是必需的,文件内容是可选的。如果不提供文件内容,则会创建一个空文件。

const fs = require('fs');
const { program } = require('commander');

program
  .command('create <filename> [content]')
  .description('create a new text file')
  .action((filename, content) => {
    console.log(`creating file "${filename}" with content "${content}"`);
    fs.writeFile(filename, content, function (err) {
      if (err) throw err;
      console.log('file saved!');
    });
  });

program.parse(process.argv);

当运行该程序时,我们需要在终端中输入以下命令:

node index.js create myFile.txt "Hello, world!"

这条命令将在当前目录下创建一个名为myFile.txt的文本文件,并将“Hello, world!”这个字符串写入到文件中。另外,如果只想创建一个空文件,则可以省略第二个参数。此时终端中的命令将变成:

node index.js create myFile.txt

2. 下载图片

本例子中,我们将开发一个CLI程序用来从图片URL中下载图片。我们将使用request和fs-extra两个扩展模块来实现该程序。

首先初始化一个npm项目并安装所需的依赖:

npm init -y
npm install commander request fs-extra --save

然后在项目根目录下创建一个index.js文件,该文件中我们定义了download命令。该命令接收一个参数:图片URL。在下载图片之前,先判断指定的文件夹是否存在,如果不存在则创建该文件夹。然后将图片下载并保存到该文件夹中。图片的名字将自动根据URL构建。

const fs = require('fs-extra');
const request = require('request');
const { program } = require('commander');

program
  .command('download <url>')
  .description('download an image')
  .action(async url => {
    const path = './images/';
    if (!fs.existsSync(path)) {
      fs.mkdirSync(path);
    }
    const imageName = url.split('/').pop();
    const dest = path + imageName;
    request(url)
      .pipe(fs.createWriteStream(dest))
      .on('close', () => {
        console.log('Image downloaded successfully!');
      })
      .on('error', err => {
        console.log(err.message);
      });
  });

program.parse(process.argv);

当运行该程序时,我们需要在终端中输入以下命令:

node index.js download https://www.example.com/image.jpg

这条命令将从https://www.example.com/image.jpg下载图片,并将其保存到./images/文件夹中。如果该文件夹不存在,则会先创建该文件夹。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用nodejs开发cli项目实例 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • 又拍云 Node.js 实现文件上传、删除功能

    以下是“又拍云 Node.js 实现文件上传、删除功能”的完整攻略: 准备工作 首先,你需要拥有一个又拍云的账号,并开通相应的存储服务。然后,在本地电脑上安装Node.js,使用npm包管理器安装以下的依赖库: npm install upyun npm install formidable 其中,upyun是用于操作又拍云存储服务的SDK,formidab…

    node js 2023年6月8日
    00
  • node.js中的buffer.Buffer.isEncoding方法使用说明

    来介绍一下Node.js中的Buffer.isEncoding()方法。 方法介绍 Buffer.isEncoding(encoding)方法用来判断字符串编码是否为Node.js支持的合法编码名。如果传入的encoding参数不是字符串编码名,该方法返回false。该方法的原型定义如下: Buffer.isEncoding(encoding: string…

    node js 2023年6月8日
    00
  • nodejs中的异步编程知识点详解

    Node.js中的异步编程知识点详解 什么是异步编程 在 Node.js 中,异步编程是非常常见的,它可以让程序更高效地利用资源,提高了程序的性能。 异步编程是指程序不需要等待某个操作完成,就能继续进行下一步操作。它通常会发送一些请求,然后继续执行其他任务,直到得到请求的响应后再执行相应的回调函数。 异步编程的优势 更高效的利用资源 在执行某个任务的同时,我…

    node js 2023年6月8日
    00
  • node中Express 动态设置端口的方法

    设置Express应用程序的端口是一个很常见的需求,可以通过以下两种方式实现动态设置端口: 1. 通过环境变量 可以通过设置环境变量来动态地设置Express应用程序的端口。这在使用Docker或类似的环境时非常有用,因为容器端口通常是动态分配的。 首先在应用程序中读取环境变量: const port = process.env.PORT || 3000; …

    node js 2023年6月8日
    00
  • Node.js使用Middleware中间件教程详解

    Node.js使用Middleware中间件教程详解 什么是中间件Middleware? Middleware中间件即为应用程序和操作系统之间的连接层,它允许进行定制化的代码挂载,实现对请求和响应的拦截,对数据进行一系列的处理和转派,以完成复杂的业务逻辑。 为什么要使用中间件Middleware? 在进行Web服务开发时,我们经常需要处理各种请求场景,例如:…

    node js 2023年6月8日
    00
  • JavaScript中MutationObServer监听DOM元素详情

    我来为您讲解一下JavaScript中MutationObServer监听DOM元素的完整攻略。 MutationObServer是什么? MutationObServer(简称为MO)是JavaScript的一个API,用于监听DOM元素的变化。它可以监听并监控DOM树结构的任何变化,当有改变发生时,它会执行一个回调函数并提供改变的具体细节。 使用Muta…

    node js 2023年6月8日
    00
  • Async/Await替代Promise的6个理由

    Async/Await替代Promise的6个理由 在JavaScript中,我们经常使用Promise来解决异步编程问题,但是ES2017引入了async/await语法,使异步编程更加简单和直观。以下是async/await替代Promise的6个理由: 1.更容易处理错误 使用Promise时,我们需要使用.then()和.catch()方法来处理成功…

    node js 2023年6月8日
    00
  • 浅谈TypeScript 用 Webpack/ts-node 运行的配置记录

    下面我将详细讲解“浅谈TypeScript 用 Webpack/ts-node 运行的配置记录”的完整攻略。 1. 准备工作 在开始配置前,我们需要做一些准备工作: 安装 Node.js 我们需要在本地安装 Node.js,来运行和打包 TypeScript 代码。 初始化项目 在项目的根目录下运行以下命令,初始化项目并创建一个 package.json 文…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部