mirror of
https://github.com/crazywhalecc/static-php-cli.git
synced 2026-07-13 20:05:35 +08:00
Compare commits
2 Commits
2.0-rc3
...
725e6b25dc
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
725e6b25dc | ||
|
|
ea322c0d3b |
@@ -208,7 +208,10 @@
|
|||||||
},
|
},
|
||||||
"mysqlnd": {
|
"mysqlnd": {
|
||||||
"type": "builtin",
|
"type": "builtin",
|
||||||
"arg-type-windows": "with"
|
"arg-type-windows": "with",
|
||||||
|
"lib-depends": [
|
||||||
|
"zlib"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"opcache": {
|
"opcache": {
|
||||||
"type": "builtin"
|
"type": "builtin"
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ namespace SPC;
|
|||||||
use SPC\command\DeployCommand;
|
use SPC\command\DeployCommand;
|
||||||
use SPC\store\FileSystem;
|
use SPC\store\FileSystem;
|
||||||
use Symfony\Component\Console\Application;
|
use Symfony\Component\Console\Application;
|
||||||
use Symfony\Component\Console\Command\Command;
|
|
||||||
use Symfony\Component\Console\Command\HelpCommand;
|
use Symfony\Component\Console\Command\HelpCommand;
|
||||||
use Symfony\Component\Console\Command\ListCommand;
|
use Symfony\Component\Console\Command\ListCommand;
|
||||||
|
|
||||||
@@ -16,7 +15,7 @@ use Symfony\Component\Console\Command\ListCommand;
|
|||||||
*/
|
*/
|
||||||
class ConsoleApplication extends Application
|
class ConsoleApplication extends Application
|
||||||
{
|
{
|
||||||
public const VERSION = '2.0-rc3';
|
public const VERSION = '2.0-rc4';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws \ReflectionException
|
* @throws \ReflectionException
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ use SPC\exception\RuntimeException;
|
|||||||
use SPC\exception\WrongUsageException;
|
use SPC\exception\WrongUsageException;
|
||||||
use SPC\store\Config;
|
use SPC\store\Config;
|
||||||
use SPC\store\FileSystem;
|
use SPC\store\FileSystem;
|
||||||
|
use SPC\store\SourceExtractor;
|
||||||
use SPC\util\CustomExt;
|
use SPC\util\CustomExt;
|
||||||
use SPC\util\DependencyUtil;
|
use SPC\util\DependencyUtil;
|
||||||
|
|
||||||
@@ -87,7 +88,7 @@ abstract class BuilderBase
|
|||||||
$lib->calcDependency();
|
$lib->calcDependency();
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->initSource(libs: $libraries);
|
SourceExtractor::initSource(libs: $libraries);
|
||||||
|
|
||||||
// 构建库
|
// 构建库
|
||||||
foreach ($this->libs as $lib) {
|
foreach ($this->libs as $lib) {
|
||||||
@@ -188,11 +189,11 @@ abstract class BuilderBase
|
|||||||
public function proveExts(array $extensions): void
|
public function proveExts(array $extensions): void
|
||||||
{
|
{
|
||||||
CustomExt::loadCustomExt();
|
CustomExt::loadCustomExt();
|
||||||
$this->initSource(sources: ['php-src']);
|
SourceExtractor::initSource(sources: ['php-src']);
|
||||||
if ($this->getPHPVersionID() >= 80000) {
|
if ($this->getPHPVersionID() >= 80000) {
|
||||||
$this->initSource(sources: ['micro']);
|
SourceExtractor::initSource(sources: ['micro']);
|
||||||
}
|
}
|
||||||
$this->initSource(exts: $extensions);
|
SourceExtractor::initSource(exts: $extensions);
|
||||||
foreach ($extensions as $extension) {
|
foreach ($extensions as $extension) {
|
||||||
$class = CustomExt::getExtClass($extension);
|
$class = CustomExt::getExtClass($extension);
|
||||||
$ext = new $class($extension, $this);
|
$ext = new $class($extension, $this);
|
||||||
@@ -221,6 +222,7 @@ abstract class BuilderBase
|
|||||||
*
|
*
|
||||||
* @throws RuntimeException
|
* @throws RuntimeException
|
||||||
* @throws FileSystemException
|
* @throws FileSystemException
|
||||||
|
* @throws WrongUsageException
|
||||||
*/
|
*/
|
||||||
public function makeExtensionArgs(): string
|
public function makeExtensionArgs(): string
|
||||||
{
|
{
|
||||||
@@ -292,52 +294,4 @@ abstract class BuilderBase
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function initSource(?array $sources = null, ?array $libs = null, ?array $exts = null): void
|
|
||||||
{
|
|
||||||
if (!file_exists(DOWNLOAD_PATH . '/.lock.json')) {
|
|
||||||
throw new WrongUsageException('Download lock file "downloads/.lock.json" not found, maybe you need to download sources first ?');
|
|
||||||
}
|
|
||||||
$lock = json_decode(FileSystem::readFile(DOWNLOAD_PATH . '/.lock.json'), true);
|
|
||||||
|
|
||||||
$sources_extracted = [];
|
|
||||||
// source check exist
|
|
||||||
if (is_array($sources)) {
|
|
||||||
foreach ($sources as $source) {
|
|
||||||
$sources_extracted[$source] = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// lib check source exist
|
|
||||||
if (is_array($libs)) {
|
|
||||||
foreach ($libs as $lib) {
|
|
||||||
// get source name for lib
|
|
||||||
$source = Config::getLib($lib, 'source');
|
|
||||||
$sources_extracted[$source] = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// ext check source exist
|
|
||||||
if (is_array($exts)) {
|
|
||||||
foreach ($exts as $ext) {
|
|
||||||
// get source name for ext
|
|
||||||
if (Config::getExt($ext, 'type') !== 'external') {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
$source = Config::getExt($ext, 'source');
|
|
||||||
$sources_extracted[$source] = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// start check
|
|
||||||
foreach ($sources_extracted as $source => $item) {
|
|
||||||
if (!isset($lock[$source])) {
|
|
||||||
throw new WrongUsageException('Source [' . $source . '] not downloaded, you should download it first !');
|
|
||||||
}
|
|
||||||
|
|
||||||
// check source dir exist
|
|
||||||
$check = $lock[$source]['move_path'] === null ? SOURCE_PATH . '/' . $source : SOURCE_PATH . '/' . $lock[$source]['move_path'];
|
|
||||||
if (!is_dir($check)) {
|
|
||||||
FileSystem::extractSource($source, DOWNLOAD_PATH . '/' . ($lock[$source]['filename'] ?? $lock[$source]['dirname']), $lock[$source]['move_path']);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ class DownloadCommand extends BaseCommand
|
|||||||
$this->addOption('with-php', null, InputOption::VALUE_REQUIRED, 'version in major.minor format like 8.1', '8.1');
|
$this->addOption('with-php', null, InputOption::VALUE_REQUIRED, 'version in major.minor format like 8.1', '8.1');
|
||||||
$this->addOption('clean', null, null, 'Clean old download cache and source before fetch');
|
$this->addOption('clean', null, null, 'Clean old download cache and source before fetch');
|
||||||
$this->addOption('all', 'A', null, 'Fetch all sources that static-php-cli needed');
|
$this->addOption('all', 'A', null, 'Fetch all sources that static-php-cli needed');
|
||||||
|
$this->addOption('custom-url', 'U', InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED, 'Specify custom source download url, e.g "php-src:https://downloads.php.net/~eric/php-8.3.0beta1.tar.gz"');
|
||||||
$this->addOption('from-zip', 'Z', InputOption::VALUE_REQUIRED, 'Fetch from zip archive');
|
$this->addOption('from-zip', 'Z', InputOption::VALUE_REQUIRED, 'Fetch from zip archive');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -139,14 +140,37 @@ class DownloadCommand extends BaseCommand
|
|||||||
}
|
}
|
||||||
$chosen_sources = $sources;
|
$chosen_sources = $sources;
|
||||||
|
|
||||||
|
// Process -U options
|
||||||
|
$custom_urls = [];
|
||||||
|
foreach ($this->input->getOption('custom-url') as $value) {
|
||||||
|
[$source_name, $url] = explode(':', $value, 2);
|
||||||
|
$custom_urls[$source_name] = $url;
|
||||||
|
}
|
||||||
|
|
||||||
// Download them
|
// Download them
|
||||||
f_mkdir(DOWNLOAD_PATH);
|
f_mkdir(DOWNLOAD_PATH);
|
||||||
$cnt = count($chosen_sources);
|
$cnt = count($chosen_sources);
|
||||||
$ni = 0;
|
$ni = 0;
|
||||||
foreach ($chosen_sources as $source) {
|
foreach ($chosen_sources as $source) {
|
||||||
++$ni;
|
++$ni;
|
||||||
logger()->info("Fetching source {$source} [{$ni}/{$cnt}]");
|
if (isset($custom_urls[$source])) {
|
||||||
Downloader::downloadSource($source, Config::getSource($source));
|
$config = Config::getSource($source);
|
||||||
|
$new_config = [
|
||||||
|
'type' => 'url',
|
||||||
|
'url' => $custom_urls[$source],
|
||||||
|
];
|
||||||
|
if (isset($config['path'])) {
|
||||||
|
$new_config['path'] = $config['path'];
|
||||||
|
}
|
||||||
|
if (isset($config['filename'])) {
|
||||||
|
$new_config['filename'] = $config['filename'];
|
||||||
|
}
|
||||||
|
logger()->info("Fetching source {$source} from custom url [{$ni}/{$cnt}]");
|
||||||
|
Downloader::downloadSource($source, $new_config, true);
|
||||||
|
} else {
|
||||||
|
logger()->info("Fetching source {$source} [{$ni}/{$cnt}]");
|
||||||
|
Downloader::downloadSource($source, Config::getSource($source));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// 打印拉取资源用时
|
// 打印拉取资源用时
|
||||||
$time = round(microtime(true) - START_TIME, 3);
|
$time = round(microtime(true) - START_TIME, 3);
|
||||||
|
|||||||
35
src/SPC/command/ExtractCommand.php
Normal file
35
src/SPC/command/ExtractCommand.php
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace SPC\command;
|
||||||
|
|
||||||
|
use SPC\builder\traits\UnixSystemUtilTrait;
|
||||||
|
use SPC\store\SourceExtractor;
|
||||||
|
use Symfony\Component\Console\Attribute\AsCommand;
|
||||||
|
use Symfony\Component\Console\Input\InputArgument;
|
||||||
|
|
||||||
|
#[AsCommand('extract', 'Extract required sources')]
|
||||||
|
class ExtractCommand extends BaseCommand
|
||||||
|
{
|
||||||
|
use UnixSystemUtilTrait;
|
||||||
|
|
||||||
|
protected string $php_major_ver;
|
||||||
|
|
||||||
|
public function configure()
|
||||||
|
{
|
||||||
|
$this->addArgument('sources', InputArgument::REQUIRED, 'The sources will be compiled, comma separated');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function handle(): int
|
||||||
|
{
|
||||||
|
$sources = array_map('trim', array_filter(explode(',', $this->getArgument('sources'))));
|
||||||
|
if (empty($sources)) {
|
||||||
|
$this->output->writeln('<erorr>sources cannot be empty, at least contain one !</erorr>');
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
SourceExtractor::initSource(sources: $sources);
|
||||||
|
logger()->info('Extract done !');
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -22,7 +22,7 @@ class PhpVerCommand extends BaseCommand
|
|||||||
{
|
{
|
||||||
// Find php from source/php-src
|
// Find php from source/php-src
|
||||||
$file = SOURCE_PATH . '/php-src/main/php_version.h';
|
$file = SOURCE_PATH . '/php-src/main/php_version.h';
|
||||||
$result = preg_match('/#define PHP_VERSION "(\d+\.\d+\.\d+)"/', file_get_contents($file), $match);
|
$result = preg_match('/#define PHP_VERSION "([^"]+)"/', file_get_contents($file), $match);
|
||||||
if ($result === false) {
|
if ($result === false) {
|
||||||
$this->output->writeln('<error>PHP source not found, maybe you need to extract first ?</error>');
|
$this->output->writeln('<error>PHP source not found, maybe you need to extract first ?</error>');
|
||||||
return 1;
|
return 1;
|
||||||
|
|||||||
@@ -265,7 +265,7 @@ class Downloader
|
|||||||
* @throws FileSystemException
|
* @throws FileSystemException
|
||||||
* @throws RuntimeException
|
* @throws RuntimeException
|
||||||
*/
|
*/
|
||||||
public static function downloadSource(string $name, ?array $source = null): void
|
public static function downloadSource(string $name, ?array $source = null, bool $force = false): void
|
||||||
{
|
{
|
||||||
if ($source === null) {
|
if ($source === null) {
|
||||||
$source = Config::getSource($name);
|
$source = Config::getSource($name);
|
||||||
@@ -278,7 +278,7 @@ class Downloader
|
|||||||
$lock = json_decode(FileSystem::readFile(DOWNLOAD_PATH . '/.lock.json'), true) ?? [];
|
$lock = json_decode(FileSystem::readFile(DOWNLOAD_PATH . '/.lock.json'), true) ?? [];
|
||||||
}
|
}
|
||||||
// If lock file exists, skip downloading
|
// If lock file exists, skip downloading
|
||||||
if (isset($lock[$name])) {
|
if (isset($lock[$name]) && !$force) {
|
||||||
if ($lock[$name]['source_type'] === 'archive' && file_exists(DOWNLOAD_PATH . '/' . $lock[$name]['filename'])) {
|
if ($lock[$name]['source_type'] === 'archive' && file_exists(DOWNLOAD_PATH . '/' . $lock[$name]['filename'])) {
|
||||||
logger()->notice("source [{$name}] already downloaded: " . $lock[$name]['filename']);
|
logger()->notice("source [{$name}] already downloaded: " . $lock[$name]['filename']);
|
||||||
return;
|
return;
|
||||||
|
|||||||
61
src/SPC/store/SourceExtractor.php
Normal file
61
src/SPC/store/SourceExtractor.php
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace SPC\store;
|
||||||
|
|
||||||
|
use SPC\exception\WrongUsageException;
|
||||||
|
|
||||||
|
class SourceExtractor
|
||||||
|
{
|
||||||
|
public static function initSource(?array $sources = null, ?array $libs = null, ?array $exts = null): void
|
||||||
|
{
|
||||||
|
if (!file_exists(DOWNLOAD_PATH . '/.lock.json')) {
|
||||||
|
throw new WrongUsageException('Download lock file "downloads/.lock.json" not found, maybe you need to download sources first ?');
|
||||||
|
}
|
||||||
|
$lock = json_decode(FileSystem::readFile(DOWNLOAD_PATH . '/.lock.json'), true);
|
||||||
|
|
||||||
|
$sources_extracted = [];
|
||||||
|
// source check exist
|
||||||
|
if (is_array($sources)) {
|
||||||
|
foreach ($sources as $source) {
|
||||||
|
$sources_extracted[$source] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// lib check source exist
|
||||||
|
if (is_array($libs)) {
|
||||||
|
foreach ($libs as $lib) {
|
||||||
|
// get source name for lib
|
||||||
|
$source = Config::getLib($lib, 'source');
|
||||||
|
$sources_extracted[$source] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ext check source exist
|
||||||
|
if (is_array($exts)) {
|
||||||
|
foreach ($exts as $ext) {
|
||||||
|
// get source name for ext
|
||||||
|
if (Config::getExt($ext, 'type') !== 'external') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$source = Config::getExt($ext, 'source');
|
||||||
|
$sources_extracted[$source] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// start check
|
||||||
|
foreach ($sources_extracted as $source => $item) {
|
||||||
|
if (Config::getSource($source) === null) {
|
||||||
|
throw new WrongUsageException("Source [{$source}] not exists, please check name and correct it !");
|
||||||
|
}
|
||||||
|
if (!isset($lock[$source])) {
|
||||||
|
throw new WrongUsageException('Source [' . $source . '] not downloaded or not locked, you should download it first !');
|
||||||
|
}
|
||||||
|
|
||||||
|
// check source dir exist
|
||||||
|
$check = $lock[$source]['move_path'] === null ? SOURCE_PATH . '/' . $source : SOURCE_PATH . '/' . $lock[$source]['move_path'];
|
||||||
|
if (!is_dir($check)) {
|
||||||
|
FileSystem::extractSource($source, DOWNLOAD_PATH . '/' . ($lock[$source]['filename'] ?? $lock[$source]['dirname']), $lock[$source]['move_path']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user