2021-06-16 00:17:30 +08:00
|
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace ZM\Utils\Manager;
|
|
|
|
|
|
|
|
|
|
|
|
|
2021-09-01 14:14:00 +08:00
|
|
|
|
use ZM\Config\ZMConfig;
|
2021-06-16 00:17:30 +08:00
|
|
|
|
use ZM\Console\Console;
|
|
|
|
|
|
use ZM\Exception\ModulePackException;
|
|
|
|
|
|
use ZM\Exception\ZMException;
|
2021-09-01 14:14:00 +08:00
|
|
|
|
use ZM\Exception\ZMKnownException;
|
2021-06-16 00:17:30 +08:00
|
|
|
|
use ZM\Module\ModulePacker;
|
|
|
|
|
|
use ZM\Module\ModuleUnpacker;
|
|
|
|
|
|
use ZM\Utils\DataProvider;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 模块管理器,负责打包解包模块
|
|
|
|
|
|
* Class ModuleManager
|
|
|
|
|
|
* @package ZM\Utils\Manager
|
|
|
|
|
|
* @since 2.5
|
|
|
|
|
|
*/
|
|
|
|
|
|
class ModuleManager
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 扫描src目录下的所有已经被标注的模块
|
|
|
|
|
|
* @return array
|
|
|
|
|
|
* @throws ZMException
|
|
|
|
|
|
*/
|
|
|
|
|
|
public static function getConfiguredModules(): array {
|
|
|
|
|
|
$dir = DataProvider::getSourceRootDir() . "/src/";
|
|
|
|
|
|
$ls = DataProvider::scanDirFiles($dir, true, true);
|
|
|
|
|
|
$modules = [];
|
|
|
|
|
|
foreach ($ls as $v) {
|
|
|
|
|
|
$pathinfo = pathinfo($v);
|
|
|
|
|
|
if ($pathinfo["basename"] == "zm.json") {
|
|
|
|
|
|
$json = json_decode(file_get_contents(realpath($dir . "/" . $v)), true);
|
|
|
|
|
|
if ($json === null) continue;
|
|
|
|
|
|
if (!isset($json["name"])) continue;
|
|
|
|
|
|
if ($pathinfo["dirname"] == ".") {
|
2021-09-01 14:14:00 +08:00
|
|
|
|
throw new ZMKnownException("E00052", "在/src/目录下不可以直接标记为模块(zm.json),因为命名空间不能为根空间!");
|
2021-06-16 00:17:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
$json["module-path"] = realpath($dir . "/" . $pathinfo["dirname"]);
|
|
|
|
|
|
$json["namespace"] = str_replace("/", "\\", $pathinfo["dirname"]);
|
|
|
|
|
|
if (isset($modules[$json["name"]])) {
|
2021-09-01 14:14:00 +08:00
|
|
|
|
throw new ZMKnownException("E00053", "重名模块:" . $json["name"]);
|
2021-06-16 00:17:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
$modules[$json["name"]] = $json;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return $modules;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public static function getPackedModules(): array {
|
2021-09-01 14:14:00 +08:00
|
|
|
|
$dir = ZMConfig::get("global", "module_loader")["load_path"] ?? (ZM_DATA . "modules");
|
2021-06-16 00:17:30 +08:00
|
|
|
|
$ls = DataProvider::scanDirFiles($dir, true, false);
|
|
|
|
|
|
if ($ls === false) return [];
|
|
|
|
|
|
$modules = [];
|
|
|
|
|
|
foreach ($ls as $v) {
|
|
|
|
|
|
$pathinfo = pathinfo($v);
|
|
|
|
|
|
if (($pathinfo["extension"] ?? "") != "phar") continue;
|
|
|
|
|
|
$file = "phar://" . $v;
|
|
|
|
|
|
if (!is_file($file . "/module_entry.php") || !is_file($file . "/zmplugin.json")) continue;
|
|
|
|
|
|
$module_config = json_decode(file_get_contents($file . "/zmplugin.json"), true);
|
|
|
|
|
|
if ($module_config === null) continue;
|
|
|
|
|
|
if (!is_file($file . "/" . $module_config["module-root-path"] . "/zm.json")) {
|
|
|
|
|
|
Console::warning(zm_internal_errcode("E00054") . "模块(插件)文件 " . $pathinfo["basename"] . " 无法找到模块配置文件(zm.json)!");
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
$module_file = json_decode(file_get_contents($file . "/" . $module_config["module-root-path"] . "/zm.json"), true);
|
|
|
|
|
|
if ($module_file === null) {
|
|
|
|
|
|
Console::warning(zm_internal_errcode("E000555") . "模块(插件)文件 " . $pathinfo["basename"] . " 无法正常读取模块配置文件(zm.json)!");
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
$module_config["phar-path"] = $v;
|
|
|
|
|
|
$module_config["name"] = $module_file["name"] ?? null;
|
|
|
|
|
|
if ($module_config["name"] === null) continue;
|
|
|
|
|
|
$module_config["module-config"] = $module_file;
|
|
|
|
|
|
$modules[$module_config["name"]] = $module_config;
|
|
|
|
|
|
}
|
|
|
|
|
|
return $modules;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 打包模块
|
|
|
|
|
|
* @param $module
|
|
|
|
|
|
* @return bool
|
|
|
|
|
|
* @throws ZMException
|
|
|
|
|
|
*/
|
|
|
|
|
|
public static function packModule($module): bool {
|
|
|
|
|
|
try {
|
|
|
|
|
|
$packer = new ModulePacker($module);
|
2021-09-01 14:14:00 +08:00
|
|
|
|
if (!is_dir(DataProvider::getDataFolder())) throw new ModulePackException(zm_internal_errcode("E00070") . "zm_data dir not found!");
|
|
|
|
|
|
$path = realpath(DataProvider::getDataFolder() . "/output");
|
|
|
|
|
|
if ($path === false) mkdir($path = DataProvider::getDataFolder() . "/output");
|
|
|
|
|
|
$packer->setOutputPath($path);
|
2021-06-16 00:17:30 +08:00
|
|
|
|
$packer->setOverride();
|
|
|
|
|
|
$packer->pack();
|
|
|
|
|
|
return true;
|
|
|
|
|
|
} catch (ModulePackException $e) {
|
|
|
|
|
|
Console::error($e->getMessage());
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
2021-07-04 15:45:30 +08:00
|
|
|
|
* 解包模块
|
2021-06-16 00:17:30 +08:00
|
|
|
|
* @param $module
|
2021-07-04 15:45:30 +08:00
|
|
|
|
* @param array $options
|
2021-06-16 00:17:30 +08:00
|
|
|
|
* @return array|false
|
|
|
|
|
|
*/
|
2021-07-04 15:45:30 +08:00
|
|
|
|
public static function unpackModule($module, array $options = []) {
|
2021-06-16 00:17:30 +08:00
|
|
|
|
try {
|
|
|
|
|
|
$packer = new ModuleUnpacker($module);
|
2021-09-01 14:14:00 +08:00
|
|
|
|
return $packer->unpack((bool)$options["overwrite-light-cache"], (bool)$options["overwrite-zm-data"], (bool)$options["overwrite-source"], (bool)$options["ignore-depends"]);
|
2021-07-04 15:45:30 +08:00
|
|
|
|
} catch (ZMException $e) {
|
2021-06-16 00:17:30 +08:00
|
|
|
|
Console::error($e->getMessage());
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|