1. 简介
命令行工具是一种非常实用的工具,通过简单的命令就能完成复杂的任务,不需要复杂的交互界面,特别适合用于工作自动化和批处理等领域。本文将带领大家使用node进行命令行开发,用简单的代码实现一个命令行压缩工具,方便大家对文件进行压缩。
2. 环境搭建
在开始开发前,我们需要先对环境进行配置。首先,请确保已经安装了node和npm。node是基于Chrome V8 JavaScript引擎的一个开放源代码、跨平台的javascript运行环境,我们可以用它来开发javascript程序。npm是node自带的包管理器,它能快速安装我们需要的模块。
安装好了环境以后,我们需要在命令行中输入以下命令安装我们需要的模块:
npm install yargs gzip-cli --save-dev
其中,yargs是一个轻量级的模块工具,可以帮助我们轻松创建命令行工具,gzip-cli是可用于在终端中进行gzip压缩和解压缩的命令行工具。在安装完以上两个模块后,我们就可以开始进行开发了。
3. 创建命令行工具
3.1 创建命令
我们的命令行工具需要支持压缩和解压缩两种操作,我们可以使用yargs模块来创建命令。在开始之前,请先新建一个文件夹,名字为"compress-tool",然后在命令行中进入该文件夹,输入以下代码:
npm init
命令行会要求您输入一些信息,如名称、版本号、描述、入口文件等信息,按照提示输入即可。然后创建一个新的js文件,命名为index.js。
在index.js文件中,我们需要引入yargs模块,并使用yargs的.command()方法来创建两个命令:compress和uncompress。代码如下:
const yargs = require('yargs');
yargs.command({
command: 'compress',
describe: 'compress files',
builder: {
src: {
describe: 'source file path or directory',
demandOption: true,
type: 'string'
},
out: {
describe: 'output file path or directory',
type: 'string'
}
},
handler: function(argv) {
console.log('Compressing ' + argv.src);
const gzip = require('gzip-cli');
if(argv.src.endsWith('.gz')) {
console.log('Source file is already gzipped.');
return;
}
let out = argv.out;
if(argv.src.endsWith('.txt')) {
out = out || argv.src + '.gz';
gzip.compressFile(argv.src, out, function(err) {
if(err) {
console.error(err);
} else {
console.log('File ' + argv.src + ' has been compressed to ' + out);
}
});
} else {
const glob = require('glob');
glob(argv.src + '/**/*.txt', function(err, files) {
if(err) {
console.error(err);
} else {
files.forEach(function(file) {
const outFile = out || file + '.gz';
gzip.compressFile(file, outFile, function(err) {
if(err) {
console.error(err);
} else {
console.log('File ' + file + ' has been compressed to ' + outFile);
}
});
});
}
});
}
}
});
yargs.command({
command: 'uncompress',
describe: 'uncompress files',
builder: {
src: {
describe: 'source file path or directory',
demandOption: true,
type: 'string'
},
out: {
describe: 'output file path or directory',
type: 'string'
}
},
handler: function(argv) {
console.log('Uncompressing ' + argv.src);
const gzip = require('gzip-cli');
if(!argv.src.endsWith('.gz')) {
console.log('Source file is not gzipped.');
return;
}
let out = argv.out;
if(argv.src.endsWith('.txt.gz')) {
out = out || argv.src.substring(0, argv.src.length - 3);
gzip.decompressFile(argv.src, out, function(err) {
if(err) {
console.error(err);
} else {
console.log('File ' + argv.src + ' has been uncompressed to ' + out);
}
});
} else {
const glob = require('glob');
glob(argv.src + '/**/*.txt.gz', function(err, files) {
if(err) {
console.error(err);
} else {
files.forEach(function(file) {
const outFile = out || file.substring(0, file.length - 3);
gzip.decompressFile(file, outFile, function(err) {
if(err) {
console.error(err);
} else {
console.log('File ' + file + ' has been uncompressed to ' + outFile);
}
});
});
}
});
}
}
});
yargs.parse();
3.2 创建选项
我们在创建命令时已经添加了src选项用于指定源文件路径或目录,out选项用于指定输出文件路径或目录。我们还可以使用yargs的.option()方法来添加更多的选项,比如添加一个--force选项,表示强制覆盖已有的压缩文件。代码如下:
yargs.command({
command: 'compress',
describe: 'compress files',
builder: {
src: {
describe: 'source file path or directory',
demandOption: true,
type: 'string'
},
out: {
describe: 'output file path or directory',
type: 'string'
},
force: {
describe: 'overwrite existing gzipped file',
type: 'boolean',
default: false
}
},
handler: function(argv) {
console.log('Compressing ' + argv.src);
const gzip = require('gzip-cli');
if(argv.src.endsWith('.gz')) {
console.log('Source file is already gzipped.');
return;
}
let out = argv.out;
if(argv.src.endsWith('.txt')) {
out = out || argv.src + '.gz';
if(!argv.force && fs.existsSync(out)) {
console.log('File ' + out + ' already exists. Use --force to overwrite.');
return;
}
gzip.compressFile(argv.src, out, function(err) {
if(err) {
console.error(err);
} else {
console.log('File ' + argv.src + ' has been compressed to ' + out);
}
});
} else {
const glob = require('glob');
glob(argv.src + '/**/*.txt', function(err, files) {
if(err) {
console.error(err);
} else {
files.forEach(function(file) {
const outFile = out || file + '.gz';
if(!argv.force && fs.existsSync(outFile)) {
console.log('File ' + outFile + ' already exists. Use --force to overwrite.');
return;
}
gzip.compressFile(file, outFile, function(err) {
if(err) {
console.error(err);
} else {
console.log('File ' + file + ' has been compressed to ' + outFile);
}
});
});
}
});
}
}
});
4. 测试工具
完成上述代码后,我们就可以测试我们的命令行工具了。在compress-tool文件夹中新建一个test.txt文件,并输入一些内容。然后在命令行中输入如下命令:
node index.js compress --src ./test.txt --out ./test.txt.gz
该命令会将test.txt文件压缩成test.txt.gz,并输出压缩成功的信息。我们也可以使用相对或绝对目录指定源文件和输出文件位置,如:
node index.js compress --src ./dir1/dir2 --out ./dir1/dir2
该命令会将dir2目录下的所有txt文件压缩成gz文件并输出到相同的目录下。
如果我们需要解压文件,可以输入以下命令:
node index.js uncompress --src ./test.txt.gz --out ./test.txt
该命令会将test.txt.gz文件解压成test.txt,并输出解压成功的信息。同样,我们也可以使用相对或绝对目录指定源文件和输出文件位置。
5. 总结
通过本文的介绍,我们了解了如何使用node和yargs模块来创建一个简单的命令行工具。我们可以自己定义命令、选项和处理程序,来满足我们的需求。命令行工具可以用于工作自动化和批处理等领域,是一个非常实用的工具。希望本文对大家有所帮助,谢谢阅读。