我正在为开发人员构建一个SDK,用于为电子商务平台构建模块,这些模块将使用我们的API进行新的启动。
显然,使用作曲家是理想的,我现在正在做。但是,当我现在研究大多数电子商务平台,或者至少是最受欢迎的电子商务平台时,他们都不会使用作曲家。
所以我想知道什么是获取我当前所有软件包所需的所有依赖项的最佳方法,并将它们构建为独立的SDK。
这样我就可以拥有一个适用于作曲家和非作曲家启用平台的版本。
在设计模式方面有没有标准化的方法来做到这一点?我将如何以任何有组织的方式布置所有依赖包?
答案 0 :(得分:1)
因为这些电子商务平台不使用作曲家,所以这并不会强迫您将作曲家从等式中排除。您不能将您的软件包作为插件/模块/分发给特定的电子商务平台,但您仍然可以在生产中使用composer的自动加载器。
您可以准备程序包以在计算机或构建服务器上进行部署,归档结果并分发存档。 为简单起见,我的示例将假设您将在本地计算机上准备包:
创建临时工作目录:
$ mkdir -p ~/.tmp && cd ~/.tmp
克隆你的包裹:
$ git clone <package>
安装依赖项 1
$ cd ~/.tmp/<package> && composer.phar install --no-dev --optimize-autoloader
或者如果您使用自动化工具执行此操作:
$ cd ~/.tmp/<package> && composer.phar install --no-ansi --no-dev --no-interaction --no-progress --no-scripts --optimize-autoloader
删除.git
目录。
从~/.tmp/<package>
分发档案。
假设您的软件包已经是该电子商务平台的插件/模块,它可以像往常一样从该zip / tar存档安装。
1) 关于--optimize-autoloader
,请阅读Sven的this answer,这解释了为什么在某些情况下无法帮助您的申请成为更快。
答案 1 :(得分:0)
没有依赖关系!
是的,认真的。如果您开发使用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,你仍会遇到麻烦:现在唯一有效的选择是使用Guzzle 6作为SDK - 如果Guzzle 5是已在其他地方用过冲突!好处是:如果您已经使用任何其他支持PSR-7的HTTP客户端使用Guzzle 5,则可以避免使用Guzzle 6。