如果自定义编辑器包相互需要,则更新这些包将失败


Update custom composer package fails if the packages require each other

我正在使用多个作曲家包作为库,有时这些包需要彼此。例如,在modolib/phpunit中,我有:

"require": {
  "modolib/doctrine": "~1.2",
}

在包modolib/doctrine中,我有:

"require-dev": {
  // ...
  "modolib/phpunit": "~1.3"
},

要对包进行版本控制,我使用标记。在分支master中调用git tag进行modolib/phpunit会发出:

// ...
1.2.8
1.2.9
1.2.10
1.3.0
1.3.1
// ...
1.3.10

分行master modolib/doctrine git tag发布:

// ...
1.2.8
1.2.9
1.2.10
1.2.11
1.2.12

但是,modolib/phpunit 中的composer update将完美运行,但 modolib/doctrine 中的更新将引发此错误:

Problem 1
  - modolib/phpunit 1.3.9 requires moodlib/doctrine ~1.2 -> no matching packages found
  - modolib/phpunit 1.3.8 requires moodlib/doctrine ~1.2 -> no matching packages found
  - modolib/phpunit 1.3.7 requires moodlib/doctrine ~1.2 -> no matching packages found
  - modolib/phpunit 1.3.5 requires moodlib/doctrine 1.2.* -> no matching packages found
  - modolib/phpunit 1.3.4 requires moodlib/doctrine 1.2.* -> no matching packages found
  - modolib/phpunit 1.3.3 requires moodlib/doctrine 1.2.* -> no matching packages found
  - modolib/phpunit 1.3.2 requires moodlib/doctrine 1.2.* -> no matching packages found
  - modolib/phpunit 1.3.10 requires moodlib/doctrine 1.*.* -> no matching packages found
  - modolib/phpunit 1.3.1 requires moodlib/doctrine 1.2.* -> no matching packages found
  - modolib/phpunit 1.3.0 requires moodlib/doctrine 1.2.* -> no matching packages found
  - Installation request for modolib/phpunit ~1.3 -> satisfiable by modolib/phpunit[1.3.0, 1.3.1, 1.3.10, 1.3.2, 1.3.3, 1.3.4, 1.3.5, 1.3.7, 1.3.8, 1.3.9]

modolib/doctrine的当前版本是1.2.12的,自从我创建此标签以来,除了合并到master(我正在使用git flow(之外,没有添加任何提交。

现在看来表达式"modolib/doctrine": "~1.2"是正确的,因为我可以在modolib/phpunit本身更新包,但是作曲家在注意到我正在它试图请求的包中工作时遇到了问题。或者它可能与requirerequire-dev之间的差异有关?

如何解决此错误并在modolib/doctrine中更新我的软件包?

更新:

modolib/phpunit中的更新之所以有效modolib/doctrine是因为 require-dev 中需要modolib/phpunit,但作曲家不会加载它在更新期间加载的包的require-dev部分。因此,从modolib/phpunit的角度来看,包不需要彼此。仅加载modolib/doctrine,但在此存储库中工作时不会尝试加载modolib/phpunit

作曲家会注意到要求是否是您当前正在使用的包。它没有注意到的是标记的版本。当然,Composer 无法读取您的仓库标签,因此您需要在composer.json中提供它们:

"name": "modolib/doctrine",
"version": "1.2.12",
// ...
"require-dev": {
  // ...
  "modolib/phpunit": "~1.3"
},

现在,作曲家知道包的名称和版本,并且可以验证依赖项。