插件窝 干货文章 Linux中怎么用Node.js写一个命令行工具

Linux中怎么用Node.js写一个命令行工具

console options chalk const 65    来源:    2025-04-25

使用Node.js创建Linux命令行工具指南

在Linux中使用Node.js创建命令行工具是一个强大且灵活的方式。下面我将详细介绍完整的实现步骤。

1. 初始化项目

首先创建一个新项目目录并初始化:

mkdir my-cli-tool
cd my-cli-tool
npm init -y

2. 设置可执行文件

创建主文件

touch index.js
chmod +x index.js

在文件开头添加shebang(告诉系统用node执行):

#!/usr/bin/env node

console.log("Hello from my CLI tool!");

修改package.json

添加bin字段指定命令名称和入口文件:

{
  "name": "my-cli-tool",
  "version": "1.0.0",
  "bin": {
    "mycli": "./index.js"
  }
}

3. 开发核心功能

处理命令行参数

使用Node.js内置的process.argv或更强大的库如commander

npm install commander

示例代码:

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

program
  .version('1.0.0')
  .description('A simple CLI tool built with Node.js')
  .option('-d, --debug', 'output extra debugging')
  .option('-n, --name <name>', 'your name')
  .parse(process.argv);

const options = program.opts();

if (options.debug) console.log('Debug mode is on');
if (options.name) console.log(`Hello, ${options.name}!`);

添加子命令

program
  .command('greet <name>')
  .description('greet someone')
  .action((name) => {
    console.log(`Hello, ${name}!`);
  });

program.parse();

4. 添加交互功能

使用inquirer库创建交互式CLI:

npm install inquirer

示例:

const inquirer = require('inquirer');

inquirer
  .prompt([
    {
      type: 'input',
      name: 'username',
      message: 'What is your name?'
    },
    {
      type: 'list',
      name: 'color',
      message: 'Choose a color',
      choices: ['red', 'green', 'blue']
    }
  ])
  .then(answers => {
    console.log(`Hello ${answers.username}, you chose ${answers.color}`);
  });

5. 添加彩色输出

使用chalk库:

npm install chalk

示例:

const chalk = require('chalk');

console.log(chalk.blue('This is blue text'));
console.log(chalk.bgRed.white('White text on red background'));

6. 添加加载动画

使用ora库:

npm install ora

示例:

const ora = require('ora');

const spinner = ora('Loading...').start();

setTimeout(() => {
  spinner.succeed('Loading complete!');
}, 2000);

7. 本地测试

在开发过程中,可以使用npm link进行本地测试:

npm link

然后就可以在任何目录使用你定义的命令名称(如上面的mycli)。

8. 发布到npm(可选)

如果你想分享你的工具:

  1. 创建npm账号
  2. 登录:npm login
  3. 发布:npm publish

9. 完整示例

这是一个简单的文件操作CLI工具示例:

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

program
  .version('1.0.0')
  .description('A file operations CLI tool')
  .option('-l, --list', 'list files in current directory')
  .option('-c, --create <filename>', 'create a new file')
  .option('-d, --delete <filename>', 'delete a file');

program.parse(process.argv);

const options = program.opts();

if (options.list) {
  const spinner = ora('Listing files...').start();
  fs.readdir(process.cwd(), (err, files) => {
    spinner.stop();
    if (err) {
      console.error(chalk.red(err.message));
      return;
    }
    console.log(chalk.green('\nFiles in current directory:'));
    files.forEach(file => console.log(`- ${file}`));
  });
}

if (options.create) {
  fs.writeFile(options.create, '', err => {
    if (err) {
      console.error(chalk.red(err.message));
      return;
    }
    console.log(chalk.green(`File ${options.create} created successfully`));
  });
}

if (options.delete) {
  fs.unlink(options.delete, err => {
    if (err) {
      console.error(chalk.red(err.message));
      return;
    }
    console.log(chalk.green(`File ${options.delete} deleted successfully`));
  });
}

10. 最佳实践

  1. 错误处理:始终处理可能出现的错误
  2. 帮助文档:使用commander自动生成帮助信息
  3. 用户友好:提供清晰的输出和错误信息
  4. 测试:为你的CLI工具编写测试
  5. 日志:考虑添加日志功能记录重要操作

通过以上步骤,你可以创建一个功能丰富、用户友好的Linux命令行工具。根据你的需求,可以进一步扩展功能,如添加网络请求、数据库操作等复杂功能。