2013-03-30 54 views
8

如何获取作曲软件包的文件系统路径?获取已安装作曲软件包的文件系统路径

composer.json例如:

{ 

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

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

,并返回其为: "/home/me/public_html/vendor/willdurand/geocoder/src/Geocoder/HttpAdapter"

回答

-1

不知道下面就是这样做的正确的方式,因为作曲家正在改变很快。

如果您运行此命令:

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

它会在这个文件中

vender/composer/autoload_classmap.php 

这种格式为 “类名”=>文件路径创建一个类映射阵列。

所以找到给定类的文件路径很简单。如果你在项目中创建的根文件夹中的脚本,你可以这样做:

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

不知道为什么你需要知道的文件路径。如果你只想自动加载课程,不要打扰。命令'php /path/to/composer.phar dump-autoload -o'将使用composer的自动加载器非常快地自动加载。 –

10

所有这一切都基于你实际上是在谈论,而不是阶级(这是在提到的假设例如,但在问题中不要求)。

如果你有Composer对象,你可以得到供应商目录从Config对象的路径:

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

$vendorPath现在应该包含/home/me/public_html/vendor/

从那里构建其余的路径应该不会太困难,因为您已经拥有包名称。

如果这感觉太片状或者你不想写逻辑,还有另一种解决方案。你可以获取所有包,迭代,直到你找到正确的包抢从中路径:

$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现在应该包含/home/me/public_html/vendor/willdurand/geocoder

+1

完美的解决方案,谢谢!在post-package-install脚本中,我们可以编写'$ event-> getComposer() - > getInstallationManager() - > getInstallPath($ event-> getOperation() - > getPackage())'获得安装路径安装包。 – Alsciende

+0

'$ composer'对象来自哪里?你将如何掌握它? – Jason

+0

@Jason如果你想了解更多的细节,你应该打开一个新的问题,但总之:[脚本](https://getcomposer.org/doc/articles/scripts.md),[插件](https://getcomposer.org /doc/articles/plugins.md)和[installers](https://getcomposer.org/doc/articles/custom-installers.md)在调用之前/之后传递一个Composer对象。 – Potherca

1

尝试ReflectionClass的getFileName :: - 获取文件的文件名中该类已被定义。 http://www.php.net/manual/en/reflectionclass.getfilename.php

例子:

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

或者你可以使用这个:

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

第一种方法尝试加载类,并返回加载的类路径。第二种方法返回从作曲家数据库没有类自动加载的路径。

0

这里是我的解决方案,使供应商的路径,而不使用$作曲家对象:

<?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.'); 
    } 
} 
相关问题