From c42894cec4e5fef803a33b93741c38698045d2ea Mon Sep 17 00:00:00 2001 From: Qiang Xue Date: Sat, 19 Oct 2013 00:01:03 -0400 Subject: [PATCH] Extension installer wip --- extensions/composer/composer.json | 9 +-- extensions/composer/yii/composer/Installer.php | 83 +++++++------------------- extensions/mutex/composer.json | 5 +- framework/composer.json | 1 + 4 files changed, 29 insertions(+), 69 deletions(-) diff --git a/extensions/composer/composer.json b/extensions/composer/composer.json index db430a2..b696093 100644 --- a/extensions/composer/composer.json +++ b/extensions/composer/composer.json @@ -1,8 +1,8 @@ { "name": "yiisoft/yii2-composer", - "description": "The composer integration for the Yii framework", - "keywords": ["yii", "composer", "install", "update"], - "type": "library", + "description": "The composer plugin for Yii extension installer", + "keywords": ["yii", "composer", "extension installer"], + "type": "composer-plugin", "license": "BSD-3-Clause", "support": { "issues": "https://github.com/yiisoft/yii2/issues?state=open", @@ -18,9 +18,6 @@ } ], "minimum-stability": "dev", - "require": { - "yiisoft/yii2": "*" - }, "autoload": { "psr-0": { "yii\\composer\\": "" } } diff --git a/extensions/composer/yii/composer/Installer.php b/extensions/composer/yii/composer/Installer.php index 3082c3b..6fcfeff 100644 --- a/extensions/composer/yii/composer/Installer.php +++ b/extensions/composer/yii/composer/Installer.php @@ -10,6 +10,9 @@ namespace yii\composer; use Composer\Package\PackageInterface; use Composer\Installer\LibraryInstaller; use Composer\Repository\InstalledRepositoryInterface; +use Composer\Script\CommandEvent; +use yii\console\Application; +use yii\console\Exception; /** * @author Qiang Xue @@ -17,20 +20,18 @@ use Composer\Repository\InstalledRepositoryInterface; */ class Installer extends LibraryInstaller { - const EXTRA_WRITABLES = 'yii-writables'; - const EXTRA_EXECUTABLES = 'yii-executables'; + const EXTRA_WRITABLE = 'writable'; + const EXTRA_EXECUTABLE = 'executable'; const EXTRA_CONFIG = 'yii-config'; const EXTRA_COMMANDS = 'yii-commands'; - const EXTRA_ALIASES = 'yii-aliases'; - const EXTRA_PREINIT = 'yii-preinit'; - const EXTRA_INIT = 'yii-init'; + const EXTRA_BOOTSTRAP = 'bootstrap'; /** * @inheritdoc */ public function supports($packageType) { - return $packageType === 'yii2-extension'; + return $packageType === 'yii-extension'; } /** @@ -63,81 +64,39 @@ class Installer extends LibraryInstaller protected function addPackage(PackageInterface $package) { - $extension = ['name' => $package->getPrettyName()]; - - $root = $package->getPrettyName(); - if ($targetDir = $package->getTargetDir()) { - $root .= '/' . trim($targetDir, '/'); - } - $root = trim($root, '/'); + $extension = [ + 'name' => $package->getPrettyName(), + 'version' => $package->getVersion(), + ]; $extra = $package->getExtra(); - if (isset($extra[self::EXTRA_PREINIT]) && is_string($extra[self::EXTRA_PREINIT])) { - $extension[self::EXTRA_PREINIT] = "/$root/" . ltrim(str_replace('\\', '/', $extra[self::EXTRA_PREINIT]), '/'); - } - if (isset($extra[self::EXTRA_INIT]) && is_string($extra[self::EXTRA_INIT])) { - $extension[self::EXTRA_INIT] = "/$root/" . ltrim(str_replace('\\', '/', $extra[self::EXTRA_INIT]), '/'); - } - - if (isset($extra['aliases']) && is_array($extra['aliases'])) { - foreach ($extra['aliases'] as $alias => $path) { - $extension['aliases']['@' . ltrim($alias, '@')] = "/$root/" . ltrim(str_replace('\\', '/', $path), '/'); - } - } - - if (!empty($aliases)) { - foreach ($aliases as $alias => $path) { - if (strncmp($alias, '@', 1) !== 0) { - $alias = '@' . $alias; - } - $path = trim(str_replace('\\', '/', $path), '/'); - $extension['aliases'][$alias] = $root . '/' . $path; - } + if (isset($extra[self::EXTRA_BOOTSTRAP]) && is_string($extra[self::EXTRA_BOOTSTRAP])) { + $extension['bootstrap'] = $extra[self::EXTRA_BOOTSTRAP]; } $extensions = $this->loadExtensions(); - $extensions[$package->getId()] = $extension; + $extensions[$package->getUniqueName()] = $extension; $this->saveExtensions($extensions); } protected function removePackage(PackageInterface $package) { $packages = $this->loadExtensions(); - unset($packages[$package->getId()]); + unset($packages[$package->getUniqueName()]); $this->saveExtensions($packages); } protected function loadExtensions() { $file = $this->vendorDir . '/yii-extensions.php'; - if (!is_file($file)) { - return []; - } - $extensions = require($file); - /** @var string $vendorDir defined in yii-extensions.php */ - $n = strlen($vendorDir); - foreach ($extensions as &$extension) { - if (isset($extension['aliases'])) { - foreach ($extension['aliases'] as $alias => $path) { - $extension['aliases'][$alias] = '' . substr($path, $n); - } - } - if (isset($extension[self::EXTRA_PREINIT])) { - $extension[self::EXTRA_PREINIT] = '' . substr($extension[self::EXTRA_PREINIT], $n); - } - if (isset($extension[self::EXTRA_INIT])) { - $extension[self::EXTRA_INIT] = '' . substr($extension[self::EXTRA_INIT], $n); - } - } - return $extensions; + return is_file($file) ? require($file) : []; } protected function saveExtensions(array $extensions) { $file = $this->vendorDir . '/yii-extensions.php'; - $array = str_replace("'", '$vendorDir . \'', var_export($extensions, true)); - file_put_contents($file, " [], - self::EXTRA_EXECUTABLES => [], + self::EXTRA_WRITABLE => [], + self::EXTRA_EXECUTABLE => [], ], $event->getComposer()->getPackage()->getExtra()); - foreach ((array)$options[self::EXTRA_WRITABLES] as $path) { + foreach ((array)$options[self::EXTRA_WRITABLE] as $path) { echo "Setting writable: $path ..."; if (is_dir($path)) { chmod($path, 0777); @@ -163,7 +122,7 @@ class Installer extends LibraryInstaller } } - foreach ((array)$options[self::EXTRA_EXECUTABLES] as $path) { + foreach ((array)$options[self::EXTRA_EXECUTABLE] as $path) { echo "Setting executable: $path ..."; if (is_file($path)) { chmod($path, 0755); diff --git a/extensions/mutex/composer.json b/extensions/mutex/composer.json index 2fb95c4..99adcdf 100644 --- a/extensions/mutex/composer.json +++ b/extensions/mutex/composer.json @@ -2,7 +2,7 @@ "name": "yiisoft/yii2-mutex", "description": "Mutual exclusion extension for the Yii framework", "keywords": ["yii", "mutex"], - "type": "library", + "type": "yii-extension", "license": "BSD-3-Clause", "support": { "issues": "https://github.com/yiisoft/yii2/issues?state=open", @@ -23,5 +23,8 @@ }, "autoload": { "psr-0": { "yii\\mutex\\": "" } + }, + "extra": { + "bootstrap": "yii\\mutex\\Extension" } } diff --git a/framework/composer.json b/framework/composer.json index 0a9c630..419b4b7 100644 --- a/framework/composer.json +++ b/framework/composer.json @@ -65,6 +65,7 @@ }, "require": { "php": ">=5.4.0", + "yiisoft/yii2-composer": "*", "ext-mbstring": "*", "lib-pcre": "*", "phpspec/php-diff": "1.0.*",