Added prepare method for exphp
This commit is contained in:
parent
9e94c6ace3
commit
c3f6c482f3
6 changed files with 199 additions and 37 deletions
|
@ -12,5 +12,5 @@
|
||||||
/**
|
/**
|
||||||
* The current version of the package structure file format
|
* The current version of the package structure file format
|
||||||
*/
|
*/
|
||||||
const PackageStructureVersion = '1.0.0';
|
const PackageStructureVersion = '1.0';
|
||||||
}
|
}
|
139
src/ncc/CLI/BuildMenu.php
Normal file
139
src/ncc/CLI/BuildMenu.php
Normal file
|
@ -0,0 +1,139 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace ncc\CLI;
|
||||||
|
|
||||||
|
use ncc\Abstracts\CompilerExtensions;
|
||||||
|
use ncc\Abstracts\Options\BuildConfigurationValues;
|
||||||
|
use ncc\Classes\PhpExtension\Compiler;
|
||||||
|
use ncc\Exceptions\BuildConfigurationNotFoundException;
|
||||||
|
use ncc\Exceptions\FileNotFoundException;
|
||||||
|
use ncc\Exceptions\MalformedJsonException;
|
||||||
|
use ncc\Exceptions\PackagePreparationFailedException;
|
||||||
|
use ncc\Interfaces\CompilerInterface;
|
||||||
|
use ncc\Objects\CliHelpSection;
|
||||||
|
use ncc\Objects\ProjectConfiguration;
|
||||||
|
use ncc\Utilities\Console;
|
||||||
|
|
||||||
|
class BuildMenu
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Displays the main help menu
|
||||||
|
*
|
||||||
|
* @param $args
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function start($args): void
|
||||||
|
{
|
||||||
|
if(isset($args['help']))
|
||||||
|
{
|
||||||
|
self::displayOptions();
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
self::build($args);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Builds the current project
|
||||||
|
*
|
||||||
|
* @param $args
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
private static function build($args): void
|
||||||
|
{
|
||||||
|
$project_path = getcwd() . DIRECTORY_SEPARATOR . 'project.json';
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
$ProjectConfiguration = ProjectConfiguration::fromFile($project_path);
|
||||||
|
}
|
||||||
|
catch (FileNotFoundException $e)
|
||||||
|
{
|
||||||
|
Console::outException('Cannot find the file \'project.json\'', $e, 1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
catch (MalformedJsonException $e)
|
||||||
|
{
|
||||||
|
Console::outException('The file \'project.json\' contains malformed json data, please verify the syntax of the file', $e, 1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Select the correct compiler for the specified extension
|
||||||
|
switch(strtolower($ProjectConfiguration->Project->Compiler->Extension))
|
||||||
|
{
|
||||||
|
case CompilerExtensions::PHP:
|
||||||
|
/** @var CompilerInterface $Compiler */
|
||||||
|
$Compiler = new Compiler($ProjectConfiguration);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
Console::outError('The extension '. $ProjectConfiguration->Project->Compiler->Extension . ' is not supported', true, 1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$build_configuration = BuildConfigurationValues::DefaultConfiguration;
|
||||||
|
|
||||||
|
if(isset($args['config']))
|
||||||
|
{
|
||||||
|
$build_configuration = $args['config'];
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
$ProjectConfiguration->Build->getBuildConfiguration($build_configuration);
|
||||||
|
}
|
||||||
|
catch (BuildConfigurationNotFoundException $e)
|
||||||
|
{
|
||||||
|
Console::outException('The build configuration \'' . $build_configuration . '\' does not exist in the project configuration', $e, 1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Console::out(
|
||||||
|
' ===== BUILD INFO ===== ' . PHP_EOL .
|
||||||
|
' Package Name: ' . $ProjectConfiguration->Assembly->Package . PHP_EOL .
|
||||||
|
' Version: ' . $ProjectConfiguration->Assembly->Version . PHP_EOL .
|
||||||
|
' Compiler Extension: ' . $ProjectConfiguration->Project->Compiler->Extension . PHP_EOL .
|
||||||
|
' Compiler Version: ' . $ProjectConfiguration->Project->Compiler->MaximumVersion . ' - ' . $ProjectConfiguration->Project->Compiler->MinimumVersion . PHP_EOL .
|
||||||
|
' Build Configuration: ' . $build_configuration . PHP_EOL
|
||||||
|
);
|
||||||
|
|
||||||
|
Console::out('Preparing package');
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
$Compiler->prepare([], getcwd(), $build_configuration);
|
||||||
|
}
|
||||||
|
catch (PackagePreparationFailedException $e)
|
||||||
|
{
|
||||||
|
Console::outException('The package preparation process failed', $e, 1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Displays the main options section
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
private static function displayOptions(): void
|
||||||
|
{
|
||||||
|
$options = [
|
||||||
|
new CliHelpSection(['help'], 'Displays this help menu about the value command'),
|
||||||
|
new CliHelpSection(['build'], 'Builds the current project using the default build configuration'),
|
||||||
|
new CliHelpSection(['build', '--config'], 'Builds the current project with a specified build configuration')
|
||||||
|
];
|
||||||
|
|
||||||
|
$options_padding = \ncc\Utilities\Functions::detectParametersPadding($options) + 4;
|
||||||
|
|
||||||
|
Console::out('Usage: ncc build [options]');
|
||||||
|
Console::out('Options:' . PHP_EOL);
|
||||||
|
foreach($options as $option)
|
||||||
|
{
|
||||||
|
Console::out(' ' . $option->toString($options_padding));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -74,7 +74,7 @@
|
||||||
}
|
}
|
||||||
catch(Exception $e)
|
catch(Exception $e)
|
||||||
{
|
{
|
||||||
Console::out('Error: ' . $e->getMessage() . ' (Code: ' . $e->getCode() . ')');
|
Console::outException('Error: ' . $e->getMessage() . ' (Code: ' . $e->getCode() . ')', $e, 1);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,11 +5,10 @@
|
||||||
namespace ncc\Classes\PhpExtension;
|
namespace ncc\Classes\PhpExtension;
|
||||||
|
|
||||||
use FilesystemIterator;
|
use FilesystemIterator;
|
||||||
use ncc\Abstracts\CompilerOptions;
|
|
||||||
use ncc\Abstracts\ComponentFileExtensions;
|
use ncc\Abstracts\ComponentFileExtensions;
|
||||||
use ncc\Abstracts\Options\BuildConfigurationValues;
|
use ncc\Abstracts\Options\BuildConfigurationValues;
|
||||||
use ncc\Abstracts\Versions;
|
|
||||||
use ncc\Exceptions\BuildConfigurationNotFoundException;
|
use ncc\Exceptions\BuildConfigurationNotFoundException;
|
||||||
|
use ncc\Exceptions\BuildException;
|
||||||
use ncc\Exceptions\PackagePreparationFailedException;
|
use ncc\Exceptions\PackagePreparationFailedException;
|
||||||
use ncc\Interfaces\CompilerInterface;
|
use ncc\Interfaces\CompilerInterface;
|
||||||
use ncc\ncc;
|
use ncc\ncc;
|
||||||
|
@ -18,6 +17,7 @@
|
||||||
use ncc\ThirdParty\theseer\DirectoryScanner\DirectoryScanner;
|
use ncc\ThirdParty\theseer\DirectoryScanner\DirectoryScanner;
|
||||||
use ncc\ThirdParty\theseer\DirectoryScanner\Exception;
|
use ncc\ThirdParty\theseer\DirectoryScanner\Exception;
|
||||||
use ncc\Utilities\Console;
|
use ncc\Utilities\Console;
|
||||||
|
use ncc\Utilities\Functions;
|
||||||
use SplFileInfo;
|
use SplFileInfo;
|
||||||
|
|
||||||
class Compiler implements CompilerInterface
|
class Compiler implements CompilerInterface
|
||||||
|
@ -45,12 +45,12 @@
|
||||||
* This function must be called before calling the build function, otherwise the operation will fail
|
* This function must be called before calling the build function, otherwise the operation will fail
|
||||||
*
|
*
|
||||||
* @param array $options
|
* @param array $options
|
||||||
* @param string $src
|
* @param string $path
|
||||||
* @param string $build_configuration
|
* @param string $build_configuration
|
||||||
* @return void
|
* @return void
|
||||||
* @throws PackagePreparationFailedException
|
* @throws PackagePreparationFailedException
|
||||||
*/
|
*/
|
||||||
public function prepare(array $options, string $src, string $build_configuration=BuildConfigurationValues::DefaultConfiguration)
|
public function prepare(array $options, string $path, string $build_configuration=BuildConfigurationValues::DefaultConfiguration): void
|
||||||
{
|
{
|
||||||
// Auto-select the default build configuration
|
// Auto-select the default build configuration
|
||||||
if($build_configuration == BuildConfigurationValues::DefaultConfiguration)
|
if($build_configuration == BuildConfigurationValues::DefaultConfiguration)
|
||||||
|
@ -79,9 +79,8 @@
|
||||||
|
|
||||||
if(ncc::cliMode())
|
if(ncc::cliMode())
|
||||||
{
|
{
|
||||||
Console::out('Building autoloader');
|
Console::out('Scanning project files');
|
||||||
Console::out('theseer\DirectoryScanner - Copyright (c) 2009-2014 Arne Blankerts <arne@blankerts.de> All rights reserved.');
|
Console::out('theseer\DirectoryScanner - Copyright (c) 2009-2014 Arne Blankerts <arne@blankerts.de> All rights reserved.');
|
||||||
Console::out('theseer\Autoload - Copyright (c) 2010-2016 Arne Blankerts <arne@blankerts.de> and Contributors All rights reserved.');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// First scan the project files and create a file struct.
|
// First scan the project files and create a file struct.
|
||||||
|
@ -89,8 +88,7 @@
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
$DirectoryScanner->unsetFlag(FilesystemIterator::
|
$DirectoryScanner->unsetFlag(FilesystemIterator::FOLLOW_SYMLINKS);
|
||||||
FOLLOW_SYMLINKS);
|
|
||||||
}
|
}
|
||||||
catch (Exception $e)
|
catch (Exception $e)
|
||||||
{
|
{
|
||||||
|
@ -101,20 +99,30 @@
|
||||||
$DirectoryScanner->setIncludes(ComponentFileExtensions::Php);
|
$DirectoryScanner->setIncludes(ComponentFileExtensions::Php);
|
||||||
$DirectoryScanner->setExcludes($selected_build_configuration->ExcludeFiles);
|
$DirectoryScanner->setExcludes($selected_build_configuration->ExcludeFiles);
|
||||||
|
|
||||||
|
// Append trailing slash to the end of the path if it's not already there
|
||||||
|
if(substr($path, -1) !== DIRECTORY_SEPARATOR)
|
||||||
|
{
|
||||||
|
$path .= DIRECTORY_SEPARATOR;
|
||||||
|
}
|
||||||
|
|
||||||
|
$source_path = $path . $this->project->Build->SourcePath;
|
||||||
|
|
||||||
// Scan for components first.
|
// Scan for components first.
|
||||||
Console::out('Scanning for components...', false);
|
Console::out('Scanning for components... ', false);
|
||||||
/** @var SplFileInfo $item */
|
/** @var SplFileInfo $item */
|
||||||
foreach($DirectoryScanner($src, true) as $item)
|
foreach($DirectoryScanner($source_path, true) as $item)
|
||||||
{
|
{
|
||||||
// Ignore directories, they're not important. :-)
|
// Ignore directories, they're not important. :-)
|
||||||
if(is_dir($item->getPath()))
|
if(is_dir($item->getPathName()))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
$Component = new Package\Component();
|
$Component = new Package\Component();
|
||||||
$Component->Name = $item->getPath();
|
$Component->Name = Functions::removeBasename($item->getPathname(), $path);
|
||||||
$this->package->Components[] = $Component;
|
$this->package->Components[] = $Component;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(ncc::cliMode())
|
||||||
|
{
|
||||||
if(count($this->package->Components) > 0)
|
if(count($this->package->Components) > 0)
|
||||||
{
|
{
|
||||||
Console::out(count($this->package->Components) . ' component(s) found');
|
Console::out(count($this->package->Components) . ' component(s) found');
|
||||||
|
@ -123,27 +131,34 @@
|
||||||
{
|
{
|
||||||
Console::out('No components found');
|
Console::out('No components found');
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Now scan for resources
|
|
||||||
Console::out('Scanning for resources...', false);
|
// Clear previous excludes and includes
|
||||||
|
$DirectoryScanner->setExcludes([]);
|
||||||
|
$DirectoryScanner->setIncludes([]);
|
||||||
|
|
||||||
|
// Ignore component files
|
||||||
$DirectoryScanner->setExcludes(array_merge(
|
$DirectoryScanner->setExcludes(array_merge(
|
||||||
$selected_build_configuration->ExcludeFiles, ComponentFileExtensions::Php
|
$selected_build_configuration->ExcludeFiles, ComponentFileExtensions::Php
|
||||||
));
|
));
|
||||||
|
|
||||||
// Scan for components first.
|
Console::out('Scanning for resources... ', false);
|
||||||
/** @var SplFileInfo $item */
|
/** @var SplFileInfo $item */
|
||||||
foreach($DirectoryScanner($src, true) as $item)
|
foreach($DirectoryScanner($source_path, true) as $item)
|
||||||
{
|
{
|
||||||
// Ignore directories, they're not important. :-)
|
// Ignore directories, they're not important. :-)
|
||||||
if(is_dir($item->getPath()))
|
if(is_dir($item->getPathName()))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
$Resource = new Package\Resource();
|
$Resource = new Package\Resource();
|
||||||
$Resource->Name = $item->getPath();
|
$Resource->Name = Functions::removeBasename($item->getPathname(), $path);
|
||||||
$this->package->Resources[] = $Resource;
|
$this->package->Resources[] = $Resource;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(ncc::cliMode())
|
||||||
|
{
|
||||||
if(count($this->package->Resources) > 0)
|
if(count($this->package->Resources) > 0)
|
||||||
{
|
{
|
||||||
Console::out(count($this->package->Resources) . ' resources(s) found');
|
Console::out(count($this->package->Resources) . ' resources(s) found');
|
||||||
|
@ -153,9 +168,15 @@
|
||||||
Console::out('No resources found');
|
Console::out('No resources found');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public function build(array $options, string $src)
|
public function build(array $options, string $path): string
|
||||||
{
|
{
|
||||||
// TODO: Implement build() method.
|
if($this->package == null)
|
||||||
|
{
|
||||||
|
throw new BuildException('The prepare() method must be called before building the package');
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Implement build() method
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -80,6 +80,8 @@
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
$this->MagicBytes = new MagicBytes();
|
$this->MagicBytes = new MagicBytes();
|
||||||
|
$this->Header = new Header();
|
||||||
|
$this->Assembly = new Assembly();
|
||||||
$this->Components = [];
|
$this->Components = [];
|
||||||
$this->Dependencies = [];
|
$this->Dependencies = [];
|
||||||
$this->Resources = [];
|
$this->Resources = [];
|
||||||
|
|
|
@ -108,9 +108,9 @@
|
||||||
{
|
{
|
||||||
$ProjectConfigurationObject = new ProjectConfiguration();
|
$ProjectConfigurationObject = new ProjectConfiguration();
|
||||||
|
|
||||||
$ProjectConfigurationObject->Project = Functions::array_bc($data, 'project');
|
$ProjectConfigurationObject->Project = Project::fromArray(Functions::array_bc($data, 'project'));
|
||||||
$ProjectConfigurationObject->Assembly = Functions::array_bc($data, 'assembly');
|
$ProjectConfigurationObject->Assembly = Assembly::fromArray(Functions::array_bc($data, 'assembly'));
|
||||||
$ProjectConfigurationObject->Build = Functions::array_bc($data, 'build');
|
$ProjectConfigurationObject->Build = Build::fromArray(Functions::array_bc($data, 'build'));
|
||||||
|
|
||||||
return $ProjectConfigurationObject;
|
return $ProjectConfigurationObject;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue