153 lines
4.3 KiB
PHP
153 lines
4.3 KiB
PHP
<?php
|
|
|
|
namespace Webman\Console\Commands;
|
|
|
|
use Symfony\Component\Console\Command\Command;
|
|
use Symfony\Component\Console\Input\InputInterface;
|
|
use Symfony\Component\Console\Output\OutputInterface;
|
|
use Symfony\Component\Console\Input\InputOption;
|
|
use Webman\Console\Util;
|
|
|
|
class PluginExportCommand extends Command
|
|
{
|
|
protected static $defaultName = 'plugin:export';
|
|
protected static $defaultDescription = 'Plugin export';
|
|
|
|
/**
|
|
* @return void
|
|
*/
|
|
protected function configure()
|
|
{
|
|
$this->addOption('name', 'name', InputOption::VALUE_REQUIRED, 'Plugin name, for example foo/my-admin');
|
|
$this->addOption('source', 'source', InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, 'Directories to export');
|
|
}
|
|
|
|
/**
|
|
* @param InputInterface $input
|
|
* @param OutputInterface $output
|
|
* @return int
|
|
*/
|
|
protected function execute(InputInterface $input, OutputInterface $output): int
|
|
{
|
|
$output->writeln('Export Plugin');
|
|
$name = strtolower($input->getOption('name'));
|
|
if (!strpos($name, '/')) {
|
|
$output->writeln('<error>Bad name, name must contain character \'/\' , for example foo/MyAdmin</error>');
|
|
return self::INVALID;
|
|
}
|
|
$namespace = Util::nameToNamespace($name);
|
|
$path_relations = $input->getOption('source');
|
|
if (!in_array("config/plugin/$name", $path_relations)) {
|
|
if (is_dir("config/plugin/$name")) {
|
|
$path_relations[] = "config/plugin/$name";
|
|
}
|
|
}
|
|
$original_dest = $dest = base_path()."/vendor/$name";
|
|
$dest .= '/src';
|
|
$this->writeInstallFile($namespace, $path_relations, $dest);
|
|
$output->writeln("<info>Create $dest/Install.php</info>");
|
|
foreach ($path_relations as $source) {
|
|
$base_path = pathinfo("$dest/$source", PATHINFO_DIRNAME);
|
|
if (!is_dir($base_path)) {
|
|
mkdir($base_path, 0777, true);
|
|
}
|
|
$output->writeln("<info>Copy $source to $dest/$source </info>");
|
|
copy_dir($source, "$dest/$source");
|
|
}
|
|
$output->writeln("<info>Saved $name to $original_dest</info>");
|
|
return self::SUCCESS;
|
|
}
|
|
|
|
/**
|
|
* @param $namespace
|
|
* @param $path_relations
|
|
* @param $dest_dir
|
|
* @return void
|
|
*/
|
|
protected function writeInstallFile($namespace, $path_relations, $dest_dir)
|
|
{
|
|
if (!is_dir($dest_dir)) {
|
|
mkdir($dest_dir, 0777, true);
|
|
}
|
|
$relations = [];
|
|
foreach($path_relations as $relation) {
|
|
$relations[$relation] = $relation;
|
|
}
|
|
$relations = var_export($relations, true);
|
|
$install_php_content = <<<EOT
|
|
<?php
|
|
namespace $namespace;
|
|
|
|
class Install
|
|
{
|
|
const WEBMAN_PLUGIN = true;
|
|
|
|
/**
|
|
* @var array
|
|
*/
|
|
protected static \$pathRelation = $relations;
|
|
|
|
/**
|
|
* Install
|
|
* @return void
|
|
*/
|
|
public static function install()
|
|
{
|
|
static::installByRelation();
|
|
}
|
|
|
|
/**
|
|
* Uninstall
|
|
* @return void
|
|
*/
|
|
public static function uninstall()
|
|
{
|
|
self::uninstallByRelation();
|
|
}
|
|
|
|
/**
|
|
* installByRelation
|
|
* @return void
|
|
*/
|
|
public static function installByRelation()
|
|
{
|
|
foreach (static::\$pathRelation as \$source => \$dest) {
|
|
if (\$pos = strrpos(\$dest, '/')) {
|
|
\$parent_dir = base_path().'/'.substr(\$dest, 0, \$pos);
|
|
if (!is_dir(\$parent_dir)) {
|
|
mkdir(\$parent_dir, 0777, true);
|
|
}
|
|
}
|
|
//symlink(__DIR__ . "/\$source", base_path()."/\$dest");
|
|
copy_dir(__DIR__ . "/\$source", base_path()."/\$dest");
|
|
echo "Create \$dest\r\n";
|
|
}
|
|
}
|
|
|
|
/**
|
|
* uninstallByRelation
|
|
* @return void
|
|
*/
|
|
public static function uninstallByRelation()
|
|
{
|
|
foreach (static::\$pathRelation as \$source => \$dest) {
|
|
\$path = base_path()."/\$dest";
|
|
if (!is_dir(\$path) && !is_file(\$path)) {
|
|
continue;
|
|
}
|
|
echo "Remove \$dest\r\n";
|
|
if (is_file(\$path) || is_link(\$path)) {
|
|
unlink(\$path);
|
|
continue;
|
|
}
|
|
remove_dir(\$path);
|
|
}
|
|
}
|
|
|
|
}
|
|
EOT;
|
|
file_put_contents("$dest_dir/Install.php", $install_php_content);
|
|
}
|
|
|
|
}
|