如何获取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)