2012-09-03 18 views
9

için bir paket geliştiriyorum - bir paket geliştiriyorum - myvendor/mylib - muhtemelen Packagist aracılığıyla Composer kullanarak dağıtmayı planlıyorum. Bu paket, diğer şeylerin yanısıra, bin/console.php numaralı bir komut dosyası olan ve mylib paketini içe aktaran myvendor/mymain numaralı projeye sunmak istiyorum.Bağımlılıktaki komut dosyası, Composer autoloader

Ben kutuları bir dizi composer.json bir config ayar ithal etmek mylib pakette belirtebilirsiniz farkındayım:

{ 
    "name": "myvendor/mylib", 
    "config" : { 
     "bin" : ["bin/console.php"] 
    } 
} 

mymain proje besteci/güncelleme yüklemek geldiğinde, o zaman bu mylib/bin/console.php olduğunu Ayrıca mymain/bin/console.php olarak sembolik olarak, ben mymain proje belirtebilirsiniz farkındayım - kendi içinde composer.json-o bağımlılık kutuları sembolik olarak bağlanmış istediği yere:

{ 
    "name": "myvendor/mymain", 
    "config": { 
     "bin-dir": "scripts" 
    } 
} 

Bu durumda, konsol komut dosyası scripts/console.php olarak simgelenir. Bu, iyi çalışıyor - ve her şey yolunda çıktığı kadar güzel, bu arada. Ancak, bin/console.php komut dosyasının kendisi, Composer tarafından oluşturulan vendor/autoloader.php'un içeriklerini içermelidir. bin/console.php betiği, mylib bağımsız olarak geliştirilirken, vendor/autoloader.php'a göre kendi konumunu bilir ve kolayca dahil edebilir. Ama bir kez başka bir projeye bağımlılık olarak alındığında - bu durumda myvendor/mymain - o zaman sadece mymain/vendor/autoloader.php betiği var. Prensip olarak, konsol betiği o autoloader betiğine göre nerede bulunduğunu bilemez.

Composer, konsol betiğine - komut dosyasının doğru vendor/autoloader.php komut dosyasını bulmasını sağlayan bazı ortam değişkenleri sağlıyor mu?

BTW: Composer CLI environment variable farkındayım, bu yüzden ben bir ithal proje gereksinimi yapabilir hayal - mymain - tanımlamak var COMPOSER_VENDOR_DIR (ve ihracat!). Sonra konsol komutum, projenin otomatik yükleyicisini bulmak için bunu kullanabilir.

  1. Biz ayar yalnızca için bu projeyi uygulamak istiyoruz ama bir kabuk var (ve bir ihracat) o kabuk oturumu erişilen tüm projeler için geçerli olacaktır: Ama o potansiyel sorunlu görünüyor. Bir bağımlılık projesine empoze etmek için benim küçük bağımlılığım - myvendor/mylib - küstah gibi görünüyor. Prensipte, bağımlılığın kendisi - myvendor/mylib - neye ihtiyacı olduğunu bulabilmelidir. İthalatçıya onus koymak doğru görünmüyor.

WDYT? Şimdiden teşekkürler. Fikirler hoşgeldin.

cevap

3
(ı yeniden anlatarak ediyorum ve hangi ben biraz genişleyen am IRC freenode #composer üzerinde @igorw görüşmeler çıktı) Bir yaklaşım bin komut console.php arayan __DIR__ başlayarak dosya sistemini kadar yinelemek izin vermektir

autoload.php'un varlığı.

+2

Gerçekten yinelemenize gerek yok, yalnızca iki tane dirsekle karşılaşabilirsiniz çünkü bu, // – Seldaek

+0

@Seldaek: Doğru, nihayet [jsonlint] öğesinden (https: //) örneğinizi anladım. github.com/Seldaek/jsonlint/blob/master/bin/jsonlint) ve bu şekilde uygulandı. Teşekkürler mucho! –

+0

İnsanların hala bununla ilgili sorunlar yaşıyor gibi görünüyor (me!) Burada bir cevap bulundu: http://stackoverflow.com/questions/35271282/how-can-i-provide-a-script-for-php-cli-via -composer-olarak-başına-ve-Bağıl olarak- – VladFr