nyx_server
Version:
Node内容发布
164 lines (148 loc) • 5.12 kB
JavaScript
/* 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;
}