2013-03-30 6 views
8

Wie kann der Dateisystempfad des Composer-Pakets abgerufen werden?Dateisystempfad des installierten Composer-Pakets abrufen

composer.json Beispiel:

{ 

    "require" : { 
     "codeception/codeception" : "@stable", 
     "willdurand/geocoder": "*" 
    } 
} 

Beispiel: $composer->getPath("\Geocoder\HttpAdapter\HttpAdapterInterface");

und senden Sie es als: "/home/me/public_html/vendor/willdurand/geocoder/src/Geocoder/HttpAdapter"

Antwort

-1

nicht sicher, ob die folgende der richtige Weg dafür ist, weil Komponist verändert so schnell.

Wenn Sie diesen Befehl ausführen:

php /path/to/composer.phar dump-autoload -o 

es wird eine classmap Array in dieser Datei erstellen

vender/composer/autoload_classmap.php 

mit diesem Format "classname" => Dateipfad.

So zu finden, Dateipfad einer bestimmten Klasse ist einfach. Wenn Sie das Skript in Ihrem Projekt Stammordner erstellt haben, können Sie dies tun:

$classmap = require('vender/composer/autoload_classmap.php'); 
$filepath = $classmap[$classname]?: null; 
+0

nicht sicher, warum Sie den Dateipfad wissen müssen. Wenn Sie nur Klassen autoloadieren möchten, stören Sie nicht. Der Befehl 'php /path/to/composer.phar dump-autoload -o' macht das Autoload mit dem Autoloader des Composers sehr schnell. –

10

All dies basiert auf der Annahme, dass Sie tatsächlich sprechen über Pakete und nicht Klassen (die in der genannten Beispiel, aber in der Frage nicht gefragt).

Wenn Sie das Composer Objekt haben, können Sie den Pfad des Lieferanten-Verzeichnis aus dem Config Objekt erhalten:

$vendorPath = $composer->getConfig()->get('vendor-dir'); 

$vendorPath jetzt /home/me/public_html/vendor/ enthalten sollte.

Es sollte nicht zu schwer sein, den Rest des Pfades von dort zu konstruieren, da Sie bereits den Paketnamen haben.

Wenn sich das zu flockig anfühlt oder Sie die Logik nicht schreiben möchten, gibt es eine andere Lösung. Sie könnten alle Pakete holen, durchlaufen, bis Sie das richtige Paket finden und den Weg von der es packen:

$repositoryManager = $composer->getRepositoryManager(); 
    $installationManager = $composer->getInstallationManager(); 
    $localRepository = $repositoryManager->getLocalRepository(); 

    $packages = $localRepository->getPackages(); 
    foreach ($packages as $package) { 
     if ($package->getName() === 'willdurand/geocoder') { 
      $installPath = $installationManager->getInstallPath($package); 
      break; 
     } 
    } 

$installPath jetzt /home/me/public_html/vendor/willdurand/geocoder

+1

Perfekte Lösung, danke! In einem Post-Paketinstallations-Skript können wir '$ event-> getComposer() -> getInstallationManager() -> getInstallPath ($ event-> getOperation() -> getPackage())' schreiben, um den Installationspfad des installiertes Paket – Alsciende

+0

Neugierig, woher das '$ composer' Objekt kommt. Wie würdest du es bekommen? – Jason

+0

@Jason Wenn Sie mehr Details wünschen, sollten Sie eine neue Frage öffnen, aber kurz: [Skripte] (https://getcomposer.org/doc/articles/scripts.md), [plugins] (https://getcomposer.org /doc/articles/plugins.md) und [Installer] (https://getcomposer.org/doc/articles/custom-installers.md) wird ein Composer-Objekt vor/beim Aufruf übergeben. – Potherca

1

Versuchen Reflection :: getFileName enthalten sollte - Ruft den Dateinamen der Datei, in der Die Klasse wurde definiert. http://www.php.net/manual/en/reflectionclass.getfilename.php

Beispiel:

$reflector = new ReflectionClass("\Geocoder\HttpAdapter\HttpAdapterInterface"); 
echo $reflector->getFileName(); 

Oder Sie verwenden:

$loader = require './vendor/autoload.php'; 
echo $loader->findFile("\Geocoder\HttpAdapter\HttpAdapterInterface"); 

Die erste Methode versuchen Klasse zu laden und zurück geladen Klassenpfad. Die zweite Methode gibt den Pfad von der Composer-Datenbank ohne automatische Klassenladefunktion zurück.

0

Hier ist meine Lösung ohne die Verwendung des $ Komponisten Objekt mit dem Verkäufer Weg zu bekommen:

<?php 

namespace MyPackage; 

use Composer\Autoload\ClassLoader; 

class MyClass 
{ 
    private function getVendorPath() 
    { 
     $reflector = new \ReflectionClass(ClassLoader::class); 
     $vendorPath = preg_replace('/^(.*)\/composer\/ClassLoader\.php$/', '$1', $reflector->getFileName()); 
     if($vendorPath && is_dir($vendorPath)) { 
      return $vendorPath . '/'; 
     } 
     throw new \RuntimeException('Unable to detect vendor path.'); 
    } 
} 
Verwandte Themen