2012-09-03 6 views
9

Ich entwickle ein Paket - myvendor/mylib - das ich mit Composer verteilen möchte, wahrscheinlich über Packagist. Dieses Paket enthält unter anderem ein Kommandozeilen-PHP-Skript bin/console.php, das ich Projekten zur Verfügung stellen möchte - sagen wir myvendor/mymain - die das mylib-Paket importieren.Skript in Abhängigkeit benötigt Pfad zu Composer Autoloader

Ich bin mir bewusst, dass ich in dem mylib Paket eine config Einstellung in composer.json mit einer Reihe von Fächern zu importieren angeben:

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

Wenn das mymain Projekt ist ein Komponist installieren/aktualisieren, dann ist dies mylib/bin/console.php ist Symlink als mymain/bin/console.php Ferner ich bin mir bewusst, dass das mymain Projekt angeben - in seinem eigenen composer.json - wo er will Bins Abhängigkeit symlinked werden:

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

In diesem Fall wird das Konsolenskript dann als scripts/console.php symbolisiert.

Dies funktioniert gut - und ist cool, als alle raus, übrigens. ;-)

Allerdings muss das Skript bin/console.php selbst den Composer-generated vendor/autoloader.php enthalten. Wenn mylib isoliert entwickelt wird, kennt das Skript bin/console.php seinen eigenen Standort relativ zu vendor/autoloader.php, damit er es leicht aufnehmen kann. Aber sobald es als eine Abhängigkeit in ein anderes Projekt importiert wird - myvendor/mymain, in diesem Fall - dann gibt es nur das mymain/vendor/autoloader.php Skript. Im Prinzip kann das Konsolenskript nicht wissen, wo er sich relativ zu diesem Autoloader-Skript befindet.

Bietet Composer eine Umgebungsvariable, auf die das Konsolenskript zugreifen kann, damit das Skript das richtige vendor/autoloader.php Skript finden kann?

BTW: Ich bin mir bewusst, die Composer CLI environment variable, so dass ich denke ich es eine Voraussetzung machen könnte, dass der Import von Projekt - mymain - definiert die var COMPOSER_VENDOR_DIR (und Export!). Dann kann mein Konsolenskript den Autoloader des Projekts finden. Aber das scheint potenziell problematisch, dass:

  1. Wir die Einstellung nur für dieses Projekt anwenden möchten, sondern eine Schale var (und ein Export) würde gelten für alle von dieser Shell-Sitzung zugegriffen Projekte. Scheint vermessen von meiner kleinen Abhängigkeit - myvendor/mylib - das auf ein Importprojekt durchzusetzen.

  2. Im Prinzip sollte die Abhängigkeit selbst - myvendor/mylib - in der Lage sein zu finden, was er braucht. Es scheint nicht richtig, den Importeur zu belasten.

WDYT? Danke im Voraus. Ideen willkommen.

Antwort

3

Ein Ansatz (die mit @igorw im IRC freenode #composer aus Diskussionen kamen, dass ich paraphrasieren bin und auf das ich expandierende etwas) ist das Skript ist console.php das Dateisystem durchläuft bis zu lassen, von __DIR__ begann, sucht die Anwesenheit von autoload.php.

+2

Sie müssen wirklich nicht wiederholen, können Sie da so aussehen zwei dirs bis nur // – Seldaek

+0

@Seldaek passen würde: Richtig, ich endlich verstanden, Ihre Probe aus [jsonlint] (https: // github.com/Seldaek/jsonlint/blob/master/bin/jsonlint) und auf diese Weise implementiert werden. Vielen Dank! –

+0

Scheint Leute haben immer noch Probleme mit diesem (mich!) Found eine Antwort hier: http://stackoverflow.com/questions/35271282/how-can-i-provide-a-script-for-php-clivia -composer-als-standalone-and-as-depend – VladFr

Verwandte Themen