2013-03-30 18 views
8

Jak uzyskać ścieżkę do systemu plików pakietu kompozytora?Pobierz ścieżkę do systemu plików zainstalowanego pakietu kompilatora

composer.json przykład:

{ 

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

przykład: $composer->getPath("\Geocoder\HttpAdapter\HttpAdapterInterface");

i zwraca go jako: "/home/me/public_html/vendor/willdurand/geocoder/src/Geocoder/HttpAdapter"

Odpowiedz

-1

Nie wiem, czy po to właściwa droga do tego, ponieważ kompozytor zmienia tak szybko.

Po uruchomieniu tego polecenia:

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

stworzy classmap tablicę w tym pliku

vender/composer/autoload_classmap.php 

w tym formacie "classname" => filePath.

Aby znaleźć ścieżkę do pliku danej klasy jest prosty. Jeśli utworzyć skrypt w folderze głównym twojego projektu, można to zrobić:

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

Nie wiem, dlaczego trzeba znać filepath. Jeśli chcesz po prostu autoloadować, nie przejmuj się. Polecenie 'php /path/to/composer.phar dump-autoload -o' spowoduje automatyczne ładowanie automatyczne za pomocą autoloadera kompozytora. –

10

Wszystko to opiera się na założeniu, że w rzeczywistości mówimy o pakiety a nie klas (które są wymienione w przykład, ale nie pytano o to w pytaniu).

Jeśli masz obiekt Composer można uzyskać ścieżkę katalogu dostawców z obiektu Config:

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

$vendorPath powinien zawierać /home/me/public_html/vendor/.

Nie powinno być zbyt trudno zbudować resztę ścieżki, ponieważ już masz nazwę pakietu.

Jeśli to wydaje się zbyt kruche lub nie chcesz pisać logiki, istnieje inne rozwiązanie. Można pobrać wszystkie pakiety, iteracji, aż znajdziesz odpowiedni pakiet i chwycić ścieżkę od niego:

$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 powinien zawierać /home/me/public_html/vendor/willdurand/geocoder

+1

Idealne rozwiązanie, dziękuję! W skrypcie po instalacji pakietu możemy napisać '$ event-> getComposer() -> getInstallationManager() -> getInstallPath ($ event-> getOperation() -> getPackage())', aby uzyskać ścieżkę instalacji zainstalowany pakiet. – Alsciende

+0

Ciekawy, skąd pochodzi obiekt '$ composer'. Jak byś to zdobył? – Jason

+0

@Jason Aby uzyskać więcej informacji, należy otworzyć nowe pytania, ale w skrócie: [skrypty] (https://getcomposer.org/doc/articles/scripts.md), [plugins] (https://getcomposer.org /doc/articles/plugins.md) i [instalatory] (https://getcomposer.org/doc/articles/custom-installers.md) są przekazywane obiektowi Composer przed/po wywołaniu. – Potherca

1

Spróbuj ReflectionClass :: getfilename - Pobiera nazwę pliku, w którym klasa została zdefiniowana. http://www.php.net/manual/en/reflectionclass.getfilename.php

Przykład:

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

Albo można użyć to:

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

Pierwsza metoda spróbować załadować klasę i powrócić załadowaną ścieżkę klasy. Druga ścieżka powrotu metody z bazy danych programu Composer bez automatycznego ładowania klas.

0

Oto moje rozwiązanie, aby uzyskać ścieżkę dostawcy bez użycia kompozytor obiekt $:

<?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.'); 
    } 
} 
Powiązane problemy