UNPKG

rigjs

Version:

A multi-repos dev tool based on yarn and git.Rigjs is intended to be the simplest way to develop,share and deliver codes between different developers or different projects.

95 lines (91 loc) 3.26 kB
/** * @ignore * @Description nothing * @author Wang Bo (ralwayne@163.com) * @date 2020/10/9 6:14 PM */ import shell from 'shelljs'; import fs from 'fs'; import print from '../print'; import RigConfig from '@/classes/RigConfig'; import {Dep} from '@/classes/dependencies/Dep'; import pkg from '../../package.json'; // let semverReg = /^([0-9]+)\.([0-9]+)\.([0-9]+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z-]+)?$/; const clone = (target:string, dep:Dep) => { print.info(`cloning ${dep.name}`); let cloneProcess = shell.exec(`git clone ${dep.source} ${target}/${dep.name}`, {silent: true} ); if (cloneProcess.stderr && !fs.existsSync(`${target}/${dep.name}`)) { print.error(`clone failed:${dep.source}`); print.error(cloneProcess.stderr); process.exit(1); } } //加载命令控制器 export default async (cmd:any) => { print.info(`version:${pkg.version}`); print.info('start rig preinstall'); try { //读取package.rig.json5,生成配置对象 const rigConfig = RigConfig.createFromCWD(); //检查配置项格式是否正确 rigConfig.validate(); //检查依赖间的相互依赖是否有效 //创建rig_dev目录用来开发rig管理下的依赖 if (!(fs.existsSync('./rig_dev') && fs.lstatSync('./rig_dev').isDirectory())) { print.info('create folder rig_dev'); fs.mkdirSync('rig_dev'); fs.writeFileSync('rig_dev/.gitkeep', '') } shell.chmod('777', 'rig_dev'); let target = 'rig_dev'; let pkgJson = JSON.parse(fs.readFileSync('package.json').toString()); let dependencies = pkgJson['dependencies']; /** * 核心原则 * 1. install 不应该覆盖或删除已经clone到rig_dev下的模块,由开发者自己选择要不要删 * 2. rig_dev下的模块更新,由开发者自己git操作解决。 */ for (let rigName in rigConfig.dependencies) { const dep = rigConfig.dependencies[rigName]; dep.name = rigName; if (dep.dev) { //不去覆盖已下载的库 if (fs.existsSync(`${target}/${dep.name}`)) { print.info(`${dep.name} already exists.`); } else { clone(target, dep); } //删除package.json中的dev rig库,安装时忽略 delete dependencies[dep.name] //dev模式下使用workspace } else { //非dev得库使用远程地址安装 dependencies[dep.name] = `git+ssh://${dep.source}#${dep.version}` //不是开发中状态,不处理,不去删除已下载的模块 //预安装时在node_modules中要先清除json5里的库 if (fs.existsSync(`node_modules/${dep.name}`)) { if (fs.lstatSync(`node_modules/${dep.name}`).isSymbolicLink()){ fs.unlinkSync(`node_modules/${dep.name}`); } shell.rm('-rf', `node_modules/${dep.name}`); } } } //强制删除.yarn-integrity,重装依赖 if (fs.existsSync(`node_modules/.yarn-integrity`)) { shell.rm('-rf', `node_modules/.yarn-integrity`); } rigConfig.validateDeps(); //覆盖package.json pkgJson.dependencies = dependencies; fs.writeFileSync('package.json', JSON.stringify(pkgJson, null, 2)); //收尾 print.succeed(`preinstall SUCCEED! Will do "yarn install"`); //远程链接设置完成,开发库设置完成,准备执行yarn install } catch (e) { print.error(e.message); process.exit(1); } }