mirror of
https://github.com/crazywhalecc/static-php-cli.git
synced 2026-03-18 12:54:52 +08:00
11 lines
14 KiB
JavaScript
11 lines
14 KiB
JavaScript
|
|
import{_ as o,c as d,o as c,af as a}from"./chunks/framework.PeLcR_tw.js";const m=JSON.parse('{"title":"项目结构简介","description":"","frontmatter":{},"headers":[],"relativePath":"zh/develop/structure.md","filePath":"zh/develop/structure.md"}'),t={name:"zh/develop/structure.md"};function p(r,e,i,s,l,n){return c(),d("div",null,e[0]||(e[0]=[a(`<h1 id="项目结构简介" tabindex="-1">项目结构简介 <a class="header-anchor" href="#项目结构简介" aria-label="Permalink to “项目结构简介”"></a></h1><p>static-php-cli 主要包含三种逻辑组件:资源、依赖库、扩展。这三种组件四个配置文件:<code>source.json</code>、<code>lib.json</code>、<code>ext.json</code>、<code>pkg.json</code>。</p><p>一个完整的构建静态 PHP 流程是:</p><ol><li>使用资源下载模块 <code>Downloader</code> 下载指定或所有资源,这些资源包含 PHP 源码、依赖库源码、扩展源码。</li><li>使用资源解压模块 <code>SourceExtractor</code> 解压下载的资源到编译目录。</li><li>使用依赖工具计算出当前加入的扩展的依赖扩展、依赖库,然后对每个需要编译的依赖库进行编译,按照依赖顺序。</li><li>使用对应操作系统下的 <code>Builder</code> 构建每个依赖库后,将其安装到 <code>buildroot</code> 目录。</li><li>如果包含外部扩展(源码没有包含在 PHP 内的扩展),将外部扩展拷贝到 <code>source/php-src/ext/</code> 目录。</li><li>使用 <code>Builder</code> 构建 PHP 源码,将其安装到 <code>buildroot</code> 目录。</li></ol><p>项目主要分为几个文件夹:</p><ul><li><code>bin/</code>: 用于存放程序入口文件,包含 <code>bin/spc</code>、<code>bin/spc-alpine-docker</code>、<code>bin/setup-runtime</code>。</li><li><code>config/</code>: 包含了所有项目支持的扩展、依赖库以及这些资源下载的地址、下载方式等,:<code>lib.json</code>、<code>ext.json</code>、<code>source.json</code>、<code>pkg.json</code>、<code>pre-built.json</code>。</li><li><code>src/SPC/</code>: 项目的核心代码,包含了整个框架以及编译各种扩展和库的命令。</li><li><code>src/globals/</code>: 项目的全局方法和常量、运行时需要的测试文件(例如:扩展的可用性检查代码)。</li><li><code>vendor/</code>: Composer 依赖的目录,你无需对它做出任何修改。</li></ul><p>其中运行原理就是启动一个 <code>symfony/console</code> 的 <code>ConsoleApplication</code>,然后解析用户在终端输入的命令。</p><h2 id="基本命令行结构" tabindex="-1">基本命令行结构 <a class="header-anchor" href="#基本命令行结构" aria-label="Permalink to “基本命令行结构”"></a></h2><p><code>bin/spc</code> 是一个 PHP 代码入口文件,包含了 Unix 通用的 <code>#!/usr/bin/env php</code> 用来让系统自动以系统安装好的 PHP 解释器执行。 在项目执行了 <code>new ConsoleApplication()</code> 后,框架会自动使用反射的方式,解析 <code>src/SPC/command</code> 目录下的所有类,并将其注册成为命令。</p><p>项目并没有直接使用 Symfony 推荐的 Command 注册方式和命令执行方式,这里做出了一点小变动:</p><ol><li>每个命令都使用 <code>#[AsCommand()]</code> Attribute 来注册名称和简介。</li><li>将 <code>execute()</code> 抽象化,让所有命令基于 <code>BaseCommand</code>(它基于 <code>Symfony\\Component\\Console\\Command\\Command</code>),每个命令本身的执行代码写到了 <code>handle()</code> 方法中。</li><li><code>BaseCommand</code> 添加了变量 <code>$no_motd</code>,用于是否在该命令执行时显示 Figlet 欢迎词。</li><li><code>BaseCommand</code> 将 <code>InputInterface</code> 和 <code>OutputInterface</code> 保存为成员变量,你可以在命令的类内使用 <code>$this->input</code> 和 <code>$this->output</code>。</li></ol><h2 id="基本源码结构" tabindex="-1">基本源码结构 <a class="header-anchor"
|
|||
|
|
<span class="line"><span>src/App/MyCommand.app</span></span>
|
|||
|
|
<span class="line"><span>vendor/*</span></span>
|
|||
|
|
<span class="line"><span>bin/entry.php</span></span></code></pre></div><p>我们假设从 <code>src/App/MyCommand.php</code> 中获取以上常量:</p><table tabindex="0"><thead><tr><th>Constant</th><th>Value</th></tr></thead><tbody><tr><td><code>WORKING_DIR</code></td><td><code>/home/example/static-php-cli</code></td></tr><tr><td><code>SOURCE_ROOT_DIR</code></td><td><code>/home/example/static-php-cli</code></td></tr><tr><td><code>FRAMEWORK_ROOT_DIR</code></td><td><code>/home/example/static-php-cli</code></td></tr><tr><td><code>__DIR__</code></td><td><code>/home/example/static-php-cli/src/App</code></td></tr><tr><td><code>__FILE__</code></td><td><code>/home/example/static-php-cli/src/App/MyCommand.php</code></td></tr></tbody></table><p>这种情况下,<code>WORKING_DIR</code>、<code>SOURCE_ROOT_DIR</code>、<code>FRAMEWORK_ROOT_DIR</code> 的值是完全一致的:<code>/home/example/static-php-cli</code>。 框架的源码和应用的源码都在当前路径下。</p><h3 id="vendor-库模式-vendor" tabindex="-1">Vendor 库模式(vendor) <a class="header-anchor" href="#vendor-库模式-vendor" aria-label="Permalink to “Vendor 库模式(vendor)”"></a></h3><p>Vendor 库模式一般是指你的项目为框架类或者被其他应用作为 composer 依赖项安装到项目中,存放位置在 <code>vendor/author/XXX</code> 目录。</p><p>假设你的项目是 <code>crazywhalecc/static-php-cli</code>,你或其他人在另一个项目使用 <code>composer require</code> 安装了这个项目。</p><p>我们假设 static-php-cli 中包含同 <code>Git 模式</code> 的除 <code>vendor</code> 目录外的所有文件,并从 <code>src/App/MyCommand</code> 中获取常量值, 目录常量应该是:</p><table tabindex="0"><thead><tr><th>Constant</th><th>Value</th></tr></thead><tbody><tr><td><code>WORKING_DIR</code></td><td><code>/home/example/another-app</code></td></tr><tr><td><code>SOURCE_ROOT_DIR</code></td><td><code>/home/example/another-app</code></td></tr><tr><td><code>FRAMEWORK_ROOT_DIR</code></td><td><code>/home/example/another-app/vendor/crazywhalecc/static-php-cli</code></td></tr><tr><td><code>__DIR__</code></td><td><code>/home/example/another-app/vendor/crazywhalecc/static-php-cli/src/App</code></td></tr><tr><td><code>__FILE__</code></td><td><code>/home/example/another-app/vendor/crazywhalecc/static-php-cli/src/App/MyCommand.php</code></td></tr></tbody></table><p>这里的 <code>SOURCE_ROOT_DIR</code> 就指的是使用 <code>static-php-cli</code> 的项目的根目录。</p><h3 id="git-项目-phar-模式-source-phar" tabindex="-1">Git 项目 Phar 模式(source-phar) <a class="header-anchor" href="#git-项目-phar-模式-source-phar" aria-label="Permalink to “Git 项目 Phar 模式(source-phar)”"></a></h3><p>Git 项目 Phar 模式指的是将 Git 项目模式的项目目录打包为一个 <code>phar</code> 文件的模式。我们假设 <code>/home/example/static-php-cli</code> 将打包为一个 Phar 文件,目录有以下文件:</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span>composer.json</span></span>
|
|||
|
|
<span class="line"><span>src/App/MyCommand.app</span></span>
|
|||
|
|
<span class="line"><span>vendor/*</span></span>
|
|||
|
|
<span class="line"><span>bin/entry.php</span></span></code></pre></div><p>打包为 <code>app.phar</code> 并存放到 <code>/home/example/static-php-cli</code> 目录下时,此时执行 <code>app.phar</code>,假设执行了 <code>src/App/MyCommand</code> 代码,常量在该文件内获取:</p><table tabindex="0"><thead><tr><th>Constant</th><th>Value</th></tr></thead><tbody><tr><td><code>WORKING_DIR</code></td><td><code>/home/example/static-php-cli</code></td></tr><tr><td><code>SOURCE_ROOT_DIR</code></td><td><code>phar:///home/example/static-php-cli/app.phar/</code></td></tr><tr><td><code>FRAMEWORK_ROOT_DIR</code></td><td><code>phar:///home/example/static-php-cli/app.phar/</code></td></tr><tr><td><code>__DIR__</code></td><td><code>phar:///home/example/static-php-cli/app.phar/src/App</code></td></tr><tr><td><code>__FILE__</code></td><td><code>phar:///home/example/static-php-cli/app.phar/src/App/MyCommand.php</code></td></tr></tbody></table><p>因为在 phar 内读取自身 phar 的文件需要 <code>phar://</code> 协议进行,所以项目根目录和框架目录将会和 <code>WORKING_DIR</code> 不同。</p><h3 id="vendor-库-phar-模式-vendor-phar" tabindex="-1">Vendor 库 Phar 模式(vendor-phar) <a class="header-anchor" href="#vendor-库-phar-模式-vendor-phar" aria-label="Permalink to “Vendor 库 Phar 模式(vendor-phar)”"></a></h3><p>Vendor 库 Phar 模式指的是你的项目作为框架安装在其他项目内,存储于 <code>vendor</code> 目录下。</p><p>我们假设你的项目目录结构如下:</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span>composer.json # 当前项目的 Composer 配置文件</span></span>
|
|||
|
|
<span class="line"><span>box.json # 打包 Phar 的配置文件</span></span>
|
|||
|
|
<span class="line"><span>another-app.php # 另一个项目的入口文件</span></span>
|
|||
|
|
<span class="line"><span>vendor/crazywhalecc/static-php-cli/* # 你的项目被作为依赖库</span></span></code></pre></div><p>将该目录 <code>/home/example/another-app/</code> 下的这些文件打包为 <code>app.phar</code> 时,对于你的项目而言,下面常量的值应为:</p><table tabindex="0"><thead><tr><th>Constant</th><th>Value</th></tr></thead><tbody><tr><td><code>WORKING_DIR</code></td><td><code>/home/example/another-app</code></td></tr><tr><td><code>SOURCE_ROOT_DIR</code></td><td><code>phar:///home/example/another-app/app.phar/</code></td></tr><tr><td><code>FRAMEWORK_ROOT_DIR</code></td><td><code>phar:///home/example/another-app/app.phar/vendor/crazywhalecc/static-php-cli</code></td></tr><tr><td><code>__DIR__</code></td><td><code>phar:///home/example/another-app/app.phar/vendor/crazywhalecc/static-php-cli/src/App</code></td></tr><tr><td><code>__FILE__</code></td><td><code>phar:///home/example/another-app/app.phar/vendor/crazywhalecc/static-php-cli/src/App/MyCommand.php</code></td></tr></tbody></table>`,49)]))}const _=o(t,[["render",p]]);export{m as __pageData,_ as default};
|