以工程化的思维完成重复性高的日常工作:合并代码文件
以工程化的思维完成重复性高的日常工作:合并代码文件
工程化(来自 GPT)
在不同的领域有不同的含义,但其核心思想是将艺术性、手工性的任务转变为可以标准化、系统化、流程化的过程。
在软件开发中,工程化通常指的是将软件开发过程标准化、流程化、自动化,使得整个软件开发过程更加高效、可控。例如,使用自动化构建工具,实现自动化测试、部署等。
在产品管理中,工程化可能涉及到将产品需求、设计、开发、测试、发布等环节进行流程化管理,以减少人为因素引起的误差,提升工作效率。
总的来说,工程化主要是通过应用科学的方法和工程的原理,将一些复杂的问题或任务分解为一系列的步骤和过程,使其能够被有效地管理和控制。
通过编写代码自动化重复性高的任务
- 提高效率
- 减少人为错误
- 方便复用和分享:当这些代码被封装成函数或模块
- 学习业务需求开发之外的知识,如 node、bash、Python、WebService、爬虫等 这种思维方式能帮助我们更有效地处理问题,节省时间和精力,提高生产力
背景
申请软著需要收集部分邻汇吧项目的源代码,涉及到6个项目。
源代码要求
- 起始包括登录等项目入口页面
- word 文档包含 60页
- 源代码没有特殊要求
操作步骤
- 创建 word 文件
- 复制项目多个文件(大概10个以上左右)的代码到 word 文件中
- 粘贴代码后可能出现不符合预期的文本格式,如 无代码缩进,字体过大等需要调整
- 重复以上操作到 6 个项目
操作痛点
在以上操作中,有几个麻烦的地方:
- 复制粘贴代码是比较繁琐,效率低下
- 可能出现人为错误,比如 复制了重复的文件
- 逆向操作比较复杂,比如 想删除其中几个文件的源代码
- 不可重复执行,即 无法方便的调整文件代码顺序,重新生成合并代码
抽象需求
把以上工作抽象成需求:合并n个文件生成到一个新文件,可以尝试用 node 完成
- 定义项目根路径:rootPath
- 定义需要合并的文件列表:files(在 vscode 中可以多选文件,然后邮件快速获取文件路径)
- 对 files 处理,拼接 rootPath
- 定义输出文件名称:xxx项目代码.docs
- 定义临时存储文件代码变量:data
- forEach 遍历 files,获取文件代码,追加到 data 中
- 将 data 输出到文件中
- 找到一个存在相关第三方依赖的项目,将脚本放进去,然后执行即可(比如 linhuiba_admin)
优化
- 多选文件技巧:vscode 多选中多个文件,然后右键即可复制选中文件的路径
- 如果 files 中存在文件夹,则深度遍历获取改文件夹下的所有文件(场景:想通过文件夹快速的获取文件夹下所有文件的代码,节约一个一个复制文件路径的时间)
- 排除 dist、node_modules 等文件
实例代码
运行
- 环境:随便放到一个具有文件内依赖的项目即可运行,如 linhuiba_admin
- 命令:
node code/index.js
code/index.js
/* 指令:合并文件内容 */
const fse = require('fs-extra');
const path = require('path');
const chalk = require('chalk');
const glob = require('glob');
const CONFIG = require('./config');
const start = () => {
const rootPath = CONFIG.rootPath || process.cwd();
// 要读取的文件列表
const files = CONFIG.files.map(item => path.join(rootPath, item));
let curFiles = [];
// 递归处理文件夹
files.forEach(item => {
if (/node_modules|dist|(\.temp)/.test(item)) {
return;
}
if (fse.statSync(item).isDirectory()) {
const deepFiles = glob.sync(item + '/**').filter(it => fse.statSync(it).isFile());
curFiles.push(...deepFiles);
} else {
curFiles.push(item);
}
});
curFiles = [...new Set(curFiles)];
let data = '';
curFiles.forEach((file) => {
data += fse.readFileSync(file, 'utf-8');
});
// 输出到执行脚本的根目录
const targetPath = path.join(process.cwd(), CONFIG.outputPath);
fse.writeFileSync(targetPath, data);
console.log(chalk.green('📣 已生成代码片段文件至:'), targetPath);
};
start();
code/config.js
// /Users/liuyajun/Work/Project/lcn-web
// const CONFIG = {
// rootPath: '/Users/liuyajun/Work/Project/lcn-web',
// files: [
// 'src/layout/components/Logo.tsx',
// 'src/layout/components/Login/index.tsx',
// 'src/layout/components/Login/index.module.less',
// 'src/layout/components/Login/components/CodeLogin.tsx',
// 'src/layout/components/Login/components/ChangeAccount.tsx',
// 'src/layout/components/Login/components/AccountLogin.tsx',
// 'src/index.tsx',
// 'src/global.less',
// 'src/app.tsx',
// 'src/views/user/pages/forget/entry.tsx',
// 'src/views/user/pages/forget/entry.module.less',
// 'src/views/demand/pages/index/entry.tsx',
// 'src/views/demand/pages/index/entry.module.less',
// 'src/views/demand/pages/index/components/Search.tsx',
// 'src/views/demand/pages/index/components/index.module.less',
// 'src/views/demand/pages/index/components/TableList/index.tsx',
// 'src/views/demand/pages/edit/entry.tsx',
// 'src/views/demand/pages/edit/entry.module.less',
// 'src/views/demand/pages/detail/entry.tsx',
// 'src/views/demand/pages/detail/entry.module.less',
// ],
// outputPath: 'LCN-PC端软件使用说明书.doc',
// };
// /Users/liuyajun/Work/Project/lcn-wap
const CONFIG = {
rootPath: '/Users/liuyajun/Work/Project/lcn-wap',
files: [
'src/views/auth/pages/login/entry.tsx',
'src/views/auth/pages/login/entry.module.less',
'src/index.tsx',
'src/global.less',
'src/app.tsx',
'src/views/home/pages/index/entry.tsx',
'src/views/home/pages/index/entry.module.less',
'src/views/home/pages/index/components/TodoItem.tsx',
'src/views/home/pages/index/components/ItemInfo.tsx',
'src/views/home/pages/index/components/index.module.less',
'src/views/home/pages/detail/entry.tsx',
'src/views/home/pages/detail/entry.module.less',
'src/views/home/pages/detail/components/Basic/index.tsx',
'src/views/home/pages/detail/components/Basic/index.module.less',
'src/views/home/pages/detail/components/Progress',
'src/views/edit/pages/index/entry.tsx',
'src/views/edit/pages/index/entry.module.less',
],
outputPath: 'LCN移动端软件使用说明书.doc',
};
module.exports = CONFIG;