在Linux中使用Node.js创建命令行工具是一个强大且灵活的方式。下面我将详细介绍完整的实现步骤。
首先创建一个新项目目录并初始化:
mkdir my-cli-tool
cd my-cli-tool
npm init -y
touch index.js
chmod +x index.js
在文件开头添加shebang(告诉系统用node执行):
#!/usr/bin/env node
console.log("Hello from my CLI tool!");
添加bin
字段指定命令名称和入口文件:
{
"name": "my-cli-tool",
"version": "1.0.0",
"bin": {
"mycli": "./index.js"
}
}
使用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();
使用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}`);
});
使用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'));
使用ora
库:
npm install ora
示例:
const ora = require('ora');
const spinner = ora('Loading...').start();
setTimeout(() => {
spinner.succeed('Loading complete!');
}, 2000);
在开发过程中,可以使用npm link进行本地测试:
npm link
然后就可以在任何目录使用你定义的命令名称(如上面的mycli
)。
如果你想分享你的工具:
npm login
npm publish
这是一个简单的文件操作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`));
});
}
commander
自动生成帮助信息通过以上步骤,你可以创建一个功能丰富、用户友好的Linux命令行工具。根据你的需求,可以进一步扩展功能,如添加网络请求、数据库操作等复杂功能。