如何使用Composer确定项目的根目录

4
我有一个用PHP创建的应用程序(“foo”),它使用composer来获取其依赖项。其中一个依赖项是我们创建的另一个项目(“bar”)。
当通过composer向foo应用程序添加bar时,bar需要访问foo应用程序的MySQL数据库。数据库凭据存储在foo应用程序的config目录中。
我的foo的文件结构看起来像这样:
app/ # foo应用程序的文件 config/ # 访问MySQL的配置信息 vendor/ # 由composer管理的文件,包括我们的bar应用程序 composer.json # 将bar加载到供应商/目录的信息
当我单独开发bar应用程序时,我需要能够将config/目录放置在我的bar开发应用程序的根目录下,并且bar需要能够访问它。如果bar是另一个composer项目的一部分(如本例中的foo),则需要告诉bar去foo的根目录查找config/目录,而不是在bar的根目录中查找。
bar如何确定config/的正确目录?我认为我需要找到composer安装的根目录,但我不知道如何做到这一点。
以现实世界的例子为例...
我将这个foo应用程序部署到Amazon OpsWorks。OpsWorks会将opsworks.php文件放置在部署应用程序的根目录中。我需要我的子模块(上面的bar)知道在composer项目的根目录中访问opsworks.php文件的位置。我需要考虑到composer可能设置为不将bar放置在/vendor/目录中,而可能具有不同的文件结构设置。
换句话说,我想问Composer应用程序的根目录在哪里。
2个回答

5

您可以使用Composer自带的\Composer\Factory::getComposerFile();方法获取项目根目录:

$projectRootPath = dirname(\Composer\Factory::getComposerFile());

对于您的情况,您可以通过以下方式访问您的config/目录:

$configPath = $projectRootPath . '/config'

别忘了将composer添加到依赖项中,以便可以使用\Composer\Factory::class

$ composer require composer/composer


0
如果您查看https://getcomposer.org/doc/01-basic-usage.md,其中的autoload部分描述了您似乎正在寻找的行为。
$loader = require 'vendor/autoload.php';
$loader->add('Acme\\Test\\', __DIR__);

您可以通过此方式定义foo和bar的根目录,并且仅加载您所需的项目。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接