最近在开发一个构建工具,需要操作版本管理系统,实现代码提交(如:svn add, svn commit…),GitHub上有类似的库,但存在两个问题:
- 长久没人维护,使用人数较少;
- 只支持git或svn;
基于我需要兼容git和svn,于是自己简单实现一个版本管理模块:version-control,下面将简单记录一下设计中的一些考虑和遇到的一些问题。
由于开发时间有限和本人使用场景较为简单,若你想使用version-control,请先自行评估是否能满足你的需求,当然作为开源项目,欢迎提issue,发PR。
目录
- 【思路】node下的版本管理模块实现;
- 【思路】 如何优雅兼容svn和git操作;
- 【问题】中文显示的问题;
- 【问题】svn本地版本和线上服务器版本不一致问题;
- 【问题】svn 如何add所有文件;
- 【问题】svn log没有显示刚刚commit的信息;
- 【TODO】
一、node下的版本管理模块实现思路
回想我们在没有GUI版本管理工具的时候是怎么进行版本操作的:敲命令行,于是自然想到实现思路:基于node执行指定命令行来实现版本操作。
这里要注意的是,Windows下在命令行中不一定有git或者svn的执行环境,需要安装额外的安装包,由于Mac OS暂时没有这个问题,所以我还没有做处理。
// node执行命令
const child_process = require('child_process');
module.exports = (command, cwd) => new Promise((resolve, reject) => {
child_process.exec(command, {
cwd }, (err, stdout) => {
if (err) reject(err);
else resolve(stdout);
});
});
二、如何优雅兼容svn和git操作
凡是说到兼容,我就会想到抽象,站在用户的角度,要完成的任务是版本管理,并不太在意具体用哪些命令。于是我从svn和git操作中跳脱出来,只关心用户需要,针对用户需要,梳理出以下几个接口:
- 查看当前文件修改状态:VersionControl.status
- 更新代码:VersionControl.update
- 提交代码:VersionControl.commit
- 版本回退:VersionControl.revert
确定了抽象接口之后,我采用动态引入的方式兼容svn和git,并在架构上进行作用域隔离,单独维护svn操作逻辑和git操作逻辑:
VersionControl在实例化的时候判断用户需要svn还是git,根据用户需要引入底层实现,最后在对外接口中调用具体的底层实现来实现svn和git兼容。
/**
* VersionControl
*