UNPKG

goldpankit

Version:

GoldPanKit是一款极速研发套件,可在套件中快速构建各类技术框架和项目。开源作者可发布自己的项目,并为其设定金额,实现开源项目的盈利。

99 lines (98 loc) 3.65 kB
const Const = require('./constants/constants') const fs = require('./utils/fs') const object = require("./utils/object"); const serviceConf = require('./service.config') const log = require('./utils/log') const projectService = require('./project') const path = require('path') module.exports = { /** * 写入差异文件 * @param dto 参数 * { * projectId: null, * diffFiles: [] * } */ writeDiffFiles (dto) { const projectId = dto.projectId const diffFiles = dto.diffFiles const project = projectService.findConfigById(projectId) log.debug(`${project.name}: auto-merging for ${diffFiles.length} files.`) let mergeCount = 0 let deletedCount = 0 for (const file of diffFiles) { // 目录,不做处理 if (file.filetype === 'DIRECTORY') { continue } // 获取相对路径 const relativePath = file.filepath // kit.json为项目配置文件,不允许操作 if (relativePath === Const.SERVICE_CONFIG_FILE) { continue } const filepath = path.join(project.codespace, relativePath) // 如果为已删除文件,则删除文件 if (file.operaType === 'DELETED') { fs.deleteFile(filepath) // 删除空目录 let dirpath = fs.getDirectory(filepath) while (fs.isEmptyDirectory(dirpath) && project.codespace !== dirpath) { fs.deleteDirectory(dirpath) dirpath = fs.getDirectory(dirpath) } deletedCount++ continue } // 创建文件 if (file.contentEncode === 'base64') { const content = Buffer.from(file.content, 'base64') fs.createFile(filepath, content, true) } else { fs.createFile(filepath, file.content, true) } mergeCount++ } // 给出文件写入提醒 log.success(`diff: merge ${mergeCount} files, deleted ${deletedCount} files.`) }, /** * 获取文件设置 * @param codespace 代码空间 * @param fileRelativePath 文件相对路径 * @returns {any} */ getFileSetting (codespace, fileRelativePath) { const configPath = serviceConf.__getConfigPath(codespace) const config = fs.readJSONFile(configPath) const setting = JSON.parse(JSON.stringify(Const.SERVICE_FILE_CONFIG_CONTENT)) let targetSettings = config.settings.find(file => file.path === fileRelativePath) if (targetSettings != null) { object.merge(targetSettings, setting) } // 没有设置过的文件不会产生配置文件,此时path为空,此处设定path值 setting.path = fileRelativePath // 如果当前文件的编译模式为空,找出实际编译模式(为空时继承上级编译模式) setting._actualCompiler = setting.compiler if (setting.compiler == null || setting.compiler === '') { // 先按照路径的层级进行倒序排列,然后依次startsWith,找出最近的上级节点 config.settings.sort((item1, item2) => { const item1Level = fs.toLinuxPath(item1.path).split('/').length const item2Level = fs.toLinuxPath(item2.path).split('/').length return item2Level - item1Level }) for (const item of config.settings) { if (setting.path.startsWith(item.path) && item.compiler != null && item.compiler !== '') { setting._actualCompiler = item.compiler break } } // 如果没有匹配到上级设置了编译器,则使用服务编译器 if (setting._actualCompiler == null || setting._actualCompiler === '') { setting._actualCompiler = config.compiler } } return setting } }