Skip to content

GitLab

  • Projects
  • Groups
  • Snippets
  • Help
    • Loading...
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in / Register
T treasure
  • Project overview
    • Project overview
    • Details
    • Activity
    • Releases
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 12
    • Issues 12
    • List
    • Boards
    • Labels
    • Service Desk
    • Milestones
  • Merge requests 0
    • Merge requests 0
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Operations
    • Operations
    • Incidents
    • Environments
  • Packages & Registries
    • Packages & Registries
    • Container Registry
  • Analytics
    • Analytics
    • CI/CD
    • Repository
    • Value Stream
  • Wiki
    • Wiki
  • External wiki
    • External wiki
  • Snippets
    • Snippets
  • Members
    • Members
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • FE
  • treasure
  • Issues
  • #189

Closed
Open
Created Sep 27, 2023 by liuyajun@liuyajunMaintainer

以工程化的思维完成重复性高的日常工作:合并代码文件

跳转邻汇大学查看

以工程化的思维完成重复性高的日常工作:合并代码文件

工程化(来自 GPT)

在不同的领域有不同的含义,但其核心思想是将艺术性、手工性的任务转变为可以标准化、系统化、流程化的过程。

在软件开发中,工程化通常指的是将软件开发过程标准化、流程化、自动化,使得整个软件开发过程更加高效、可控。例如,使用自动化构建工具,实现自动化测试、部署等。

在产品管理中,工程化可能涉及到将产品需求、设计、开发、测试、发布等环节进行流程化管理,以减少人为因素引起的误差,提升工作效率。

总的来说,工程化主要是通过应用科学的方法和工程的原理,将一些复杂的问题或任务分解为一系列的步骤和过程,使其能够被有效地管理和控制。

通过编写代码自动化重复性高的任务

  • 提高效率
  • 减少人为错误
  • 方便复用和分享:当这些代码被封装成函数或模块
  • 学习业务需求开发之外的知识,如 node、bash、Python、WebService、爬虫等 这种思维方式能帮助我们更有效地处理问题,节省时间和精力,提高生产力

背景

申请软著需要收集部分邻汇吧项目的源代码,涉及到6个项目。

image

源代码要求

  • 起始包括登录等项目入口页面
  • 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;
Edited Oct 10, 2023 by liuyajun
Assignee
Assign to
None
Milestone
None
Assign milestone
Time tracking