UNPKG

5.36 kBJavaScriptView Raw
1var fs = require('fs');
2var mkdirp = require('mkdirp');
3var path = require('path');
4var _ = require("underscore");
5var debug = require('debug')('clam:project');
6var config = require('./config.js');
7var util = require('util');
8var hostSwitch = require('./hosts.js');
9var http = require('http');
10
11//默认项目配置信息
12var initConf = {
13 name: '',
14 pageext: ["html"], // html | vm
15 pagedirlevel: ["single"], // single | multi
16 build: ["merge"], // merge | combo
17 charset: ["gbk", "utf-8"],
18 pagesDir: 'src/pages',
19 modsDir: 'src/mods',
20 widgetsDir: 'src/widgets',
21 buildDir: 'build',
22 testsDir: 'tests',
23 cdnPath: '',
24 port: [80, 443],
25 urls: {},
26 hosts: '',
27 hostsMap: {}, // 域名代理
28 json: [],
29 filter: {}
30};
31
32//用户项目目录
33var prjDir = '.';
34
35/**
36 * 返回或者设置项目信息
37 * 如果传入参数为空,则返回项目信息。
38 * 如果传入参数不为空,则设置项目信息。
39 * 设置的项目信息最后保存到.clam/project.json中
40 * @param dir 某个项目的子孙目录,此参数被用来寻找项目的根目录
41 * @param prj 需要设置的项目元数据
42 */
43exports = module.exports = function (prj) {
44 prjDir = config.root();
45 debug('项目目录:%s', prjDir);
46 var state = prjState(prjDir);
47 debug('项目状态:%s', state);
48 if (!prj) {
49 var info = getProject(prjDir, state);
50 return info;
51 }
52
53 var actions = [];
54 if (state !== 'normal') {
55 if (state === 'blank') {
56 var pagesFullDir = path.join(prjDir, initConf.pagesDir);
57 mkdirp.sync(pagesFullDir);
58 actions.push({action: '创建页面目录', content: pagesFullDir});
59
60 var modsFullDir = path.join(prjDir, initConf.modsDir);
61 mkdirp.sync(modsFullDir);
62 actions.push({action: '创建模块目录', content: modsFullDir});
63
64 var widgetsFullDir = path.join(prjDir, initConf.widgetsDir)
65 mkdirp.sync(widgetsFullDir);
66 actions.push({action: '创建组件目录', content: widgetsFullDir});
67
68 var buildFullDir = path.join(prjDir, initConf.buildDir);
69 mkdirp.sync(buildFullDir);
70 actions.push({action: '创建构建目录', content: buildFullDir});
71
72 var testsFullDir = path.join(prjDir, initConf.testsDir);
73 mkdirp.sync(testsFullDir);
74 actions.push({action: '创建测试目录', content: testsFullDir});
75 }
76 prj = initConf;
77 var dirs = prjDir.split(path.sep);
78 prj.name = dirs[dirs.length - 1];
79 }
80
81
82 var oldPrj = config.get('project') || prj;
83 if (oldPrj.hosts && prj.hosts && oldPrj.hosts !== prj.hosts) {
84 hostSwitch.setHosts(prj.hosts);
85 actions.push({action: '更新hosts文件', content: '操作系统hosts文件'});
86 }
87 for (var k in prj) {
88 oldPrj[k] = prj[k];
89 }
90
91 config.set('project', oldPrj);
92 actions.push({action: '更新项目元文件', content: '.clam/project.json'});
93
94 //getMuiConfig();
95 //actions.push({action: '更新项目gconfig文件', content: '.clam/gconfig.json'});
96
97 return {
98 succeed: true,
99 msg: '更新项目信息',
100 data: actions
101 };
102}
103/**
104 * 设置cdn的跳转规则
105 */
106exports.setUrls = function (urls) {
107 if (!urls) {
108 return {
109 succeed: false,
110 msg: '更新项目信息',
111 data: actions
112 };
113 }
114 prjDir = config.root();
115 var prj = config.get('project');
116 prj.urls = urls;
117 config.set('project', prj);
118 config.set('project', prj);
119 var actions = [];
120 actions.push({action: '更新项目元文件', content: '.clam/project.json'});
121 return {
122 succeed: true,
123 msg: '更新项目信息',
124 data: actions
125 };
126}
127/**
128 * 获取项目信息
129 * @param prjDir 项目根目录
130 * @param state 当前项目状态
131 * @return {Object} 项目信息
132 */
133function getProject(prjDir, state) {
134 //正常项目的元数据完全从配置文件中获取
135 if (state === 'normal') {
136 return config.get('project');
137 }
138
139 var prjInfo = {
140 state: state,
141 prjDir: prjDir
142 };
143
144 //异常项目的数据从默认配置中复制
145 for (var conf in initConf) {
146 prjInfo[conf] = initConf[conf];
147 }
148
149 var dirs = prjDir.split(path.sep);
150 prjInfo.name = dirs[dirs.length - 1];
151 return prjInfo;
152}
153
154/**
155 * 返回项目状态
156 * @param root 项目根目录
157 * @return {String} normal => 包含.clam目录|past => 不包含.clam且项目目录不为空|blank => 不包含.clam且项目目录为空
158 */
159function prjState(root) {
160 var state = 'normal';
161 if (!fs.existsSync(path.join(root, '.clam'))) {
162 state = 'past';
163 var list = fs.readdirSync(root);
164 list = _.filter(list, function (file) {
165
166 return !(/^\..+/.test(file));
167 });
168 if (list.length === 0) {
169 state = 'blank';
170 }
171 }
172 return state;
173}
174
175/**
176 * 从mui服务器上拉去最新的 globalConfig,在项目创建时自动生成
177 */
178function getMuiConfig() {
179 var remoteUrl = 'http://demo.mui.tmall.net/gitsrc/seed/build/config.json';
180 var req = http.request(remoteUrl, function (res) {
181 var str = '';
182 res.on('data', function (d) {
183 str += d;
184 });
185 res.on('end', function () {
186 try {
187 config.set('gconfig', JSON.parse(str.toString()));
188 }
189 catch (e) {
190 config.set('gconfig', {});
191 }
192 process.exit(0);
193 });
194 res.on('error', function () {
195 debug('远程获取gconfig失败!', '');
196 process.exit(0);
197 });
198 });
199 req.end();
200}