UNPKG

nyx_server

Version:

Node内容发布

164 lines (148 loc) 5.12 kB
/* global process */ /* global global */ /***************************************************************** 项目装载器 ******************************************************************/ var _ = require('lodash'); var path = require('path'); var template = require('./Template'); var Promise = require('bluebird'); var glob = require("glob"); var gitLoader = require("./GitClient"); var md5 = require("./utils/md5"); var mkdirp = require('mkdirp'); var projectMatchService = require('./ProjectMatchService'); var EmptyContext = require("./EmptyContext"); var isDev = global.nxyConfig.isDev; var Log = require("./log"); var logger = Log.getLogger("Cache_path"); var projects_cache_path = global.nxyConfig.projects_cache_path; logger.info("项目安装路径 : " + projects_cache_path); mkdirp.sync(projects_cache_path); var workProject = null; try { var cwd = process.cwd(); var packageInfo = require(path.join(cwd, 'package.json')); var version = packageInfo.version; var gitRepo = packageInfo.repository.url; var projectName = packageInfo.name; workProject = { "projectBaseDir": cwd, 'name': projectName, "gitRepo": gitRepo, 'version': version }; } catch (err) { if (isDev) { console.log('ProjectLoader err', err); logger.error("开发模式下必须有package.json文件"); process.exit(); } } module.exports.workProject = workProject; var pools = global.pools; function Project(basePath) { this.templates = {}; //模板 this.basePath = basePath; //项目的相对路径 this.initConfig(); this.name = this.config.name; if (pools) { pools.initProject(this); } var main = this.config.main; if (main) { var mainPath = path.join(this.basePath, main); this._project = require(mainPath); } else { this._project = {}; } } Project.prototype.initConfig = function() { var projectConfigPath = path.join(this.basePath, "package.json"); this.config = require(projectConfigPath); }; module.exports.Project = Project; /** * 装载当前项目的内容,这里主要是开发阶段使用 */ function loadLoaclProject() { var context = this.log ? this : EmptyContext; if (workProject != null) { var ret = loadProject.bind(context)(workProject); return ret; } } module.exports.loadLoaclProject = loadLoaclProject; /** * 装载远程项目 * @param {String}projectName 项目唯一标示 * @return Promise */ function loadProjects(projectNames) { var context = this.log ? this : EmptyContext; var log = context.log; var cache = context.cache; var projectFutureCache = cache.projectFutureCache; if (!projectFutureCache) { projectFutureCache = {}; cache.projectFutureCache = projectFutureCache; } if (!_.isArray(projectNames)) { projectNames = [projectNames]; } return Promise.resolve(projectNames).map(function(_projectName) { var projectName = _projectName.name; var projectFuture = projectFutureCache[projectName]; if (projectFuture) { return projectFuture; } else { if (workProject && projectName == workProject.name) { return loadLoaclProject(); } var p = projectMatchService.findProject.bind(context)(projectName).then(function(projectInfo) { log.info("项目信息,", projectInfo); var gitRepo = projectInfo.gitRepo; //项目git var version = projectInfo.version; //项目版本 var projectName = projectInfo.name; //项目名称 return gitLoader.loadResource.bind(context)(projectName, gitRepo, version, projects_cache_path); }).then(function(projectInfo) { return loadProject.bind(context)(projectInfo); }); return p; } }); } module.exports.loadProjects = loadProjects; /** * 装载项目包到projects目录 */ function loadProject(projectInfo) { var context = this.log ? this : EmptyContext; var log = context.log; var cache = context.cache || {}; var projectFutureCache = cache.projectFutureCache; if (!projectFutureCache) { projectFutureCache = {}; cache.projectFutureCache = projectFutureCache; } var projectBaseDir = projectInfo.projectBaseDir; var projectName = projectInfo.name; var version = projectInfo.version; //版本 var key = ""; if (isDev && workProject && workProject.name == projectName) { key = projectName; } else { key = projectName + "#" + (version || ""); } var projectFuture = projectFutureCache[key]; //使用唯一名称作为缓存key if (projectFuture) { log.info("使用缓存中项目,项目Key \"" + key + "\""); return projectFuture; } var retFuture = new Promise(function(resolve, reject) { var starter = new Project(projectBaseDir); resolve(starter); }); projectFutureCache[key] = retFuture; return retFuture; }