如何获取composer包的文件系统路径?
composer.json示例:
{
"require" : {
"codeception/codeception" : "@stable",
"willdurand/geocoder": "*"
}
}
例如:
$composer->getPath("\Geocoder\HttpAdapter\HttpAdapterInterface");
并将其返回为:
"/home/me/public_html/vendor/willdurand/geocoder/src/Geocoder/HttpAdapter"
答案 0 :(得分: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 :(得分:1)
Try 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");
第一种方法尝试加载类并返回加载的类路径。第二个方法从composer数据库返回路径,没有类自动加载。
答案 2 :(得分:1)
以下是我在不使用$ 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.');
}
}
答案 3 :(得分:-1)
不确定以下是否是正确的方法因为作曲家变化如此之快。
如果您运行此命令:
php /path/to/composer.phar dump-autoload -o
它将在此文件中创建一个类图数组
vender/composer/autoload_classmap.php
使用此格式“classname”=&gt;文件路径。
所以找到给定类的文件路径很简单。如果在项目的根文件夹中创建脚本,则可以执行以下操作:
$classmap = require('vender/composer/autoload_classmap.php');
$filepath = $classmap[$classname]?: null;