@modern-js/monorepo-tools 2.0.0-beta.0 → 2.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +76 -0
- package/dist/js/modern/cli/new.js +0 -3
- package/dist/js/modern/commands/build.js +4 -9
- package/dist/js/modern/dag/create.js +8 -15
- package/dist/js/modern/dag/edge-manager.js +0 -10
- package/dist/js/modern/dag/operator.js +14 -57
- package/dist/js/modern/dag/task.js +0 -18
- package/dist/js/modern/dag/utils.js +13 -31
- package/dist/js/modern/features/build/index.js +8 -19
- package/dist/js/modern/features/clear/index.js +0 -1
- package/dist/js/modern/features/deploy/index.js +7 -35
- package/dist/js/modern/features/dev/cmds.js +1 -0
- package/dist/js/modern/features/dev/create-task.js +2 -13
- package/dist/js/modern/features/dev/index.js +4 -11
- package/dist/js/modern/features/dev/watch-projects-state.js +0 -19
- package/dist/js/modern/features/install/index.js +0 -12
- package/dist/js/modern/index.js +1 -2
- package/dist/js/modern/log/multi-tasks-log.js +8 -31
- package/dist/js/modern/log/time.js +0 -3
- package/dist/js/modern/log/utils.js +0 -2
- package/dist/js/modern/package/index.js +0 -8
- package/dist/js/modern/parse-config/index.js +3 -6
- package/dist/js/modern/parse-config/monorepo.js +0 -23
- package/dist/js/modern/projects/check-project-change.js +4 -16
- package/dist/js/modern/projects/get-projects-by-packages-config.js +12 -29
- package/dist/js/modern/projects/get-projects-by-workspace-file.js +0 -16
- package/dist/js/modern/projects/get-projects.js +4 -29
- package/dist/js/modern/utils/install.js +0 -2
- package/dist/js/node/cli/build-watch.js +0 -3
- package/dist/js/node/cli/build.js +0 -3
- package/dist/js/node/cli/clear.js +0 -3
- package/dist/js/node/cli/deploy.js +0 -3
- package/dist/js/node/cli/index.js +0 -12
- package/dist/js/node/cli/install.js +0 -3
- package/dist/js/node/cli/new.js +0 -7
- package/dist/js/node/commands/build-watch.js +0 -6
- package/dist/js/node/commands/build.js +2 -14
- package/dist/js/node/commands/clear.js +0 -5
- package/dist/js/node/commands/deploy.js +0 -9
- package/dist/js/node/commands/index.js +0 -10
- package/dist/js/node/commands/install.js +0 -6
- package/dist/js/node/dag/create.js +8 -17
- package/dist/js/node/dag/edge-manager.js +0 -12
- package/dist/js/node/dag/index.js +0 -4
- package/dist/js/node/dag/operator.js +14 -65
- package/dist/js/node/dag/task.js +0 -23
- package/dist/js/node/dag/utils.js +12 -39
- package/dist/js/node/features/build/index.js +8 -29
- package/dist/js/node/features/clear/index.js +0 -15
- package/dist/js/node/features/deploy/index.js +7 -53
- package/dist/js/node/features/dev/cmds.js +1 -0
- package/dist/js/node/features/dev/create-task.js +2 -22
- package/dist/js/node/features/dev/index.js +4 -19
- package/dist/js/node/features/dev/watch-projects-state.js +0 -25
- package/dist/js/node/features/install/index.js +0 -25
- package/dist/js/node/hooks/index.js +0 -2
- package/dist/js/node/index.js +2 -16
- package/dist/js/node/locale/index.js +0 -4
- package/dist/js/node/log/error.js +0 -2
- package/dist/js/node/log/multi-tasks-log.js +8 -34
- package/dist/js/node/log/time.js +0 -10
- package/dist/js/node/log/utils.js +0 -4
- package/dist/js/node/package/index.js +0 -10
- package/dist/js/node/parse-config/index.js +3 -14
- package/dist/js/node/parse-config/monorepo.js +0 -34
- package/dist/js/node/projects/check-project-change.js +4 -33
- package/dist/js/node/projects/clear-memory-files.js +0 -8
- package/dist/js/node/projects/get-projects-by-packages-config.js +12 -41
- package/dist/js/node/projects/get-projects-by-workspace-file.js +0 -36
- package/dist/js/node/projects/get-projects.js +4 -37
- package/dist/js/node/utils/install.js +0 -11
- package/dist/js/node/utils/language.js +0 -2
- package/dist/types/cli/clear.d.ts +2 -1
- package/dist/types/cli/deploy.d.ts +2 -1
- package/dist/types/commands/clear.d.ts +2 -1
- package/dist/types/commands/deploy.d.ts +2 -1
- package/dist/types/dag/operator.d.ts +0 -3
- package/dist/types/dag/utils.d.ts +0 -1
- package/dist/types/features/dev/index.d.ts +0 -1
- package/dist/types/index.d.ts +2 -3
- package/dist/types/projects/get-projects.d.ts +0 -1
- package/dist/types/type.d.ts +5 -1
- package/package.json +15 -15
|
@@ -4,48 +4,33 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.DagOperator = void 0;
|
|
7
|
-
|
|
8
7
|
var _pMap = _interopRequireDefault(require("p-map"));
|
|
9
|
-
|
|
10
8
|
var _error = require("../log/error");
|
|
11
|
-
|
|
12
9
|
var _task = require("./task");
|
|
13
|
-
|
|
14
10
|
var _edgeManager = require("./edge-manager");
|
|
15
|
-
|
|
16
11
|
var _utils = require("./utils");
|
|
17
|
-
|
|
18
12
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
19
|
-
|
|
20
13
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
21
|
-
|
|
22
14
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
23
|
-
|
|
24
15
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
25
|
-
|
|
26
16
|
class DagOperator {
|
|
27
17
|
// 排序好的项目列表
|
|
18
|
+
|
|
28
19
|
constructor(projects, projectsMap) {
|
|
29
20
|
_defineProperty(this, "_projects", void 0);
|
|
30
|
-
|
|
31
21
|
_defineProperty(this, "_projectsMap", void 0);
|
|
32
|
-
|
|
33
22
|
_defineProperty(this, "_sortedProjects", void 0);
|
|
34
|
-
|
|
35
23
|
_defineProperty(this, "_createTask", (project, task) => async (stopTask = () => undefined) => {
|
|
36
24
|
await task(project, project.dependency || [], () => stopTask());
|
|
37
25
|
return project.name;
|
|
38
26
|
});
|
|
39
|
-
|
|
40
27
|
this._projects = projects;
|
|
41
28
|
this._projectsMap = projectsMap;
|
|
42
29
|
this._sortedProjects = [];
|
|
43
30
|
}
|
|
44
|
-
|
|
45
31
|
checkNodeDataExist(name) {
|
|
46
32
|
return this._projectsMap.has(name);
|
|
47
33
|
}
|
|
48
|
-
|
|
49
34
|
getNodeData(name, option = {
|
|
50
35
|
checkExist: false
|
|
51
36
|
}) {
|
|
@@ -56,42 +41,31 @@ class DagOperator {
|
|
|
56
41
|
(0, _error.errorLog)(`No '${name}' project exist`);
|
|
57
42
|
}
|
|
58
43
|
}
|
|
59
|
-
|
|
60
44
|
return this._projectsMap.get(name);
|
|
61
45
|
}
|
|
62
|
-
|
|
63
46
|
getNodeDependencyData(name) {
|
|
64
47
|
var _this$_projectsMap$ge;
|
|
65
|
-
|
|
66
48
|
return ((_this$_projectsMap$ge = this._projectsMap.get(name)) === null || _this$_projectsMap$ge === void 0 ? void 0 : _this$_projectsMap$ge.dependency) || [];
|
|
67
49
|
}
|
|
68
|
-
|
|
69
50
|
getNodeDependentData(name) {
|
|
70
51
|
var _this$_projectsMap$ge2;
|
|
71
|
-
|
|
72
52
|
return ((_this$_projectsMap$ge2 = this._projectsMap.get(name)) === null || _this$_projectsMap$ge2 === void 0 ? void 0 : _this$_projectsMap$ge2.dependent) || [];
|
|
73
53
|
}
|
|
74
|
-
|
|
75
54
|
getNodeAllDependencyData(name, option = {
|
|
76
55
|
skipCircleCheck: false
|
|
77
56
|
}) {
|
|
78
57
|
const {
|
|
79
58
|
skipCircleCheck
|
|
80
59
|
} = option;
|
|
81
|
-
|
|
82
60
|
if (!skipCircleCheck) {
|
|
83
61
|
this.checkCircle();
|
|
84
62
|
}
|
|
85
|
-
|
|
86
63
|
if (!this._projectsMap.has(name)) {
|
|
87
64
|
(0, _error.errorLog)(`No '${name}' project exist`);
|
|
88
65
|
}
|
|
89
|
-
|
|
90
66
|
const currentNode = this._projectsMap.get(name);
|
|
91
|
-
|
|
92
67
|
return (0, _utils.recursiveGetDependency)(currentNode, skipCircleCheck);
|
|
93
68
|
}
|
|
94
|
-
|
|
95
69
|
setNodeData(name, task) {
|
|
96
70
|
if (this._projectsMap.has(name)) {
|
|
97
71
|
task(this._projectsMap.get(name));
|
|
@@ -99,19 +73,17 @@ class DagOperator {
|
|
|
99
73
|
(0, _error.errorLog)(`No '${name}' project exist`);
|
|
100
74
|
}
|
|
101
75
|
}
|
|
102
|
-
|
|
103
76
|
async traverseAllNodes(task) {
|
|
104
77
|
const sortedNodes = this._sortedProjects.length > 0 ? this._sortedProjects : (0, _utils.sortProjects)(this._projects);
|
|
105
78
|
const finishTaskHash = {};
|
|
106
79
|
let preNodes = [];
|
|
107
80
|
let earlyFinish = false;
|
|
108
|
-
|
|
109
81
|
for (const projects of sortedNodes) {
|
|
110
82
|
if (earlyFinish) {
|
|
111
83
|
break;
|
|
112
84
|
}
|
|
113
|
-
|
|
114
|
-
|
|
85
|
+
await (0, _pMap.default)(projects,
|
|
86
|
+
// eslint-disable-next-line @typescript-eslint/no-loop-func
|
|
115
87
|
async project => {
|
|
116
88
|
if (!finishTaskHash[project.name]) {
|
|
117
89
|
finishTaskHash[project.name] = true;
|
|
@@ -123,18 +95,17 @@ class DagOperator {
|
|
|
123
95
|
preNodes = [...projects];
|
|
124
96
|
}
|
|
125
97
|
}
|
|
126
|
-
|
|
127
98
|
checkCircle() {
|
|
128
99
|
// this._sortedProjects = sortProjects(this._projects);
|
|
129
100
|
this._checkForCyclicDependencies(this._projects, [], new Set());
|
|
130
101
|
}
|
|
131
|
-
|
|
132
102
|
async traverseDependenciesToProjectToDependent(name, task, config = {}) {
|
|
133
103
|
await this.traverseDependenciesToProject(name, task, config);
|
|
134
104
|
await this.traverseProjectToDependent(name, task, _objectSpread(_objectSpread({}, config), {}, {
|
|
135
105
|
withSelf: false
|
|
136
106
|
}));
|
|
137
107
|
}
|
|
108
|
+
|
|
138
109
|
/**
|
|
139
110
|
* 1. 把目标节点当做叶子节点集合 A 中的元素
|
|
140
111
|
* 2. 当叶子节点集合中某个 a 元素结束任务的时候进行如下操作:
|
|
@@ -144,7 +115,6 @@ class DagOperator {
|
|
|
144
115
|
* 4. 根据情况(是否存在空闲的进程)选择是否执行新加入的节点对应的任务。
|
|
145
116
|
*/
|
|
146
117
|
|
|
147
|
-
|
|
148
118
|
async traverseProjectToDependent(name, task, {
|
|
149
119
|
withSelf = false,
|
|
150
120
|
runTaskConcurrency
|
|
@@ -152,9 +122,7 @@ class DagOperator {
|
|
|
152
122
|
if (!this._projectsMap.has(name)) {
|
|
153
123
|
(0, _error.errorLog)(`No '${name}' project exist`);
|
|
154
124
|
}
|
|
155
|
-
|
|
156
125
|
const traverseTargetNode = this._projectsMap.get(name);
|
|
157
|
-
|
|
158
126
|
const leafNodeTasks = [withSelf ? this._createTask(traverseTargetNode, task) : async () => Promise.resolve(traverseTargetNode.name)];
|
|
159
127
|
const taskRunner = new _task.TaskRunner(leafNodeTasks, {
|
|
160
128
|
concurrency: runTaskConcurrency
|
|
@@ -163,12 +131,11 @@ class DagOperator {
|
|
|
163
131
|
taskRunner.on(_task.TaskRunner.TASK_FINISH, projectName => {
|
|
164
132
|
const projectNode = this.getNodeData(projectName);
|
|
165
133
|
const dependent = projectNode.dependent || [];
|
|
166
|
-
|
|
167
134
|
for (const dependentProject of dependent) {
|
|
168
135
|
const dependency = dependentProject.dependency || [];
|
|
169
136
|
const removeNodes = dependency.filter(dependencyProject => ![projectName, ...dependent.map(p => p.name)].includes(dependencyProject.name));
|
|
170
|
-
edgeManager.reduceEdges(dependentProject, removeNodes.length + 1);
|
|
171
|
-
|
|
137
|
+
edgeManager.reduceEdges(dependentProject, removeNodes.length + 1);
|
|
138
|
+
// 变成叶子节点,就加入执行任务的队列中
|
|
172
139
|
if (edgeManager.getEdge(dependentProject) === 0) {
|
|
173
140
|
taskRunner.addTask(this._createTask(dependentProject, task));
|
|
174
141
|
}
|
|
@@ -176,6 +143,7 @@ class DagOperator {
|
|
|
176
143
|
});
|
|
177
144
|
await taskRunner.run();
|
|
178
145
|
}
|
|
146
|
+
|
|
179
147
|
/**
|
|
180
148
|
* 1. 找到叶子节点集合 A
|
|
181
149
|
* 2. 找到直接连接叶子节点的节点集合 B
|
|
@@ -183,9 +151,8 @@ class DagOperator {
|
|
|
183
151
|
* 4. 检查 B 集合中是否存在入度为0的节点,则此节点为叶子节点,并加入叶子节点集合 A
|
|
184
152
|
* 5. 根据情况(是否存在空闲的进程)选择是否执行新加入的节点对应的任务。
|
|
185
153
|
*/
|
|
186
|
-
// TODO: 执行顺序还需要再确定一下
|
|
187
|
-
|
|
188
154
|
|
|
155
|
+
// TODO: 执行顺序还需要再确定一下
|
|
189
156
|
async traverseDependenciesToProject(name, task, {
|
|
190
157
|
withSelf = false,
|
|
191
158
|
runTaskConcurrency
|
|
@@ -193,16 +160,12 @@ class DagOperator {
|
|
|
193
160
|
if (!this._projectsMap.has(name)) {
|
|
194
161
|
(0, _error.errorLog)(`No '${name}' project exist`);
|
|
195
162
|
}
|
|
196
|
-
|
|
197
163
|
const traverseTargetNode = this._projectsMap.get(name);
|
|
198
|
-
|
|
199
164
|
const leafNodes = this._getDependencyLeafNodes(traverseTargetNode);
|
|
200
|
-
|
|
201
165
|
if ((leafNodes === null || leafNodes === void 0 ? void 0 : leafNodes.length) === 0) {
|
|
202
166
|
await this._createTask(traverseTargetNode, task)();
|
|
203
167
|
return;
|
|
204
168
|
}
|
|
205
|
-
|
|
206
169
|
const leafNodeTasks = leafNodes.map(project => this._createTask(project, task));
|
|
207
170
|
const taskRunner = new _task.TaskRunner(leafNodeTasks, {
|
|
208
171
|
concurrency: runTaskConcurrency
|
|
@@ -211,20 +174,17 @@ class DagOperator {
|
|
|
211
174
|
taskRunner.on(_task.TaskRunner.TASK_FINISH, projectName => {
|
|
212
175
|
const projectNode = this.getNodeData(projectName);
|
|
213
176
|
const dependent = projectNode.dependent || [];
|
|
214
|
-
|
|
215
177
|
for (const dependentProject of dependent) {
|
|
216
178
|
// 只处理在叶子节点/目标项目的所有依赖集合的节点
|
|
217
179
|
if (![traverseTargetNode, ...leafNodes].some(n => n.name === dependentProject.name)) {
|
|
218
180
|
continue;
|
|
219
181
|
}
|
|
220
|
-
|
|
221
182
|
edgeManager.reduceOneEdge(dependentProject);
|
|
222
|
-
|
|
223
183
|
if (dependentProject.name === traverseTargetNode.name && !withSelf) {
|
|
224
184
|
continue;
|
|
225
|
-
}
|
|
226
|
-
|
|
185
|
+
}
|
|
227
186
|
|
|
187
|
+
// 变成叶子节点,就加入执行任务的队列中
|
|
228
188
|
if (edgeManager.getEdge(dependentProject) === 0) {
|
|
229
189
|
taskRunner.addTask(this._createTask(dependentProject, task));
|
|
230
190
|
}
|
|
@@ -232,6 +192,7 @@ class DagOperator {
|
|
|
232
192
|
});
|
|
233
193
|
await taskRunner.run();
|
|
234
194
|
}
|
|
195
|
+
|
|
235
196
|
/**
|
|
236
197
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
237
198
|
*
|
|
@@ -242,51 +203,39 @@ class DagOperator {
|
|
|
242
203
|
/**
|
|
243
204
|
* Checks for projects that indirectly depend on themselves.
|
|
244
205
|
*/
|
|
245
|
-
|
|
246
|
-
|
|
247
206
|
_checkForCyclicDependencies(projects, dependencyChain, alreadyCheckedProjects) {
|
|
248
207
|
for (const project of projects) {
|
|
249
208
|
if (dependencyChain.includes(project.name)) {
|
|
250
209
|
throw new Error(`${'A cyclic dependency was encountered:\n'} ${[...dependencyChain, project.name].reverse().join('\n -> ')}\n`);
|
|
251
210
|
}
|
|
252
|
-
|
|
253
211
|
if (!alreadyCheckedProjects.has(project.name)) {
|
|
254
212
|
alreadyCheckedProjects.add(project.name);
|
|
255
213
|
dependencyChain.push(project.name);
|
|
256
|
-
|
|
257
214
|
this._checkForCyclicDependencies(project.dependent, dependencyChain, alreadyCheckedProjects);
|
|
258
|
-
|
|
259
215
|
dependencyChain.pop();
|
|
260
216
|
}
|
|
261
217
|
}
|
|
262
218
|
}
|
|
263
|
-
|
|
264
219
|
_getDependencyLeafNodes(node) {
|
|
265
220
|
const dependency = node.dependency;
|
|
266
|
-
|
|
267
221
|
if (dependency.length === 0) {
|
|
268
222
|
return [];
|
|
269
223
|
}
|
|
270
|
-
|
|
271
224
|
let leafNodes = [...dependency];
|
|
272
|
-
|
|
273
225
|
for (const dependencyNode of dependency) {
|
|
274
226
|
leafNodes = [...leafNodes, ...this._getDependencyLeafNodes(dependencyNode)];
|
|
275
227
|
}
|
|
276
|
-
|
|
277
228
|
return leafNodes;
|
|
278
229
|
}
|
|
279
|
-
|
|
280
230
|
_getProjectPreviousNode(searchProjects, preNodes) {
|
|
281
231
|
return searchProjects.filter(p => preNodes.map(preP => preP.name).includes(p.name));
|
|
282
|
-
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// public async getOrderTasks() {
|
|
283
235
|
// // Precalculate the number of dependent packages
|
|
284
236
|
// for (const project of this._projects) {
|
|
285
237
|
// calculateCriticalPaths(project);
|
|
286
238
|
// }
|
|
287
239
|
// }
|
|
288
|
-
|
|
289
|
-
|
|
290
240
|
}
|
|
291
|
-
|
|
292
241
|
exports.DagOperator = DagOperator;
|
package/dist/js/node/dag/task.js
CHANGED
|
@@ -4,38 +4,26 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.TaskRunner = void 0;
|
|
7
|
-
|
|
8
7
|
var _events = require("events");
|
|
9
|
-
|
|
10
8
|
var _pMap = _interopRequireDefault(require("p-map"));
|
|
11
|
-
|
|
12
9
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
13
|
-
|
|
14
10
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
15
|
-
|
|
16
11
|
class TaskRunner extends _events.EventEmitter {
|
|
17
12
|
constructor(tasks, {
|
|
18
13
|
concurrency
|
|
19
14
|
}) {
|
|
20
15
|
super();
|
|
21
|
-
|
|
22
16
|
_defineProperty(this, "_tasks", void 0);
|
|
23
|
-
|
|
24
17
|
_defineProperty(this, "_concurrency", void 0);
|
|
25
|
-
|
|
26
18
|
_defineProperty(this, "_usableConcurrency", void 0);
|
|
27
|
-
|
|
28
19
|
_defineProperty(this, "_stopFlag", void 0);
|
|
29
|
-
|
|
30
20
|
this._tasks = tasks;
|
|
31
21
|
this._concurrency = concurrency || TaskRunner.DefaultConcurrency;
|
|
32
22
|
this._usableConcurrency = this._concurrency;
|
|
33
23
|
this._stopFlag = false;
|
|
34
24
|
}
|
|
35
|
-
|
|
36
25
|
async run() {
|
|
37
26
|
const tasks = this._tasks.splice(0, this._concurrency);
|
|
38
|
-
|
|
39
27
|
this._usableConcurrency = this._concurrency - tasks.length;
|
|
40
28
|
await (0, _pMap.default)(tasks, async task => {
|
|
41
29
|
await this._runTask(task);
|
|
@@ -43,25 +31,19 @@ class TaskRunner extends _events.EventEmitter {
|
|
|
43
31
|
concurrency: tasks.length
|
|
44
32
|
});
|
|
45
33
|
}
|
|
46
|
-
|
|
47
34
|
addTask(task) {
|
|
48
35
|
this._tasks.push(task);
|
|
49
36
|
}
|
|
50
|
-
|
|
51
37
|
async _runTask(task) {
|
|
52
38
|
if (this._stopFlag) {
|
|
53
39
|
return;
|
|
54
40
|
}
|
|
55
|
-
|
|
56
41
|
const emitValue = await task(this._stopTask.bind(this));
|
|
57
42
|
this._usableConcurrency--;
|
|
58
43
|
this.emit(TaskRunner.TASK_FINISH, emitValue);
|
|
59
|
-
|
|
60
44
|
if (this._tasks.length > 0) {
|
|
61
45
|
const nextTasks = this._tasks.splice(0, this._usableConcurrency);
|
|
62
|
-
|
|
63
46
|
this._usableConcurrency -= nextTasks.length;
|
|
64
|
-
|
|
65
47
|
if (nextTasks.length > 0) {
|
|
66
48
|
await (0, _pMap.default)(nextTasks, async _task => {
|
|
67
49
|
await this._runTask(_task);
|
|
@@ -71,15 +53,10 @@ class TaskRunner extends _events.EventEmitter {
|
|
|
71
53
|
}
|
|
72
54
|
}
|
|
73
55
|
}
|
|
74
|
-
|
|
75
56
|
_stopTask() {
|
|
76
57
|
this._stopFlag = true;
|
|
77
58
|
}
|
|
78
|
-
|
|
79
59
|
}
|
|
80
|
-
|
|
81
60
|
exports.TaskRunner = TaskRunner;
|
|
82
|
-
|
|
83
61
|
_defineProperty(TaskRunner, "DefaultConcurrency", 10);
|
|
84
|
-
|
|
85
62
|
_defineProperty(TaskRunner, "TASK_FINISH", 'task-finish');
|
|
@@ -4,30 +4,25 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.sortProjects = exports.recursiveGetDependency = exports.findCircle = exports.calculateCriticalPaths = void 0;
|
|
7
|
-
|
|
8
7
|
var _error = require("../log/error");
|
|
9
|
-
|
|
10
8
|
var _edgeManager = require("./edge-manager");
|
|
11
|
-
|
|
12
9
|
/**
|
|
13
10
|
* Calculate the number of packages which must be built before we reach
|
|
14
11
|
* the furthest away "root" node
|
|
15
12
|
*/
|
|
16
13
|
const calculateCriticalPaths = project => {
|
|
17
14
|
var _project$dependent;
|
|
18
|
-
|
|
19
15
|
// Return the memoized value
|
|
20
16
|
if (project.criticalPathLength !== undefined) {
|
|
21
17
|
return project.criticalPathLength;
|
|
22
|
-
}
|
|
23
|
-
|
|
18
|
+
}
|
|
24
19
|
|
|
20
|
+
// If no dependents, we are in a "root"
|
|
25
21
|
if (((_project$dependent = project.dependent) === null || _project$dependent === void 0 ? void 0 : _project$dependent.length) === 0) {
|
|
26
22
|
project.criticalPathLength = 0;
|
|
27
23
|
return project.criticalPathLength;
|
|
28
24
|
} else {
|
|
29
25
|
var _project$dependent2;
|
|
30
|
-
|
|
31
26
|
// Otherwise we are as long as the longest package + 1
|
|
32
27
|
const depsLengths = [];
|
|
33
28
|
(_project$dependent2 = project.dependent) === null || _project$dependent2 === void 0 ? void 0 : _project$dependent2.forEach(dependentProject => depsLengths.push(calculateCriticalPaths(dependentProject)));
|
|
@@ -35,18 +30,14 @@ const calculateCriticalPaths = project => {
|
|
|
35
30
|
return project.criticalPathLength;
|
|
36
31
|
}
|
|
37
32
|
};
|
|
38
|
-
|
|
39
33
|
exports.calculateCriticalPaths = calculateCriticalPaths;
|
|
40
|
-
|
|
41
34
|
const _recursiveGetDependencySkipCircleDeps = node => {
|
|
42
35
|
let allDeps = [];
|
|
43
36
|
const foundDepsNameSet = new Set([node.name]);
|
|
44
37
|
let queue = [node];
|
|
45
|
-
|
|
46
38
|
while (queue.length > 0) {
|
|
47
39
|
const checkNode = queue.pop();
|
|
48
40
|
const checkNodeDeps = checkNode.dependency || [];
|
|
49
|
-
|
|
50
41
|
if (checkNodeDeps.length > 0) {
|
|
51
42
|
const willIntoQueue = checkNodeDeps.filter(dep => !foundDepsNameSet.has(dep.name));
|
|
52
43
|
allDeps = [...allDeps, ...willIntoQueue];
|
|
@@ -54,93 +45,75 @@ const _recursiveGetDependencySkipCircleDeps = node => {
|
|
|
54
45
|
queue = [...queue, ...willIntoQueue];
|
|
55
46
|
}
|
|
56
47
|
}
|
|
57
|
-
|
|
58
48
|
return allDeps;
|
|
59
49
|
};
|
|
60
|
-
|
|
61
50
|
const recursiveGetDependency = (project, skipCircleProjects = false) => {
|
|
62
51
|
if (skipCircleProjects) {
|
|
63
52
|
return _recursiveGetDependencySkipCircleDeps(project);
|
|
64
53
|
}
|
|
65
|
-
|
|
66
54
|
const dependency = project.dependency || [];
|
|
67
55
|
let allDependency = [...dependency];
|
|
68
|
-
|
|
69
56
|
for (const dependencyProject of dependency) {
|
|
70
57
|
allDependency = [...allDependency, ...recursiveGetDependency(dependencyProject)];
|
|
71
58
|
}
|
|
72
|
-
|
|
73
59
|
return allDependency;
|
|
74
|
-
};
|
|
75
|
-
|
|
60
|
+
};
|
|
76
61
|
|
|
62
|
+
// 拓扑排序
|
|
77
63
|
exports.recursiveGetDependency = recursiveGetDependency;
|
|
78
|
-
|
|
79
64
|
const sortProjects = projects => {
|
|
80
65
|
const sortedQueue = []; // 排好序的队列
|
|
81
|
-
|
|
82
66
|
let readyIntoSortedQueue = []; // 用来准备放入 sortedQueue的数组
|
|
83
|
-
|
|
84
67
|
let queue = []; // 用来存放入度为0的节点
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
68
|
+
const edgeManager = new _edgeManager.EdgeManager();
|
|
69
|
+
// 初始化队列queue
|
|
88
70
|
for (const project of projects) {
|
|
89
|
-
edgeManager.setEdge(project);
|
|
71
|
+
edgeManager.setEdge(project);
|
|
72
|
+
// 入度为0进队列
|
|
90
73
|
// TODO 可能存在多个 dagNodeFrom === 0 的节点
|
|
91
|
-
|
|
92
74
|
if (edgeManager.getEdge(project) === 0) {
|
|
93
75
|
queue.push(project);
|
|
94
76
|
}
|
|
95
|
-
}
|
|
96
|
-
|
|
77
|
+
}
|
|
97
78
|
|
|
79
|
+
// 加入最初入度为0的节点
|
|
98
80
|
sortedQueue.push([...queue]);
|
|
99
81
|
let shiftNodesCount = 0; // 计算出队列的节点数量,用于在最后判断是否存在环/依赖循环
|
|
100
82
|
|
|
101
83
|
while (queue.length > 0) {
|
|
102
84
|
const checkNode = queue.shift();
|
|
103
85
|
shiftNodesCount++;
|
|
104
|
-
|
|
105
86
|
for (const toNode of checkNode.dependent) {
|
|
106
87
|
edgeManager.reduceOneEdge(toNode);
|
|
107
|
-
|
|
108
88
|
if (edgeManager.getEdge(toNode) === 0) {
|
|
109
89
|
readyIntoSortedQueue.push(toNode);
|
|
110
90
|
}
|
|
111
91
|
}
|
|
112
|
-
|
|
113
92
|
if (queue.length === 0 && readyIntoSortedQueue.length > 0) {
|
|
114
93
|
queue = [...readyIntoSortedQueue];
|
|
115
94
|
sortedQueue.push([...readyIntoSortedQueue]);
|
|
116
95
|
readyIntoSortedQueue = [];
|
|
117
96
|
}
|
|
118
97
|
}
|
|
119
|
-
|
|
120
98
|
if (shiftNodesCount < projects.length) {
|
|
121
99
|
(0, _error.errorLog)('Items with a dependency loop');
|
|
122
|
-
} else {
|
|
100
|
+
} else {
|
|
101
|
+
// console.info('No dependency loop');
|
|
123
102
|
}
|
|
124
|
-
|
|
125
103
|
return sortedQueue;
|
|
126
104
|
};
|
|
127
|
-
|
|
128
105
|
exports.sortProjects = sortProjects;
|
|
129
|
-
|
|
130
106
|
const findCircle = projects => {
|
|
131
107
|
let result = projects.reduce((circleNodes, project) => {
|
|
132
108
|
if (project.dependencyEdge > 0) {
|
|
133
109
|
return [...circleNodes, project];
|
|
134
110
|
}
|
|
135
|
-
|
|
136
111
|
return circleNodes;
|
|
137
112
|
}, []);
|
|
138
113
|
result = result.sort((a, b) => a.dependencyEdge - b.dependencyEdge);
|
|
139
|
-
|
|
140
114
|
while (result.length > 0) {
|
|
141
115
|
const checkNode = result.shift();
|
|
142
116
|
checkNode.dependencyEdge--;
|
|
143
117
|
}
|
|
144
118
|
};
|
|
145
|
-
|
|
146
119
|
exports.findCircle = findCircle;
|
|
@@ -4,19 +4,12 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.runBuildTask = exports.runAllBuildTask = void 0;
|
|
7
|
-
|
|
8
7
|
var _os = _interopRequireDefault(require("os"));
|
|
9
|
-
|
|
10
8
|
var _utils = require("@modern-js/utils");
|
|
11
|
-
|
|
12
9
|
var _checkProjectChange = require("../../projects/check-project-change");
|
|
13
|
-
|
|
14
10
|
var _error = require("../../log/error");
|
|
15
|
-
|
|
16
11
|
var _multiTasksLog = require("../../log/multi-tasks-log");
|
|
17
|
-
|
|
18
12
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
19
|
-
|
|
20
13
|
const createTask = (config, taskCmds = defaultBuildCmds, taskLogger) => {
|
|
21
14
|
const {
|
|
22
15
|
rootPath,
|
|
@@ -24,38 +17,30 @@ const createTask = (config, taskCmds = defaultBuildCmds, taskLogger) => {
|
|
|
24
17
|
disableContentHash = false,
|
|
25
18
|
enableGitHash = false
|
|
26
19
|
} = config;
|
|
27
|
-
|
|
28
20
|
const task = async project => {
|
|
29
|
-
console.info('run ', project.name);
|
|
30
|
-
|
|
21
|
+
console.info('run ', project.name);
|
|
22
|
+
// const taskTimeLog = timeLog.initTimeLog({ scope: '' });
|
|
31
23
|
if (!disableContentHash) {
|
|
32
24
|
const changed = await (0, _checkProjectChange.checkProjectChangeByContent)(project);
|
|
33
|
-
|
|
34
25
|
if (!changed) {
|
|
35
26
|
console.info(`${project.name} content not change, skip`);
|
|
36
27
|
return;
|
|
37
28
|
}
|
|
38
29
|
}
|
|
39
|
-
|
|
40
30
|
if (enableGitHash) {
|
|
41
31
|
const changed = await (0, _checkProjectChange.checkProjectChangeByGit)(project, rootPath);
|
|
42
|
-
|
|
43
32
|
if (!changed) {
|
|
44
33
|
console.info(`${project.name} not change, skip`);
|
|
45
34
|
return;
|
|
46
35
|
}
|
|
47
|
-
|
|
48
36
|
console.info(`${project.name} have changed in git history`);
|
|
49
37
|
}
|
|
50
|
-
|
|
51
38
|
const cmd = project.extra.scripts || {};
|
|
52
|
-
|
|
53
39
|
for (const taskCmd of taskCmds) {
|
|
54
40
|
if (cmd[taskCmd]) {
|
|
55
|
-
const prefix = `run ${project.name} ${taskCmd} script`;
|
|
56
|
-
|
|
41
|
+
const prefix = `run ${project.name} ${taskCmd} script`;
|
|
42
|
+
// timeLog.startTime(taskTimeLog, prefix);
|
|
57
43
|
_utils.signale.time(prefix);
|
|
58
|
-
|
|
59
44
|
try {
|
|
60
45
|
const childProcess = (0, _utils.execa)(packageManager, [taskCmd], {
|
|
61
46
|
cwd: project.extra.path,
|
|
@@ -68,8 +53,8 @@ const createTask = (config, taskCmds = defaultBuildCmds, taskLogger) => {
|
|
|
68
53
|
label: 'BUILD: '
|
|
69
54
|
}
|
|
70
55
|
});
|
|
71
|
-
await childProcess;
|
|
72
|
-
|
|
56
|
+
await childProcess;
|
|
57
|
+
// timeLog.endTime(taskTimeLog, prefix);
|
|
73
58
|
_utils.signale.timeEnd(prefix);
|
|
74
59
|
} catch (e) {
|
|
75
60
|
(0, _error.errorLog)(project.name, e.message);
|
|
@@ -79,12 +64,9 @@ const createTask = (config, taskCmds = defaultBuildCmds, taskLogger) => {
|
|
|
79
64
|
}
|
|
80
65
|
}
|
|
81
66
|
};
|
|
82
|
-
|
|
83
67
|
return task;
|
|
84
68
|
};
|
|
85
|
-
|
|
86
69
|
const defaultBuildCmds = ['build'];
|
|
87
|
-
|
|
88
70
|
const runBuildTask = async (projectName, operator, config, taskCmds = defaultBuildCmds) => {
|
|
89
71
|
const {
|
|
90
72
|
withSelf = true,
|
|
@@ -93,8 +75,8 @@ const runBuildTask = async (projectName, operator, config, taskCmds = defaultBui
|
|
|
93
75
|
withDept = false
|
|
94
76
|
} = config;
|
|
95
77
|
const taskLogger = new _multiTasksLog.MultitasksLogger();
|
|
96
|
-
const task = createTask(config, taskCmds, taskLogger);
|
|
97
|
-
|
|
78
|
+
const task = createTask(config, taskCmds, taskLogger);
|
|
79
|
+
// 优先级 onlySelf > withDept、disableWithDeps
|
|
98
80
|
if (onlySelf) {
|
|
99
81
|
await task(operator.getNodeData(projectName, {
|
|
100
82
|
checkExist: true
|
|
@@ -116,13 +98,10 @@ const runBuildTask = async (projectName, operator, config, taskCmds = defaultBui
|
|
|
116
98
|
});
|
|
117
99
|
}
|
|
118
100
|
};
|
|
119
|
-
|
|
120
101
|
exports.runBuildTask = runBuildTask;
|
|
121
|
-
|
|
122
102
|
const runAllBuildTask = async (operator, config, taskCmds = defaultBuildCmds) => {
|
|
123
103
|
const taskLogger = new _multiTasksLog.MultitasksLogger();
|
|
124
104
|
const task = createTask(config, taskCmds, taskLogger);
|
|
125
105
|
await operator.traverseAllNodes(task);
|
|
126
106
|
};
|
|
127
|
-
|
|
128
107
|
exports.runAllBuildTask = runAllBuildTask;
|
|
@@ -4,34 +4,24 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.runClearTask = exports.defaultRemoveDirs = void 0;
|
|
7
|
-
|
|
8
7
|
var path = _interopRequireWildcard(require("path"));
|
|
9
|
-
|
|
10
8
|
var _utils = require("@modern-js/utils");
|
|
11
|
-
|
|
12
9
|
var _nodeCoreLibrary = require("@rushstack/node-core-library");
|
|
13
|
-
|
|
14
10
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
15
|
-
|
|
16
11
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
17
|
-
|
|
18
12
|
const defaultRemoveDirs = ['node_modules'];
|
|
19
13
|
exports.defaultRemoveDirs = defaultRemoveDirs;
|
|
20
|
-
|
|
21
14
|
const runClearTask = (projectNames, projects, config) => {
|
|
22
15
|
const {
|
|
23
16
|
removeDirs = defaultRemoveDirs,
|
|
24
17
|
rootPath
|
|
25
18
|
} = config;
|
|
26
|
-
|
|
27
19
|
if (projectNames.length > 0) {
|
|
28
20
|
projects.forEach(project => {
|
|
29
21
|
if (projectNames.includes(project.name)) {
|
|
30
22
|
removeDirs.forEach(dir => {
|
|
31
23
|
const removePath = path.join(`${project.extra.path}`, dir);
|
|
32
|
-
|
|
33
24
|
_utils.logger.info(`remove ${removePath}`);
|
|
34
|
-
|
|
35
25
|
_nodeCoreLibrary.FileSystem.deleteFolder(removePath);
|
|
36
26
|
});
|
|
37
27
|
}
|
|
@@ -39,21 +29,16 @@ const runClearTask = (projectNames, projects, config) => {
|
|
|
39
29
|
} else {
|
|
40
30
|
removeDirs.forEach(dir => {
|
|
41
31
|
const removePath = path.join(`${rootPath}`, dir);
|
|
42
|
-
|
|
43
32
|
_utils.logger.info(`remove ${removePath}`);
|
|
44
|
-
|
|
45
33
|
_nodeCoreLibrary.FileSystem.deleteFolder(removePath);
|
|
46
34
|
});
|
|
47
35
|
projects.forEach(project => {
|
|
48
36
|
removeDirs.forEach(dir => {
|
|
49
37
|
const removePath = path.join(`${project.extra.path}`, dir);
|
|
50
|
-
|
|
51
38
|
_utils.logger.info(`remove ${removePath}`);
|
|
52
|
-
|
|
53
39
|
_nodeCoreLibrary.FileSystem.deleteFolder(removePath);
|
|
54
40
|
});
|
|
55
41
|
});
|
|
56
42
|
}
|
|
57
43
|
};
|
|
58
|
-
|
|
59
44
|
exports.runClearTask = runClearTask;
|