mm_machine 2.0.2 → 2.0.4
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/README.md +576 -576
- package/app/test1/config_demo.json +10 -0
- package/app/test2/config_demo.json +10 -0
- package/demo/test1/config_demo.json +33 -33
- package/demo/test1/demo.json +33 -33
- package/demo/test1/index.js +29 -29
- package/demo/test2/after.js +14 -14
- package/demo/test2/config_demo.json +67 -67
- package/demo/test2/demo.json +67 -67
- package/demo/test2/index.js +14 -14
- package/demo/test2/main.js +15 -15
- package/demo2/test1/demo.json +33 -33
- package/demo2/test1/index.js +29 -29
- package/demo2/test2/after.js +14 -14
- package/demo2/test2/demo.json +67 -67
- package/demo2/test2/main.js +15 -15
- package/index.js +69 -62
- package/package.json +1 -1
- package/test.js +129 -129
- package/test_dir_search.js +108 -0
package/test.js
CHANGED
|
@@ -1,130 +1,130 @@
|
|
|
1
|
-
var {
|
|
2
|
-
Item,
|
|
3
|
-
Index
|
|
4
|
-
} = require('./index.js');
|
|
5
|
-
|
|
6
|
-
class Drive extends Item {
|
|
7
|
-
constructor(dir, dir_base) {
|
|
8
|
-
super(dir, dir_base);
|
|
9
|
-
this.default_file = "./demo.json";
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
class Engine extends Index {
|
|
14
|
-
constructor(scope, dir_base) {
|
|
15
|
-
super(scope, dir_base);
|
|
16
|
-
/**
|
|
17
|
-
* 模式
|
|
18
|
-
* 1.生产模式,改变文件不会重新加载
|
|
19
|
-
* 2.热更新模式,改变配置文件会重新加载配置,不重新加载脚本
|
|
20
|
-
* 3.热重载模式,改变配置文件都会加载配置和脚本
|
|
21
|
-
* 4.热更新+重载模式,改变配置文件重新加载配置和脚本,执行完后重新加载脚本
|
|
22
|
-
* 5.重载模式,执行完后重新加载脚本,避免变量污染
|
|
23
|
-
*/
|
|
24
|
-
this.mode = 3;
|
|
25
|
-
// 机制类型,必须填写,用于检索文件
|
|
26
|
-
this.type = "demo";
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
Engine.prototype.Drive = Drive;
|
|
31
|
-
|
|
32
|
-
async function demo() {
|
|
33
|
-
var engine = new Engine('sys', __dirname);
|
|
34
|
-
console.info("→ 加载mod");
|
|
35
|
-
await engine.update("./".fullname(__dirname));
|
|
36
|
-
|
|
37
|
-
console.log("模块数", engine.list.length);
|
|
38
|
-
// console.log("模块", engine.list);
|
|
39
|
-
|
|
40
|
-
await engine.run('demo1', 'init'); // 只有启动状态的插件才会执行
|
|
41
|
-
await engine.exec('demo1', 'init'); // 未启动也会执行,并且如果未加载脚本则会自动加载
|
|
42
|
-
await engine.run(null, 'main');
|
|
43
|
-
await engine.exec(null, 'main');
|
|
44
|
-
|
|
45
|
-
var ret = await engine.run('demo3', 'main');
|
|
46
|
-
console.log("指明回调demo3", ret);
|
|
47
|
-
|
|
48
|
-
var ret = await engine.exec('demo1', 'main');
|
|
49
|
-
console.log("指明回调demo1", ret);
|
|
50
|
-
|
|
51
|
-
var i = 0;
|
|
52
|
-
var timer = setInterval(async () => {
|
|
53
|
-
await engine.run('demo1', 'main');
|
|
54
|
-
await engine.run('demo2', 'main');
|
|
55
|
-
i++;
|
|
56
|
-
if (i == 3) {
|
|
57
|
-
console.info("→ 重载mod");
|
|
58
|
-
await engine.reload("demo1");
|
|
59
|
-
} else if (i == 5) {
|
|
60
|
-
console.info("→ 卸载mod");
|
|
61
|
-
await engine.unload("demo2");
|
|
62
|
-
} else if (i == 16) {
|
|
63
|
-
console.info("→ 卸载并删除mod");
|
|
64
|
-
await engine.unload("demo1", true);
|
|
65
|
-
} else if (i == 18) {
|
|
66
|
-
clearTimeout(timer);
|
|
67
|
-
}
|
|
68
|
-
}, 3000);
|
|
69
|
-
|
|
70
|
-
setTimeout(async() => {
|
|
71
|
-
var file = "./demo/test1/index.js";
|
|
72
|
-
var text = file.loadText();
|
|
73
|
-
text = text.replace("123", "1234567");
|
|
74
|
-
file.saveText(text);
|
|
75
|
-
var ret = await engine.exec("demo1", 'main');
|
|
76
|
-
console.log("这结果", ret);
|
|
77
|
-
}, 7000)
|
|
78
|
-
|
|
79
|
-
setTimeout(() => {
|
|
80
|
-
var file = "./demo/test2/index.js";
|
|
81
|
-
var text = file.loadText();
|
|
82
|
-
text = text.replace("123", "7654321");
|
|
83
|
-
file.saveText(text);
|
|
84
|
-
}, 11000)
|
|
85
|
-
|
|
86
|
-
setTimeout(async () => {
|
|
87
|
-
// 让热重载失效
|
|
88
|
-
console.info("→ 热重载失效");
|
|
89
|
-
$.mod.config.watch = false;
|
|
90
|
-
// 失效后再加载的模块修改文件没有变化
|
|
91
|
-
var file = "./demo/test1/index.js";
|
|
92
|
-
var text = file.loadText();
|
|
93
|
-
text = text.replace("1234567", "7654321");
|
|
94
|
-
file.saveText(text);
|
|
95
|
-
var ret = await engine.exec("demo1", 'main');
|
|
96
|
-
console.log("这结果", ret);
|
|
97
|
-
}, 16000)
|
|
98
|
-
|
|
99
|
-
var n = 0;
|
|
100
|
-
var timer_2 = setInterval(async () => {
|
|
101
|
-
// await engine.update(null, false, false, false);
|
|
102
|
-
var ret = await engine.exec('demo1', 'main');
|
|
103
|
-
console.info("最后运行demo", ret);
|
|
104
|
-
var plug = engine.get("demo1");
|
|
105
|
-
if (plug) {
|
|
106
|
-
console.log("查看变化1", plug.config);
|
|
107
|
-
}
|
|
108
|
-
var plug = engine.get("demo3");
|
|
109
|
-
if (plug) {
|
|
110
|
-
var ret = await plug.run();
|
|
111
|
-
console.log("查看变化3", plug.config);
|
|
112
|
-
}
|
|
113
|
-
n++;
|
|
114
|
-
if (n == 6) {
|
|
115
|
-
clearInterval(timer_2);
|
|
116
|
-
process.exit(0);
|
|
117
|
-
}
|
|
118
|
-
}, 10000);
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
/* 调用示例 */
|
|
122
|
-
async function test() {
|
|
123
|
-
'./demo2'.fullname(__dirname).copyDir('./demo'.fullname(__dirname), () => {
|
|
124
|
-
setTimeout(() => {
|
|
125
|
-
demo();
|
|
126
|
-
}, 1000)
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
|
|
1
|
+
var {
|
|
2
|
+
Item,
|
|
3
|
+
Index
|
|
4
|
+
} = require('./index.js');
|
|
5
|
+
|
|
6
|
+
class Drive extends Item {
|
|
7
|
+
constructor(dir, dir_base) {
|
|
8
|
+
super(dir, dir_base);
|
|
9
|
+
this.default_file = "./demo.json";
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
class Engine extends Index {
|
|
14
|
+
constructor(scope, dir_base) {
|
|
15
|
+
super(scope, dir_base);
|
|
16
|
+
/**
|
|
17
|
+
* 模式
|
|
18
|
+
* 1.生产模式,改变文件不会重新加载
|
|
19
|
+
* 2.热更新模式,改变配置文件会重新加载配置,不重新加载脚本
|
|
20
|
+
* 3.热重载模式,改变配置文件都会加载配置和脚本
|
|
21
|
+
* 4.热更新+重载模式,改变配置文件重新加载配置和脚本,执行完后重新加载脚本
|
|
22
|
+
* 5.重载模式,执行完后重新加载脚本,避免变量污染
|
|
23
|
+
*/
|
|
24
|
+
this.mode = 3;
|
|
25
|
+
// 机制类型,必须填写,用于检索文件
|
|
26
|
+
this.type = "demo";
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
Engine.prototype.Drive = Drive;
|
|
31
|
+
|
|
32
|
+
async function demo() {
|
|
33
|
+
var engine = new Engine('sys', __dirname);
|
|
34
|
+
console.info("→ 加载mod");
|
|
35
|
+
await engine.update("./app/".fullname(__dirname));
|
|
36
|
+
|
|
37
|
+
console.log("模块数", engine.list.length);
|
|
38
|
+
// console.log("模块", engine.list);
|
|
39
|
+
|
|
40
|
+
await engine.run('demo1', 'init'); // 只有启动状态的插件才会执行
|
|
41
|
+
await engine.exec('demo1', 'init'); // 未启动也会执行,并且如果未加载脚本则会自动加载
|
|
42
|
+
await engine.run(null, 'main');
|
|
43
|
+
await engine.exec(null, 'main');
|
|
44
|
+
|
|
45
|
+
var ret = await engine.run('demo3', 'main');
|
|
46
|
+
console.log("指明回调demo3", ret);
|
|
47
|
+
|
|
48
|
+
var ret = await engine.exec('demo1', 'main');
|
|
49
|
+
console.log("指明回调demo1", ret);
|
|
50
|
+
|
|
51
|
+
var i = 0;
|
|
52
|
+
var timer = setInterval(async () => {
|
|
53
|
+
await engine.run('demo1', 'main');
|
|
54
|
+
await engine.run('demo2', 'main');
|
|
55
|
+
i++;
|
|
56
|
+
if (i == 3) {
|
|
57
|
+
console.info("→ 重载mod");
|
|
58
|
+
await engine.reload("demo1");
|
|
59
|
+
} else if (i == 5) {
|
|
60
|
+
console.info("→ 卸载mod");
|
|
61
|
+
await engine.unload("demo2");
|
|
62
|
+
} else if (i == 16) {
|
|
63
|
+
console.info("→ 卸载并删除mod");
|
|
64
|
+
await engine.unload("demo1", true);
|
|
65
|
+
} else if (i == 18) {
|
|
66
|
+
clearTimeout(timer);
|
|
67
|
+
}
|
|
68
|
+
}, 3000);
|
|
69
|
+
|
|
70
|
+
setTimeout(async() => {
|
|
71
|
+
var file = "./demo/test1/index.js";
|
|
72
|
+
var text = file.loadText();
|
|
73
|
+
text = text.replace("123", "1234567");
|
|
74
|
+
file.saveText(text);
|
|
75
|
+
var ret = await engine.exec("demo1", 'main');
|
|
76
|
+
console.log("这结果", ret);
|
|
77
|
+
}, 7000)
|
|
78
|
+
|
|
79
|
+
setTimeout(() => {
|
|
80
|
+
var file = "./demo/test2/index.js";
|
|
81
|
+
var text = file.loadText();
|
|
82
|
+
text = text.replace("123", "7654321");
|
|
83
|
+
file.saveText(text);
|
|
84
|
+
}, 11000)
|
|
85
|
+
|
|
86
|
+
setTimeout(async () => {
|
|
87
|
+
// 让热重载失效
|
|
88
|
+
console.info("→ 热重载失效");
|
|
89
|
+
$.mod.config.watch = false;
|
|
90
|
+
// 失效后再加载的模块修改文件没有变化
|
|
91
|
+
var file = "./demo/test1/index.js";
|
|
92
|
+
var text = file.loadText();
|
|
93
|
+
text = text.replace("1234567", "7654321");
|
|
94
|
+
file.saveText(text);
|
|
95
|
+
var ret = await engine.exec("demo1", 'main');
|
|
96
|
+
console.log("这结果", ret);
|
|
97
|
+
}, 16000)
|
|
98
|
+
|
|
99
|
+
var n = 0;
|
|
100
|
+
var timer_2 = setInterval(async () => {
|
|
101
|
+
// await engine.update(null, false, false, false);
|
|
102
|
+
var ret = await engine.exec('demo1', 'main');
|
|
103
|
+
console.info("最后运行demo", ret);
|
|
104
|
+
var plug = engine.get("demo1");
|
|
105
|
+
if (plug) {
|
|
106
|
+
console.log("查看变化1", plug.config);
|
|
107
|
+
}
|
|
108
|
+
var plug = engine.get("demo3");
|
|
109
|
+
if (plug) {
|
|
110
|
+
var ret = await plug.run();
|
|
111
|
+
console.log("查看变化3", plug.config);
|
|
112
|
+
}
|
|
113
|
+
n++;
|
|
114
|
+
if (n == 6) {
|
|
115
|
+
clearInterval(timer_2);
|
|
116
|
+
process.exit(0);
|
|
117
|
+
}
|
|
118
|
+
}, 10000);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/* 调用示例 */
|
|
122
|
+
async function test() {
|
|
123
|
+
'./demo2'.fullname(__dirname).copyDir('./demo'.fullname(__dirname), () => {
|
|
124
|
+
setTimeout(() => {
|
|
125
|
+
demo();
|
|
126
|
+
}, 1000)
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
|
|
130
130
|
test();
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
var { Index } = require('./index.js');
|
|
2
|
+
|
|
3
|
+
// 创建一个测试用的Index子类
|
|
4
|
+
class TestIndex extends Index {
|
|
5
|
+
constructor() {
|
|
6
|
+
super('sys', __dirname);
|
|
7
|
+
this.type = 'demo';
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
// 测试函数
|
|
12
|
+
async function testDirSearch() {
|
|
13
|
+
console.log('开始测试目录搜索逻辑...');
|
|
14
|
+
|
|
15
|
+
const index = new TestIndex();
|
|
16
|
+
const searchPath = './app/'.fullname(__dirname);
|
|
17
|
+
|
|
18
|
+
console.log('搜索路径:', searchPath);
|
|
19
|
+
console.log('type:', index.type);
|
|
20
|
+
console.log('scope:', index.scope);
|
|
21
|
+
|
|
22
|
+
// 计算search_dir
|
|
23
|
+
const search_dir = index.scope && index.scope !== $.val?.scope
|
|
24
|
+
? `${index.type}_${index.scope}`
|
|
25
|
+
: index.type;
|
|
26
|
+
|
|
27
|
+
console.log('search_dir:', search_dir);
|
|
28
|
+
|
|
29
|
+
try {
|
|
30
|
+
// 测试精准模式(accurate=true)
|
|
31
|
+
console.log('\n测试精准模式(accurate=true):');
|
|
32
|
+
const list_scope2 = $.dir.getAll(searchPath);
|
|
33
|
+
console.log('找到的目录数量:', list_scope2.length);
|
|
34
|
+
console.log('找到的目录:', list_scope2.map(d => d.toString()));
|
|
35
|
+
|
|
36
|
+
// 测试精准模式下的文件搜索
|
|
37
|
+
console.log('\n测试精准模式下的文件搜索:');
|
|
38
|
+
for (const dir of list_scope2) {
|
|
39
|
+
// 先列出目录中所有文件
|
|
40
|
+
console.log(`\n目录 ${dir} 中的所有文件:`);
|
|
41
|
+
const all_files = $.file.getAll(dir);
|
|
42
|
+
console.log(all_files.map(f => f.toString()));
|
|
43
|
+
|
|
44
|
+
// 测试精确文件名搜索(修改后的模式)
|
|
45
|
+
console.log(`\n目录 ${dir} 中匹配 ${index.type}.json 的文件:`);
|
|
46
|
+
const list_file = $.file.getAll(dir, `${index.type}.json`);
|
|
47
|
+
console.log(list_file.map(f => f.toString()));
|
|
48
|
+
|
|
49
|
+
// 尝试直接列出demo.json文件
|
|
50
|
+
console.log(`\n检查目录 ${dir} 中的 demo.json 文件:`);
|
|
51
|
+
const demo_file = `${dir}demo.json`.fullname();
|
|
52
|
+
console.log(`文件路径: ${demo_file}`);
|
|
53
|
+
console.log(`文件是否存在: ${demo_file.hasFile ? demo_file.hasFile() : '无法检查'}`);
|
|
54
|
+
|
|
55
|
+
if (demo_file.hasFile && demo_file.hasFile()) {
|
|
56
|
+
try {
|
|
57
|
+
const content = demo_file.loadText();
|
|
58
|
+
console.log(`文件内容长度:`, content ? content.length : 0);
|
|
59
|
+
if (content) {
|
|
60
|
+
const json = JSON.parse(content);
|
|
61
|
+
console.log(`文件解析成功,是否数组:`, Array.isArray(json));
|
|
62
|
+
if (Array.isArray(json)) {
|
|
63
|
+
console.log('配置项数量:', json.length);
|
|
64
|
+
console.log('配置项名称:', json.map(item => item.name));
|
|
65
|
+
} else if (json) {
|
|
66
|
+
console.log('配置名称:', json.name);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
} catch (err) {
|
|
70
|
+
console.error(`读取文件失败:`, err);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// 测试非精准模式(accurate=false)
|
|
76
|
+
console.log('\n测试非精准模式(accurate=false):');
|
|
77
|
+
const list_scope1 = $.dir.getAll(searchPath, search_dir);
|
|
78
|
+
console.log('找到的目录数量:', list_scope1.length);
|
|
79
|
+
console.log('找到的目录:', list_scope1.map(d => d.toString()));
|
|
80
|
+
|
|
81
|
+
// 测试每个目录中的json文件
|
|
82
|
+
for (const dir of list_scope1) {
|
|
83
|
+
const list_file = $.file.getAll(dir, `*${index.type}.json`);
|
|
84
|
+
console.log(`\n目录 ${dir} 中的json文件:`);
|
|
85
|
+
console.log(list_file.map(f => f.toString()));
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
} catch (err) {
|
|
89
|
+
console.error('测试失败:', err);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// 直接测试update_config_all方法
|
|
93
|
+
console.log('\n直接测试update_config_all方法:');
|
|
94
|
+
try {
|
|
95
|
+
await index.update_config_all(searchPath, false);
|
|
96
|
+
console.log('update_config_all后模块数量:', index.list.length);
|
|
97
|
+
if (index.list.length > 0) {
|
|
98
|
+
console.log('模块信息:', index.list.map(m => m.config.name));
|
|
99
|
+
}
|
|
100
|
+
} catch (err) {
|
|
101
|
+
console.error('update_config_all失败:', err);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// 运行测试
|
|
106
|
+
testDirSearch().then(() => {
|
|
107
|
+
console.log('\n测试完成');
|
|
108
|
+
});
|