2013-04-01 28 views
22

Symfony2 konsol kütüphanesini kullanarak CLI araçları oluşturmayı deniyorum. Temel bir işim var ve şimdi onu paşa olarak paketlemek istiyorum. Birkaç örnek okudum ama gördüklerim çok basit (3 dosya, isim alanı yok). Benim src/ dizindeBasit bir uygulama için bir PHAR oluşturma

Ben şu var: Ben Uygulamayı çalıştırmak için yürütmek bir console.php var

enter image description here

src/ üstünde. Bağımlılıkları yüklemek için besteci kullandığım için bir vendors/ dir. console.php çok basit:

itibaren
#!/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(); 

Ne (küçük) Ben saplama ve src/ her şey artı vendors/ tüm benim bağımlılıklar olarak console.php dahil etmek gerek bir phar inşa yaklaşık anlamak. phpmaster.com üzerinde örnek kod baktığımızda

manuel file_get_contents kullanarak phar dahil edilecek her dosya, ancak ben bestecinin autoloader kullanabilir ve PSR-0 dizin yapısına tutmak için benim dizin yapısını korumak gerekir.

.Phar oluşturmanın ve dizin yapısını içinde bulundurmanın kolay bir yolu var mı, bu yüzden hala bestecinin otomatik yükleyicisini kullanabilir miyim?

cevap

22

Composer's Compiler (Asıl gönderi sahibi Fabien Potencier, Silex) 'e göz atmanızı öneririm. Bu sınıfta, Composer gibi büyük bir konsol uygulamasının .phar dosyasını nasıl oluşturduğunu görebilirsiniz.


bazı ilginç parçalar:

// line 49 
$phar = new \Phar($pharFile, 0, 'composer.phar'); 
$phar->setSignatureAlgorithm(\Phar::SHA1); 

$phar->startBuffering(); 

Phar#startBuffering phar dosyasının oluşturulmasını başlar. İşte

// Line 54 
$finder = new Finder(); 
$finder->files() 
    ->ignoreVCS(true) 
    ->name('*.php') 
    ->notName('Compiler.php') 
    ->notName('ClassLoader.php') 
    ->in(__DIR__.'/..') 

, Besteci (bu dosya ve otomatik yükleyici hariç) src dizindeki her dosyayı bulmak için Symfony2 Finder Component kullanır.

// Line 63 
foreach ($finder as $file) { 
    $this->addFile($phar, $file); 
} 

Burada, Besteci bulunan her dosyanın üzerine yineler ve bunu Phar arşivine ekler. (line 116 numaralı telefondan Compiler#addFile yöntemini görebilirsiniz).

Bu, bazı zamanlarda tekrarlanır. Ve sonra hat 93 at, Besteci autoloader kullanılır:

$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 bir dere olduğu için, dizin yapısı phar dosyasında tutulur ve Besteci autoloader hala sınıfları yükleyebildiğinden edilir.

Daha sonra, sonunda, taslakları ilave edildi ve tamponlama durdurulur:

$phar->setStub($this->getStub()); 

$phar->stopBuffering(); 

(line 173 de Compiler#getStub şekli).Phar#stopBuffering yöntemi, pharın oluşturulmasını durdurur ve phar dosyasına kaydeder.

Bu öyküyü tamamlamak için, Composer bu komutu çalıştıran çok basit bir CLI compile file oluşturur.

+2

Teşekkürler! Neye ihtiyacım var gibi görünüyor :) – Bendihossan

+8

@Bendihossan Ayrıca [Kutu] (https://github.com/kherge/box) - pharlar inşa adanmış küçük bir yardımcı programa bakmanızı tavsiye ederim. Composer derleyicide sahip olduğumuz aynı şeylerin çoğunu ve daha sonra bazılarını destekliyor. – Seldaek