获取已安装的composer包的文件系统路径

foo*_*foo 8 php composer-php

如何获取composer包的文件系统路径?

composer.json示例:

{

    "require" : {
        "codeception/codeception" : "@stable",
        "willdurand/geocoder": "*"
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Pot*_*rca 10

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

如果您有Composer对象,则可以从对象获取供应商目录的路径Config:

    $vendorPath = $composer->getConfig()->get('vendor-dir');
Run Code Online (Sandbox Code Playgroud)

$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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

$installPath 现在应该包含 /home/me/public_html/vendor/willdurand/geocoder


Chu*_* Ma -1

不确定以下是否是正确的方法,因为作曲家变化如此之快。

如果您运行此命令:

php /path/to/composer.phar dump-autoload -o
Run Code Online (Sandbox Code Playgroud)

它将在此文件中创建一个类映射数组

vender/composer/autoload_classmap.php
Run Code Online (Sandbox Code Playgroud)

格式为“classname”=> filepath。

因此查找给定类的文件路径很简单。如果您在项目的根文件夹中创建脚本,则可以执行以下操作:

$classmap = require('vender/composer/autoload_classmap.php');
$filepath = $classmap[$classname]?: null;
Run Code Online (Sandbox Code Playgroud)