如何使用作曲家获取root软件包路径



我正在使用Composer开发一个称为PHP-App-Config的PHP组件。此组件曾经是另一个项目要求的,并使用composer install安装,应在根软件包的配置文件夹中查找配置文件,例如root_package/config/config.yml

./config/config.yml仅存在于根软件包中,而不存在于 composer.json中的" require:"所导入的组件中,如下所示:

▾ root-package/
  ▸ bin/
  ▸ build/
  ▾ config/
    ▸ locales/
      config.yml
  ▸ src/
  ▸ tests/
  ▾ vendor/
    ▸ composer/
    ▸ phpdocumentor/
    ▸ phpspec/
    ▸ phpunit/
    ▾ robotdance/
      ▾ php-app-config/
        ▾ src/                                                                                                                                                                                               
      Config.php -> how to get the root "config/config.yml" path from here?
        ▸ tests/
      composer.json
      composer.lock
      phpunit.xml
      README.md

根包可以是Web应用程序或命令行实用程序。有什么方法可以使用作曲家获取根软件包路径?如果没有,更好的方法是什么?

使用ReflectionClass:

$reflection = new ReflectionClass(ComposerAutoloadClassLoader::class);
$vendorDir = dirname(dirname($reflection->getFileName()));

您可以使用作曲家自己的ComposerFactory::getComposerFile();进入项目根目录:

$projectRootPath = dirname(ComposerFactory::getComposerFile());

,如果您的情况,您可以通过:

访问root-package/config/config.yml

$configYmlPath = $projectRootPath . '/config/config.yml'

不要忘记将composer添加到您的依赖项中,以使ComposerFactory::class可用:

$ composer require composer/composer

  • 我建议通过将根路径定义为常数来"锚定"您的应用程序(Web或CLI)。

    例如,当您有一个root-package/src/application.php文件时,它应该知道其居住地,例如define('APP_ROOT_FOLDER', dirname(__DIR__));可能会有所帮助。声明常数后,它也可用于依赖关系。

    所以,在/php-app-config/Config.php中,您只需使用常数:

    $config = APP_ROOT_FOLDER . '/config/config.yml';

    (或定义直接指向应用程序配置文件夹的APP_CONFIG_ROOT_FOLDER常数。)

  • 您也可以尝试从依赖项上提高一些文件夹级别。

    php-app-config/Config.php中,您将使用__DIR__,即root-package/vendor/robotdance/php-app-config/src。现在,您需要达到4个级别才能达到root-package/

    $config = __DIR__.'/../../../../config/config.yml';

    当您的应用程序包装为Phar时,这将无法解决。


有什么方法可以使用作曲家获取根包路径?

如果您有作曲家对象,则可以从配置对象获取供应商目录的路径:

$vendorPath = $composer->getConfig()->get('vendor-dir');

然后,将一个文件夹up $config = dirname($vendorPath) . '/config/config.yml';

相关内容

  • 没有找到相关文章

最新更新