2013-03-30 19 views
8

Come si può ottenere il percorso del file system del pacchetto di composizione?Ottieni il percorso del file del pacchetto di composer installato

esempio composer.json:

{ 

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

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

e restituirlo come: "/home/me/public_html/vendor/willdurand/geocoder/src/Geocoder/HttpAdapter"

risposta

-1

Non sono sicuro se ciò che segue è il modo corretto per questo, perché il compositore sta cambiando così veloce.

Se si esegue questo comando:

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

si creerà una matrice classmap in questo file

vender/composer/autoload_classmap.php 

con questo formato "classname" => percorsofile.

Quindi trovare il percorso di file di una determinata classe è semplice. Se si crea lo script nella cartella principale del progetto, si può fare questo:

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

Non certo perché è necessario conoscere il percorso del file. Se vuoi solo eseguire il caricamento automatico delle lezioni, non preoccuparti. Il comando 'php /path/to/composer.phar dump-autoload -o' renderà molto veloce l'autoload usando il caricatore automatico del compositore. –

10

Tutto questo si basa sul presupposto che in realtà si sta parlando di pacchetti e non classi (che sono menzionati nella esempio ma non è richiesto nella domanda).

Se avete l'oggetto Composer, è possibile ottenere il percorso della cartella vendor dall'oggetto Config:

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

$vendorPath dovrebbe ora contenere /home/me/public_html/vendor/.

Non dovrebbe essere troppo difficile costruire il resto del percorso da lì, come già il nome del pacchetto.

Se ciò sembra troppo instabile o non si desidera scrivere la logica, esiste un'altra soluzione. Si potrebbe prendere tutti i pacchetti, scorrere fino a trovare il giusto pacchetto e afferrare il percorso da esso:

$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 dovrebbe ora contenere /home/me/public_html/vendor/willdurand/geocoder

+1

Soluzione perfetta, grazie! In uno script post-pacchetto-installazione, possiamo scrivere '$ event-> getComposer() -> getInstallationManager() -> getInstallPath ($ event-> getOperation() -> getPackage())' per ottenere il percorso di installazione del pacchetto installato. – Alsciende

+0

Curioso da dove proviene l'oggetto '$ compositore'. Come lo otterresti? – Jason

+0

@Jason Se vuoi maggiori dettagli, devi aprire una nuova domanda, ma in breve: [script] (https://getcomposer.org/doc/articles/scripts.md), [plugins] (https://getcomposer.org) /doc/articles/plugins.md) e [installer] (https://getcomposer.org/doc/articles/custom-installers.md) vengono passati un oggetto Composer prima/quando vengono chiamati. – Potherca

1

Prova ReflectionClass :: GetFileName - Ottiene il nome del file in cui la classe è stata definita. http://www.php.net/manual/en/reflectionclass.getfilename.php

Esempio:

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

Oppure si può usare questo:

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

Il primo metodo cercare di caricare la classe e tornare percorso di classe caricato. Il secondo metodo restituisce il percorso dal database del compositore senza caricamento automatico della classe.

0

Ecco la mia soluzione per ottenere il percorso fornitore senza utilizzare l'oggetto compositore $:

<?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.'); 
    } 
} 
Problemi correlati