我正在尝试使用 Symfony2 控制台库构建 CLI 工具。我有一些基本的工作,现在我想把它打包成 phar。我读过几个示例,但我看到的示例非常简单(3 个文件,没有命名空间等)。
在我的 src/
目录中,我有以下内容:
在 src/
上面,我有一个 console.php
,我执行它来运行应用程序。我还有一个 vendors/
目录,因为我正在使用 composer 安装依赖项。 console.php
非常简单:
#!/usr/bin/env php
<?php
set_time_limit(0);
$loader = require 'vendor/autoload.php';
use Symfony\Component\Console\Application;
use Bendihossan\Pinfo\Command\EnvironmentCommand;
use Bendihossan\Pinfo\Command\ExtensionsCommand;
use Bendihossan\Pinfo\Command\RunAllCommand;
$console = new Application();
$console->add(new RunAllCommand());
$console->add(new EnvironmentCommand);
$console->add(new ExtensionsCommand);
$console->run();
根据我对构建 phar 的(少量)了解,我认为我需要将 console.php
作为 stub 和 src/
中的所有其他内容以及我的所有依赖项包括在内在 vendors/
中。
查看 phpmaster.com 上的示例代码他们使用 file_get_contents
手动指定要包含在 phar 中的每个文件,但我需要维护我的目录结构以便使用 Composer 的自动加载器并保持 PSR-0 目录结构。
有没有一种简单的方法来创建 .phar 并在其中维护我的目录结构,以便我仍然可以使用 composer 的自动加载器?
最佳答案
我建议你看看Composer's Compiler
(它最初由 Silex 的 Fabien Potencier 创建)。在该类(class)中,您可以看到像 Composer 这样的大型控制台应用程序如何创建 .phar
文件。
一些有趣的部分:
// line 49
$phar = new \Phar($pharFile, 0, 'composer.phar');
$phar->setSignatureAlgorithm(\Phar::SHA1);
$phar->startBuffering();
Phar#startBuffering
开始创建 phar 文件。
// Line 54
$finder = new Finder();
$finder->files()
->ignoreVCS(true)
->name('*.php')
->notName('Compiler.php')
->notName('ClassLoader.php')
->in(__DIR__.'/..')
在这里,Composer 使用 Symfony2 Finder Component找到 src
目录中的每个文件(除了这个文件和自动加载器)。
// Line 63
foreach ($finder as $file) {
$this->addFile($phar, $file);
}
在这里,Composer 遍历每个找到的文件并将其添加到 Phar 存档中。 (您可以在 line 116 上看到 Compiler#addFile
方法)。
这会重复几次。然后在第 93 行,使用了 Composer 自动加载器:
$this->addFile($phar, new \SplFileInfo(__DIR__.'/../../vendor/autoload.php'));
$this->addFile($phar, new \SplFileInfo(__DIR__.'/../../vendor/composer/autoload_namespaces.php'));
$this->addFile($phar, new \SplFileInfo(__DIR__.'/../../vendor/composer/autoload_classmap.php'));
$this->addFile($phar, new \SplFileInfo(__DIR__.'/../../vendor/composer/autoload_real.php'));
因为 Phar 是一个流,目录结构保存在 phar 文件中,Composer 自动加载器仍然能够加载类。
然后,最后添加 stub 并停止缓冲:
$phar->setStub($this->getStub());
$phar->stopBuffering();
(参见 line 173 处的 Compiler#getStub
方法)。 Phar#stopBuffering
方法停止创建 phar 并将其保存到 phar 文件。
为了使这个故事完整,Composer 创建了一个非常简单的 CLI compile file运行此命令。
关于php - 为简单的应用程序生成 PHAR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15750913/