Composer:需要特定版本的非必需包

时间:2014-08-12 11:15:01

标签: php package composer-php package-managers packagist

使用包管理器Composer时,是否可以为不需要的包指定所需的版本?

例如: 假设我有一个博客模块和一个小部件模块。这两个模块都可以正常工作,并且不需要其他模块。

但是,最新版本的博客模块仅适用于小部件模块的2.x版本。因此,如果将widget模块添加到项目的composer.json中,则Composer应该只允许它安装2.x版本,因为安装较低版本会破坏博客模块。

我知道Composer的'建议'功能,但它似乎没有强制执行版本。

这可能吗?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:2)

如果博客和窗口小部件没有直接的依赖关系,那么如果窗口小部件存在于错误的版本中,则博客不应该中断。修复博客模块以接受任何版本的小部件。使用任何必要的东西来检测窗口小部件是否存在,检查它的版本,并应用必要的修复以接受任何版本。

如果你不能这样修复它,另一种方法是将小部件添加为博客的直接依赖。显然已经有一些检测,因为博客可以使用或不使用小部件。总是安装小部件有什么问题?

使用conflict可能有一个解决方案 - 在这里您可以说明如果要安装该版本中的软件包而必须不存在的软件包(例如blog 4.2.7widget 1.*冲突)。请注意,您当前发布的与旧版小部件不兼容的博客版本永远不会获得conflict信息,因此如果您已经没有发布博客,则用户仍会陷入该陷阱。更重要的是,如果最新的博客版本引入了冲突,那么所有具有旧窗口小部件的安装都将永远不会获得该博客版本,但请留在最后一篇未说明该版本冲突的博客版本。

有一些希望摆脱这种混乱。

假设博客版本4.1。*仍然与widget 1.x兼容,现在博客版本4.2.0不兼容。您应该执行以下操作:

  1. 发布当前博客模块的补丁更新,通过滚动更改来修复不兼容性,但标记新版本。应该在某处提到不兼容性,所以如果没有它,这应该被视为需要修复的错误。如果上一个兼容的博客版本是4.1.12,并且在4.2.0变得不兼容之后,您可以添加一个新标记4.2.1,它指向与4.1.12相同的提交。这将修复错误,但遗憾的是删除导致4.2版本的新功能。就这样吧。
  2. 将冲突信息添加到博客中。与旧版小部件的这种不兼容性应视为不兼容的软件更新本身,因此在将conflict信息添加到composer.json之后,您可以再次将4.2.0软件分支作为新版本5.0.0发布。< / LI>
  3. 在任何版本4中包含您的博客的任何安装将始终尝试在更新时获取最新版本。因此,版本要求~4.1或4.2。*将更新到最新的匹配版本4.2.1。此版本没有兼容性问题。
  4. 任何希望更新到最新博客版本的安装都会知道新的主要版本意味着可能不兼容。因此,使用现有小部件1.x的更新将不起作用,并且Composer将告诉它。
  5. 无论安装了哪个小部件版本,任何获取该不兼容版本4.2.0的安装都将使用4.2.1的更新进行修复。
  6. 如果使用较新的补丁版本引入了不兼容性,则相同的工作流将适用,即博客4.2.6兼容,4.2.7不兼容。发布新的4.2.8并删除更改(即重新发布4.2.6为4.2.8),将conflict条目添加到4.2.7代码并将其发布为5.0.0。