11

如何获取作曲家包的文件系统路径?

composer.json 示例:

{

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

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

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

4

4 回答 4

12

所有这一切都基于您实际上在谈论而不是类(在示例中提到但在问题中未要求)的假设。

如果你有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

于 2015-01-11T20:04:51.317 回答
4

尝试 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");

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

于 2017-04-04T14:43:44.693 回答
2

这是我在不使用 $composer 对象的情况下获取供应商路径的解决方案:

<?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.');
    }
}
于 2017-04-21T13:04:37.660 回答
-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;
于 2013-03-30T10:00:18.210 回答