最近在用NodeJS写项目,无奈查找关联引用太麻烦,因此萌生了写一个FindUsages小工具的想法。
// 公用包
var fs = require('fs-extra'); // 基于fs组建开发的封装
var glob = require('glob'); // 可全局(渗透)查找相关后缀的文件
var path = require('path'); // 用于处理文件路径,主要是配合glob一起用的
var readline = require('readline'); // 用于以行形式读取文本类文件,这里是用于查找 line和index
废话不多说,直接贴代码。
// 命令行参数处理
var args = process.argv.splice(2);
let targetModel = args[0]; // 目标引用模型,也就是查询引用了该模型的文件
let ext = args[1] || 'js'; // 从哪种拓展名文件搜索,默认是 js文件
// 封装通用方法
function hasTarget (content) { // 用于判断是否包含目标引用
let index = content.indexOf(targetModel);
return [index >= 0, index]; // 返回 是否存在引用和引用所在位置的封装数组
}
// 开始查找
if (targetModel) { // 判断是否传入了应用名
var targetDir = path.resolve(__dirname, './'); // __dirname 则是当前文件夹
var globPath = targetDir + '/**/*.' + ext;
glob.sync(globPath).forEach((file) => {
var isExistTarget = false; // 用于判断该文件是否引用了目标
var lineCount = 1; // 用于记录引用行数
var lineIndex = []; // 用于记录每一行的引用位置
var rl = readline.createInterface({ // 创建行阅读组建的实例
input: fs.createReadStream(file, {enconding: 'utf8'}),
output: null
});
rl.on('line', (lineContent) => { // 添加行阅读事件
let result = hasTarget(lineContent);
if (result[0]) { // 如果该行存在引用
isExistTarget = true; // 标志该文件引用了目标
lineIndex.push(lineCount + ':' + result[1]); // 记录该行数以及该行首个引用位置
}
lineCount++;
}).on('close', () => { // 添加实例关闭事件
if (isExistTarget) { // 如果引用了目标,则打印文件相对路径以及引用行数和引用位置
console.log(file.substr(__dirname,length) + ' Lines: ' + lineIndex.join(' '));
console.log('--------华丽的分割线--------');
}
});
});
}
// 使用方法
// node 工具名 引用名 [拓展名(要从什么类型文件中搜索)]
node findUsages glob js
// 相关开源
// FindUsages 开源链接
https://www.npmjs.com/package/find_usages
// 个人开源
// https://github.com/ChangedenCZD
// 个人网站
// http://www.changeden.net