我正在尝试使用Symfony2控制台库构建CLI工具。我有一些基本的工作原理,现在我想将其包装为药。我已经阅读了一些示例,但是我看到的示例非常简单(3个文件,没有 namespace 等)。

在我的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 (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 Componentsrc目录中查找每个文件(此文件和自动加载器除外)。

// 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/

10-12 06:08