【问题标题】:Autoloading two vendor projects with composer at the same time同时使用 Composer 自动加载两个供应商项目
【发布时间】:2014-10-11 04:16:19
【问题描述】:

我有两个项目(项目 1、项目 2)正确设置了作曲家,有自己的 composer.json

{
    "require": {
        "wp-cli/wp-cli": "0.15.1"
    }
}

现在,在另一个 php 文件中,我通过自动加载它们

require_once 'project1/vendor/autoload.php';
require_once 'project2/vendor/autoload.php';

我得到了错误

Fatal error: Cannot redeclare cli\render() (previously declared in 
/private/tmp/php/project1/vendor/wp-cli/php-cli-tools/lib/cli/cli.php:26)
in /private/tmp/php/project2/vendor/wp-cli/php-cli-tools/lib/cli/cli.php 
on line 28

是 wp-cli 的问题还是 composer 的问题?我已经尝试过使用其他库,例如 monolog,这很好。

有什么想法吗?

【问题讨论】:

  • 您重新声明了相同的类,因为您将它们包含了两次(在两个项目中)为什么您需要两次 wp-cli?
  • 因为我需要引用两个项目的代码是同一时间的,而且他们都已经使用了wp-cli。我只是想知道为什么自动加载无济于事,因为即使我第二次自动加载,其他库(例如 monolog)也可以。

标签: php composer-php autoload psr-0


【解决方案1】:

您不应该使用 Composer 自动加载器两次。

有一个简单的解决方案:在您的第三个项目中,创建一个新的composer.json 并在其中包含另外两个项目。

然后只包括第三个项目的自动加载。不会涉及重复的类。如果您不仅为您在两个项目中使用的库配置了正确的自动加载,而且还为这些项目中的所有类配置了正确的自动加载,这应该可以工作。

【讨论】:

  • 我不能。其实我的适合是在WordPress插件中使用composer,他们应该不知道其他插件的存在。所以在每个插件中,当它们被激活时,它们应该加载自己的autoload.php 并处理自己的依赖关系。我上面的代码只是模拟了启用两个具有相同依赖项的插件的情况。
  • 好吧,那你有问题了。如果插件 1 需要使用与插件 2 相同的包,但版本不同,那么如果每个插件所需的包的版本不同,您将产生各种无法调试的问题。想象两个不兼容的版本中的同一个类。自动加载它适用于每个插件,因为存在正确的版本,但是将它与包含不同版本的第二个插件放在一起会破坏第一个或第二个插件,具体取决于哪个类首先加载。
猜你喜欢
  • 2015-11-20
  • 2015-08-20
  • 2019-03-16
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-22
  • 2018-02-13
相关资源
最近更新 更多