没有依赖关系!
是的,认真的。如果您要开发一个使用 Guzzle 作为 HTTP 客户端的 API 客户端,您必须做出选择:使用 Guzzle 版本 3、4、5 还是 6?
Guzzle 3 已停止维护并被废弃。你不会想用它的。
Guzzle 4 也被视为报废,因为版本 5 来得非常快。没有人真正使用这个版本。
这归结为使用版本 5 或 6。但 Guzzle 在两个版本中使用相同的命名空间和可能相同的类名,但彼此不兼容。无论您选择哪个版本:您的客户会做出相反的选择 - 现在您有一个代码库,其中同时运行两个版本的 Guzzle - 这将不起作用。
如果您没有依赖项,而是在自己的代码库中交付所有内容,那么您的所有代码都在您的控制之下,并且减少了使用 Composer 作为工具来轻松安装所有依赖项的需要。您的包将包含所有内容,不太可能存在任何命名空间冲突。
您可以提供一个 ZIP 文件供下载。如果您另外提供 composer.json 以允许开发人员以这种方式包含您的包,那么每个人都会很高兴。
更新
现在,在发现每个人都认为我提议不要使用其他地方发明的东西是疯了之后,我要求你再次考虑一下这种情况:你发现你必须生成可能包含在代码库中的代码,该代码库是不使用 Composer 管理。这意味着您不知道那里放置了什么样的软件。
可能只是因为您在现有代码库中有一个 Guzzle 版本 - 无法检测到,因为没有 composer.json。现在你提供你自己的包和一个捆绑的 Guzzle 版本(不管它出现在那里的任何方式)。由于冲突,这可能会在某个时候使整个软件崩溃,因为自动加载当然会在某个时候合并,然后某些部分代码会请求加载一些 Guzzle 类,该类从两个不同版本中包含两次Guzzle。
在这种情况下会发生什么?事情会崩溃!
而且这是不可避免的。即使在能够使用 Composer 的幸运情况下,它也会发生冲突——软件不会崩溃,但不会安装整个软件包。好消息是:您会立即注意到这一点。
如果主要目标是提供任何人都可以在任何情况下使用的 API 客户端,而无需使用依赖项管理器:没有依赖项!
或者,完全确定您知道哪些软件已经在使用,并创建一个在任何情况下都不会发生冲突的包。但是,这仍然是一项工作,因为可能还会安装其他插件,其中可能包括冲突的软件。
我的中心点是:如果你没有像 Composer 这样的依赖管理器来管理依赖,你最好不要在自己的代码中包含依赖,这样可以很容易地将你自己的代码包含在某人中其他代码库。
上面的问题清楚地表明 Composer 在一般情况下不是一个选项。
现在,隧道尽头有一个亮点:当涉及到一般任务时,PHP-FIG 已经开始标准化应该利用互操作性的接口。对于 HTTP,标准是 PSR-7。
您可以提供一个依赖(并附带)PSR-7 接口的 API SDK,并要求 SDK 的用户提供实现该接口的 HTTP 客户端。
我看到的这种方法的问题是,如果你尝试使用 Guzzle,出于同样的原因,你仍然会遇到麻烦:现在唯一有效的选择是为 SDK 使用 Guzzle 6 - 如果 Guzzle 5 是已经在其他地方使用过?冲突!好处是:如果您已经在使用 Guzzle 5,则可以通过使用任何其他支持 PSR-7 的 HTTP 客户端来避免使用 Guzzle 6。