2

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

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

但是,最新版本的博客模块只能与 2.x 版的小部件模块一起使用。因此,如果将小部件模块添加到项目的 composer.json 中,Composer 应该只让它安装 2.x 版本,因为安装较低版本会破坏博客模块。

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

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

4

1 回答 1

2

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

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

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

摆脱这种混乱是有希望的。

假设博客版本 4.1.* 仍然与小部件 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。
  3. 在任何版本 4 中包含您的博客的任何安装都将在更新时始终尝试获取最新版本。因此 ~4.1 或 4.2.* 的版本要求将更新到最新的匹配版本 4.2.1。此版本不存在兼容性问题。
  4. 任何希望更新到最新博客版本的安装都知道新的主要版本可能意味着不兼容。因此,对现有小部件 1.x 的更新将不起作用,Composer 会告诉您这一点。
  5. 无论安装什么小部件版本,任何获取不兼容版本 4.2.0 的安装都将通过更新到 4.2.1 进行修复。

如果不兼容是通过更新的补丁版本引入的,则相同的工作流程将适用,即博客 4.2.6 兼容,4.2.7 不兼容。发布新的 4.2.8 并删除更改(即将 4.2.6 重新发布为 4.2.8),将conflict条目添加到 4.2.7 代码并将其发布为 5.0.0。

于 2014-08-12T21:00:30.280 回答