Commit c42894ce by Qiang Xue

Extension installer wip

parent f130dca1
{ {
"name": "yiisoft/yii2-composer", "name": "yiisoft/yii2-composer",
"description": "The composer integration for the Yii framework", "description": "The composer plugin for Yii extension installer",
"keywords": ["yii", "composer", "install", "update"], "keywords": ["yii", "composer", "extension installer"],
"type": "library", "type": "composer-plugin",
"license": "BSD-3-Clause", "license": "BSD-3-Clause",
"support": { "support": {
"issues": "https://github.com/yiisoft/yii2/issues?state=open", "issues": "https://github.com/yiisoft/yii2/issues?state=open",
...@@ -18,9 +18,6 @@ ...@@ -18,9 +18,6 @@
} }
], ],
"minimum-stability": "dev", "minimum-stability": "dev",
"require": {
"yiisoft/yii2": "*"
},
"autoload": { "autoload": {
"psr-0": { "yii\\composer\\": "" } "psr-0": { "yii\\composer\\": "" }
} }
......
...@@ -10,6 +10,9 @@ namespace yii\composer; ...@@ -10,6 +10,9 @@ namespace yii\composer;
use Composer\Package\PackageInterface; use Composer\Package\PackageInterface;
use Composer\Installer\LibraryInstaller; use Composer\Installer\LibraryInstaller;
use Composer\Repository\InstalledRepositoryInterface; use Composer\Repository\InstalledRepositoryInterface;
use Composer\Script\CommandEvent;
use yii\console\Application;
use yii\console\Exception;
/** /**
* @author Qiang Xue <qiang.xue@gmail.com> * @author Qiang Xue <qiang.xue@gmail.com>
...@@ -17,20 +20,18 @@ use Composer\Repository\InstalledRepositoryInterface; ...@@ -17,20 +20,18 @@ use Composer\Repository\InstalledRepositoryInterface;
*/ */
class Installer extends LibraryInstaller class Installer extends LibraryInstaller
{ {
const EXTRA_WRITABLES = 'yii-writables'; const EXTRA_WRITABLE = 'writable';
const EXTRA_EXECUTABLES = 'yii-executables'; const EXTRA_EXECUTABLE = 'executable';
const EXTRA_CONFIG = 'yii-config'; const EXTRA_CONFIG = 'yii-config';
const EXTRA_COMMANDS = 'yii-commands'; const EXTRA_COMMANDS = 'yii-commands';
const EXTRA_ALIASES = 'yii-aliases'; const EXTRA_BOOTSTRAP = 'bootstrap';
const EXTRA_PREINIT = 'yii-preinit';
const EXTRA_INIT = 'yii-init';
/** /**
* @inheritdoc * @inheritdoc
*/ */
public function supports($packageType) public function supports($packageType)
{ {
return $packageType === 'yii2-extension'; return $packageType === 'yii-extension';
} }
/** /**
...@@ -63,81 +64,39 @@ class Installer extends LibraryInstaller ...@@ -63,81 +64,39 @@ class Installer extends LibraryInstaller
protected function addPackage(PackageInterface $package) protected function addPackage(PackageInterface $package)
{ {
$extension = ['name' => $package->getPrettyName()]; $extension = [
'name' => $package->getPrettyName(),
$root = $package->getPrettyName(); 'version' => $package->getVersion(),
if ($targetDir = $package->getTargetDir()) { ];
$root .= '/' . trim($targetDir, '/');
}
$root = trim($root, '/');
$extra = $package->getExtra(); $extra = $package->getExtra();
if (isset($extra[self::EXTRA_PREINIT]) && is_string($extra[self::EXTRA_PREINIT])) { if (isset($extra[self::EXTRA_BOOTSTRAP]) && is_string($extra[self::EXTRA_BOOTSTRAP])) {
$extension[self::EXTRA_PREINIT] = "<vendor-dir>/$root/" . ltrim(str_replace('\\', '/', $extra[self::EXTRA_PREINIT]), '/'); $extension['bootstrap'] = $extra[self::EXTRA_BOOTSTRAP];
}
if (isset($extra[self::EXTRA_INIT]) && is_string($extra[self::EXTRA_INIT])) {
$extension[self::EXTRA_INIT] = "<vendor-dir>/$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, '@')] = "<vendor-dir>/$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;
}
} }
$extensions = $this->loadExtensions(); $extensions = $this->loadExtensions();
$extensions[$package->getId()] = $extension; $extensions[$package->getUniqueName()] = $extension;
$this->saveExtensions($extensions); $this->saveExtensions($extensions);
} }
protected function removePackage(PackageInterface $package) protected function removePackage(PackageInterface $package)
{ {
$packages = $this->loadExtensions(); $packages = $this->loadExtensions();
unset($packages[$package->getId()]); unset($packages[$package->getUniqueName()]);
$this->saveExtensions($packages); $this->saveExtensions($packages);
} }
protected function loadExtensions() protected function loadExtensions()
{ {
$file = $this->vendorDir . '/yii-extensions.php'; $file = $this->vendorDir . '/yii-extensions.php';
if (!is_file($file)) { return is_file($file) ? require($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] = '<vendor-dir>' . substr($path, $n);
}
}
if (isset($extension[self::EXTRA_PREINIT])) {
$extension[self::EXTRA_PREINIT] = '<vendor-dir>' . substr($extension[self::EXTRA_PREINIT], $n);
}
if (isset($extension[self::EXTRA_INIT])) {
$extension[self::EXTRA_INIT] = '<vendor-dir>' . substr($extension[self::EXTRA_INIT], $n);
}
}
return $extensions;
} }
protected function saveExtensions(array $extensions) protected function saveExtensions(array $extensions)
{ {
$file = $this->vendorDir . '/yii-extensions.php'; $file = $this->vendorDir . '/yii-extensions.php';
$array = str_replace("'<vendor-dir>", '$vendorDir . \'', var_export($extensions, true)); file_put_contents($file, "<?php\nreturn " . var_export($extensions, true) . ";\n");
file_put_contents($file, "<?php\n\$vendorDir = __DIR__;\n\nreturn $array;\n");
} }
...@@ -148,11 +107,11 @@ class Installer extends LibraryInstaller ...@@ -148,11 +107,11 @@ class Installer extends LibraryInstaller
public static function setPermissions($event) public static function setPermissions($event)
{ {
$options = array_merge([ $options = array_merge([
self::EXTRA_WRITABLES => [], self::EXTRA_WRITABLE => [],
self::EXTRA_EXECUTABLES => [], self::EXTRA_EXECUTABLE => [],
], $event->getComposer()->getPackage()->getExtra()); ], $event->getComposer()->getPackage()->getExtra());
foreach ((array)$options[self::EXTRA_WRITABLES] as $path) { foreach ((array)$options[self::EXTRA_WRITABLE] as $path) {
echo "Setting writable: $path ..."; echo "Setting writable: $path ...";
if (is_dir($path)) { if (is_dir($path)) {
chmod($path, 0777); chmod($path, 0777);
...@@ -163,7 +122,7 @@ class Installer extends LibraryInstaller ...@@ -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 ..."; echo "Setting executable: $path ...";
if (is_file($path)) { if (is_file($path)) {
chmod($path, 0755); chmod($path, 0755);
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
"name": "yiisoft/yii2-mutex", "name": "yiisoft/yii2-mutex",
"description": "Mutual exclusion extension for the Yii framework", "description": "Mutual exclusion extension for the Yii framework",
"keywords": ["yii", "mutex"], "keywords": ["yii", "mutex"],
"type": "library", "type": "yii-extension",
"license": "BSD-3-Clause", "license": "BSD-3-Clause",
"support": { "support": {
"issues": "https://github.com/yiisoft/yii2/issues?state=open", "issues": "https://github.com/yiisoft/yii2/issues?state=open",
...@@ -23,5 +23,8 @@ ...@@ -23,5 +23,8 @@
}, },
"autoload": { "autoload": {
"psr-0": { "yii\\mutex\\": "" } "psr-0": { "yii\\mutex\\": "" }
},
"extra": {
"bootstrap": "yii\\mutex\\Extension"
} }
} }
...@@ -65,6 +65,7 @@ ...@@ -65,6 +65,7 @@
}, },
"require": { "require": {
"php": ">=5.4.0", "php": ">=5.4.0",
"yiisoft/yii2-composer": "*",
"ext-mbstring": "*", "ext-mbstring": "*",
"lib-pcre": "*", "lib-pcre": "*",
"phpspec/php-diff": "1.0.*", "phpspec/php-diff": "1.0.*",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment