新增安装模块命令

This commit is contained in:
JaguarJack 2020-07-11 16:13:06 +08:00
parent b9c156e5a7
commit 7adfc93190
3 changed files with 150 additions and 13 deletions

View File

@ -10,52 +10,187 @@
*/ */
namespace catcher\command\install; namespace catcher\command\install;
use catcher\CatchAdmin;
use catcher\exceptions\FailedException;
use catcher\facade\Http;
use catcher\library\Compress;
use think\console\Command; use think\console\Command;
use think\console\Input; use think\console\Input;
use think\console\input\Argument; use think\console\input\Argument;
use think\console\input\Option; use think\console\input\Option;
use think\console\Output; use think\console\Output;
use think\facade\Console;
class InstallCatchModuleCommand extends Command class InstallCatchModuleCommand extends Command
{ {
protected $module;
protected $moduleZipPath;
protected function configure() protected function configure()
{ {
$this->setName('install:module') $this->setName('install:module')
->addArgument('module', Argument::REQUIRED, 'module name') ->addArgument('module', Argument::REQUIRED, 'module name')
->addOption('mode', '-r',Option::VALUE_NONE, 'reinstall back')
->setDescription('install catch module'); ->setDescription('install catch module');
} }
protected function execute(Input $input, Output $output) protected function execute(Input $input, Output $output)
{ {
$this->module = $input->getArgument('module');
$this->moduleZipPath = $this->installRootPath() . $this->module .'.zip';
try {
if ($this->download()) {
if ($this->install()) {
$this->installComposerPackage();
$this->createTable();
$this->importData();
}
}
} catch (\Throwable $exception) {
$this->rollback();
exit($output->error($exception->getMessage()));
}
$output->info("install module [$this->module] successfully");
} }
protected function searchModule() protected function searchModule()
{ {
return 'http://api.catchadmin.com/hello.zip';
} }
protected function getModule() /**
{ * 下载扩展包
*
} * @return bool
* @author JaguarJack <njphper@gmail.com>
* @date 2020/7/11
*/
protected function download() protected function download()
{ {
if (!(new Compress())->savePath($this->moduleZipPath)->download($this->module, $this->searchModule())) {
throw new FailedException('download module '.$this->module. ' failed');
} }
return true;
}
/**
* 安装模块
*
* @author JaguarJack <njphper@gmail.com>
* @date 2020/7/11
*/
protected function install() protected function install()
{ {
if ($this->isFirstInstall()) {
$zip = new \ZipArchive();
$res = $zip->open($this->moduleZipPath);
if ($res === true) {
$zip->extractTo($this->installRootPath());
$zip->close();
return true;
}
} else {
if (!(new Compress())->update($this->module)) {
throw new FailedException('install module ' . $this->module . ' failed');
}
} }
return true;
}
protected function installComposerPackage()
{
try {
$moduleInfo = \json_decode(file_get_contents($this->installPath() . $this->module . DIRECTORY_SEPARATOR . 'module.json'), true);
$requires = $moduleInfo['requires'];
foreach ($requires as $require) {
exec(sprintf('composer require "%s"', $require));
}
} catch (\Exception $exception) {
throw new FailedException($exception->getMessage());
}
return true;
}
/**
* 创建表
*
* @author JaguarJack <njphper@gmail.com>
* @date 2020/7/11
*/
protected function createTable()
{
Console::call('catch-migrate:run', [$this->module]);
}
/**
* 导入数据
*
* @author JaguarJack <njphper@gmail.com>
* @date 2020/7/11
*/
protected function importData()
{
Console::call('catch-seed:run', [$this->module]);
}
/**
* 回滚
*
* @author JaguarJack <njphper@gmail.com>
* @date 2020/7/11
*/
protected function rollback()
{
(new Compress())->rmDir($this->installPath() . $this->module);
Console::call('catch-migrate:rollback', [$this->module, '-f']);
}
protected function update() protected function update()
{ {
} }
/**
* 那安装根目录
*
* @return string
* @author JaguarJack <njphper@gmail.com>
* @date 2020/7/11
*/
protected function installRootPath()
{
return CatchAdmin::directory();
}
/**
* 安装的模块目录
*
* @return string
* @author JaguarJack <njphper@gmail.com>
* @date 2020/7/11
*/
protected function installPath()
{
return CatchAdmin::moduleDirectory($this->module);
}
/**
* 是否第一次安装
*
* @return bool
* @author JaguarJack <njphper@gmail.com>
* @date 2020/7/11
*/
protected function isFirstInstall()
{
return !is_dir($this->installRootPath() . $this->module);
}
} }

View File

@ -329,7 +329,7 @@ class InstallProjectCommand extends Command
版本: %s 版本: %s
初始账号: admin@gmail.com 初始账号: admin@gmail.com
初始密码: admin 初始密码: admin
', CatchAdmin::VERSION, $year)); ', $year, CatchAdmin::VERSION));
exit(0); exit(0);
} }

View File

@ -76,7 +76,7 @@ class Compress
* *
* @time 2020年04月30日 * @time 2020年04月30日
* @param $moduleName * @param $moduleName
* @return void * @return bool
*/ */
public function update($moduleName) public function update($moduleName)
{ {
@ -88,7 +88,10 @@ class Compress
} catch (\Exception $exception) { } catch (\Exception $exception) {
$this->moduleUnzip($moduleName, $backupPath); $this->moduleUnzip($moduleName, $backupPath);
$this->rmDir($this->getModuleBackupPath($moduleName)); $this->rmDir($this->getModuleBackupPath($moduleName));
return false;
} }
return true;
} }
/** /**
@ -108,7 +111,6 @@ class Compress
CatchAdmin::makeDirectory($tempExtractToPath); CatchAdmin::makeDirectory($tempExtractToPath);
// 下载 zip 包 // 下载 zip 包
$res = $zip->open($zipPath); $res = $zip->open($zipPath);
if ($res === true) { if ($res === true) {
$zip->extractTo($tempExtractToPath); $zip->extractTo($tempExtractToPath);
$zip->close(); $zip->close();