171 lines
5.7 KiB
PHP
171 lines
5.7 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This file is part of the Symfony package.
|
|
*
|
|
* (c) Fabien Potencier <fabien@symfony.com>
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Sensio\Bundle\DistributionBundle\Composer;
|
|
|
|
use Symfony\Component\ClassLoader\ClassCollectionLoader;
|
|
use Symfony\Component\Process\Process;
|
|
use Symfony\Component\Process\PhpExecutableFinder;
|
|
|
|
/**
|
|
* @author Jordi Boggiano <j.boggiano@seld.be>
|
|
*/
|
|
class ScriptHandler
|
|
{
|
|
public static function buildBootstrap($event)
|
|
{
|
|
$options = self::getOptions($event);
|
|
$appDir = $options['symfony-app-dir'];
|
|
|
|
if (!is_dir($appDir)) {
|
|
echo 'The symfony-app-dir ('.$appDir.') specified in composer.json was not found in '.getcwd().', can not build bootstrap file.'.PHP_EOL;
|
|
|
|
return;
|
|
}
|
|
|
|
static::executeBuildBootstrap($appDir);
|
|
}
|
|
|
|
public static function clearCache($event)
|
|
{
|
|
$options = self::getOptions($event);
|
|
$appDir = $options['symfony-app-dir'];
|
|
|
|
if (!is_dir($appDir)) {
|
|
echo 'The symfony-app-dir ('.$appDir.') specified in composer.json was not found in '.getcwd().', can not clear the cache.'.PHP_EOL;
|
|
|
|
return;
|
|
}
|
|
|
|
static::executeCommand($event, $appDir, 'cache:clear --no-warmup');
|
|
}
|
|
|
|
public static function installAssets($event)
|
|
{
|
|
$options = self::getOptions($event);
|
|
$appDir = $options['symfony-app-dir'];
|
|
$webDir = $options['symfony-web-dir'];
|
|
|
|
$symlink = '';
|
|
if ($options['symfony-assets-install'] == 'symlink') {
|
|
$symlink = '--symlink ';
|
|
} elseif ($options['symfony-assets-install'] == 'relative') {
|
|
$symlink = '--symlink --relative ';
|
|
}
|
|
|
|
if (!is_dir($webDir)) {
|
|
echo 'The symfony-web-dir ('.$webDir.') specified in composer.json was not found in '.getcwd().', can not install assets.'.PHP_EOL;
|
|
|
|
return;
|
|
}
|
|
|
|
static::executeCommand($event, $appDir, 'assets:install '.$symlink.escapeshellarg($webDir));
|
|
}
|
|
|
|
public static function installRequirementsFile($event)
|
|
{
|
|
$options = self::getOptions($event);
|
|
$appDir = $options['symfony-app-dir'];
|
|
|
|
if (!is_dir($appDir)) {
|
|
echo 'The symfony-app-dir ('.$appDir.') specified in composer.json was not found in '.getcwd().', can not install the requirements file.'.PHP_EOL;
|
|
|
|
return;
|
|
}
|
|
|
|
copy(__DIR__.'/../Resources/skeleton/app/SymfonyRequirements.php', $appDir.'/SymfonyRequirements.php');
|
|
copy(__DIR__.'/../Resources/skeleton/app/check.php', $appDir.'/check.php');
|
|
|
|
$webDir = $options['symfony-web-dir'];
|
|
|
|
if (is_file($webDir.'/config.php')) {
|
|
copy(__DIR__.'/../Resources/skeleton/web/config.php', $webDir.'/config.php');
|
|
}
|
|
}
|
|
|
|
public static function doBuildBootstrap($appDir)
|
|
{
|
|
$file = $appDir.'/bootstrap.php.cache';
|
|
if (file_exists($file)) {
|
|
unlink($file);
|
|
}
|
|
|
|
ClassCollectionLoader::load(array(
|
|
'Symfony\\Component\\DependencyInjection\\ContainerAwareInterface',
|
|
// Cannot be included because annotations will parse the big compiled class file
|
|
//'Symfony\\Component\\DependencyInjection\\ContainerAware',
|
|
'Symfony\\Component\\DependencyInjection\\Container',
|
|
'Symfony\\Component\\HttpKernel\\Kernel',
|
|
'Symfony\\Component\\ClassLoader\\ClassCollectionLoader',
|
|
'Symfony\\Component\\ClassLoader\\ApcClassLoader',
|
|
'Symfony\\Component\\HttpKernel\\Bundle\\Bundle',
|
|
'Symfony\\Component\\Config\\ConfigCache',
|
|
'Symfony\\Bundle\\FrameworkBundle\\HttpKernel',
|
|
// cannot be included as commands are discovered based on the path to this class via Reflection
|
|
//'Symfony\\Bundle\\FrameworkBundle\\FrameworkBundle',
|
|
), dirname($file), basename($file, '.php.cache'), false, false, '.php.cache');
|
|
|
|
file_put_contents($file, sprintf("<?php
|
|
|
|
namespace { \$loader = require_once __DIR__.'/autoload.php'; }
|
|
|
|
%s
|
|
|
|
namespace { return \$loader; }
|
|
", substr(file_get_contents($file), 5)));
|
|
}
|
|
|
|
protected static function executeCommand($event, $appDir, $cmd)
|
|
{
|
|
$php = escapeshellarg(self::getPhp());
|
|
$console = escapeshellarg($appDir.'/console');
|
|
if ($event->getIO()->isDecorated()) {
|
|
$console.= ' --ansi';
|
|
}
|
|
|
|
$process = new Process($php.' '.$console.' '.$cmd, null, null, null, 300);
|
|
$process->run(function ($type, $buffer) { echo $buffer; });
|
|
}
|
|
|
|
protected static function executeBuildBootstrap($appDir)
|
|
{
|
|
$php = escapeshellarg(self::getPhp());
|
|
$cmd = escapeshellarg(__DIR__.'/../Resources/bin/build_bootstrap.php');
|
|
$appDir = escapeshellarg($appDir);
|
|
|
|
$process = new Process($php.' '.$cmd.' '.$appDir, null, null, null, 300);
|
|
$process->run(function ($type, $buffer) { echo $buffer; });
|
|
}
|
|
|
|
protected static function getOptions($event)
|
|
{
|
|
$options = array_merge(array(
|
|
'symfony-app-dir' => 'app',
|
|
'symfony-web-dir' => 'web',
|
|
'symfony-assets-install' => 'hard'
|
|
), $event->getComposer()->getPackage()->getExtra());
|
|
|
|
$options['symfony-assets-install'] = getenv('SYMFONY_ASSETS_INSTALL') ?: $options['symfony-assets-install'];
|
|
|
|
return $options;
|
|
}
|
|
|
|
protected static function getPhp()
|
|
{
|
|
$phpFinder = new PhpExecutableFinder;
|
|
if (!$phpPath = $phpFinder->find()) {
|
|
throw new \RuntimeException('The php executable could not be found, add it to your PATH environment variable and try again');
|
|
}
|
|
|
|
return $phpPath;
|
|
}
|
|
}
|