如何在我的私有存储库中获取包含包的确切版本

How to get the exact version of included packages in my private repository

我目前正在试用 Satis。我希望能够在某处获得我的私人包的确切版本,所以通常在 composer.lock 中的所有内容。我总是通过 Git.

提交 composer.lock

但是如果我理解正确的话,Satis 在其 packages.json 中总是只包含需要的部分,即来自我的 composer.json 的部分,因此当然只有版本范围。

有没有办法配置 Satis,以便 composer.lock 也被存储,或者我如何获得我的包的准确“快照”?

+++ 示例+++

好的,我试着解释多一点。

假设我有一个包裹my/package。在这里我添加了几个文件,包括一个 composer.json,我在其中定义 symfony/console 应该安装在大于或等于 4 的版本中。现在我执行“composer install”,Symfony 安装在版本 4.4。我提交所有文件,包括 composer.lock 并创建一个版本 1.0.

现在我要去 Satis。这里我将my/package和my/package对应的仓库URL添加到satis.json并更新。 Satis 正确检查了我的包,并在 packages.json 或更准确地说是 all*.json 中列出了我的包的版本 1.0。目前一切正常。

但是如果我现在看一下 Satis 为我的包存储的元数据 all*.json,我在这里实际上看到了我指定的要求,即 symfony/console 应该安装在一个大于或等于 4 的版本。所以 Satis 拍摄了 composer.json 的快照并且显然忽略了 composer.lock。所以我没有机会看到我的 1.0 版与 Symfony 的确切版本 4.4 一起工作,而例如 1.1 版与 symfony/console 4.5 一起工作。但是这个信息对我来说很有趣。

安装包时,Composer 会即时重新计算所有依赖项。这是基于您的应用程序的 composer.json 和所有依赖项的 composer.json 文件。

composer.lock 不应该是任何包的一部分,安装包时不考虑它。

所以,我现在已经构建了一个解决方法。整个事情并不完美,因为大型存储库的 运行 时间相对较长,这就是为什么我必须每天 运行 它作为 cron 一次。但它工作正常。

  • 我创建了一个新的 Satis 控制台命令。
  • 此命令使用 PackageSelection class 来确定所有现有包。
  • 我遍历包列表并查找 dist 文件的路径和名称。
  • 我解压内存中的 ZIP 文件并寻找 composer.lock。如果有,我解析它并读取依赖包的确切版本号。
  • 我将信息总结在一个单独的JSON文件中,并与packages.json并行存储在htdocs下。从那里我可以调用它并将它集成到我自己的应用程序中或进一步处理它。