如何使用composer获取根包路径

Men*_*zzo 9 php path root package composer-php

我正在使用composer开发一个名为php-app-config的PHP组件.这个组件,一旦需要另一个项目,并使用,应该在根包的config文件夹中查找配置文件,如.composer installroot_package/config/config.yml

所述./config/config.yml应该只存在于根包,而不是由进口组件里面的"要求"中composer.json,如下:

? 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
Run Code Online (Sandbox Code Playgroud)

根包可以是Web应用程序或命令行实用程序.有没有办法使用composer获取根包路径?如果没有,有什么更好的方法?

And*_*man 8

使用ReflectionClass:

$reflection = new \ReflectionClass(\Composer\Autoload\ClassLoader::class);
$vendorDir = dirname(dirname($reflection->getFileName()));
Run Code Online (Sandbox Code Playgroud)

  • 在新版本的PHP中,你可以简单地使用`dirname($ reflection-> getFileName(),2)`或`dirname($ reflection-> getFileName(),3)`而不是`dirname(dirname(` (4认同)

Jim*_*m M 5

您可以使用 Composer 自己的方法\Composer\Factory::getComposerFile();来访问项目根目录:

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

对于您的案例,您可以通过以下方式访问您的root-package/config/config.yml案例:

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

不要忘记添加composer您的依赖项以使其\Composer\Factory::class可用:

$ composer require composer/composer

  • 正如我所见, `\Composer\Factory::getComposerFile()` 返回 Composer 将使用的文件的名称,而不是实际文件的路径。当网络服务器从“public”等子文件夹公开站点时,“dirname(\Composer\Factory::getComposerFile())”将包含该子文件夹,即使“composer.json”未存储在那里。 (2认同)

Jen*_*och 2

  • 我建议通过将根路径定义为常量来“锚定”您的应用程序(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 时,这将不起作用。


有没有办法使用 Composer 获取根包路径?

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

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

然后,向上移动一个文件夹$config = dirname($vendorPath) . '/config/config.yml';

  • 如何获取作曲家对象?是类似“usecomposer\Composer;”之类的东西吗?$composer = Composer::getComposer();` ? (4认同)
  • 处理“vendor-dir”的代码片段仅考虑它是直接位于根包内的目录的情况。像“vendor-dir”的“dist/php”这样的东西会被破坏。理想的情况是从“InstallationManager”获取安装路径,但此时对根包没有特殊处理,并且在请求根包的安装位置时将返回“vendor-dir”内的安装路径。我发现的最好方法是执行`dirname(\Composer\Factory::getComposerFile());`,它在包目录之外执行时也有效。 (4认同)