Php 如何读取或反向工程composer.lock文件?

Php 如何读取或反向工程composer.lock文件?,php,symfony,composer-php,Php,Symfony,Composer Php,我继承了一个使用PHP5.3.x、Symfony2和Composer构建的项目,用于依赖关系管理 composer.json文件中有许多类似的行:“vendorname/library”:“dev master”,表示正在使用的库的版本。它上一次编辑是在2012年8月,当时显然是有效的,因为composer.lock文件存在,并且项目正在我们主机的服务器上运行 幸好对composer.lock做了一个小小的调整,我让composer安装正常工作,但我现在要做的是修复运行composer更新时遇到

我继承了一个使用PHP5.3.x、Symfony2和Composer构建的项目,用于依赖关系管理

composer.json文件中有许多类似的行:
“vendorname/library”:“dev master”
,表示正在使用的库的版本。它上一次编辑是在2012年8月,当时显然是有效的,因为composer.lock文件存在,并且项目正在我们主机的服务器上运行

幸好对composer.lock做了一个小小的调整,我让
composer安装
正常工作,但我现在要做的是修复运行composer更新时遇到的一些故障。网上有很多关于作曲家依赖地狱的帖子,我在冥河上的一艘漏水的船上,正往那里拉头发

简言之,几年前创建composer.lock时,该项目使用了当时的“dev”版本,其中包括几十个供应商库,但现在我正试图清理混乱,我想将正确的版本放入composer.json,并尝试从已知状态更新内容

如何发现composer install实际安装了哪些版本?或者composer.lock文件中的哪些键/值告诉您这一点

我在composer.lock文件中有很多github提交哈希,但是如果给定任意提交哈希,那么用什么最接近的标记版本替换composer.json中的相应行还不清楚

下面是composer.json中的一行示例:

"doctrine/doctrine-bundle"              : "dev-master",
下面是该模块的composer.lock中的对应节点:

{
    "name": "doctrine/doctrine-bundle",
    "version": "dev-master",
    "target-dir": "Doctrine/Bundle/DoctrineBundle",
    "source": {
        "type": "git",
        "url": "http://github.com/doctrine/DoctrineBundle.git",
        "reference": "d3c930599723c8343472a5791b0f5909a4111a73"
    },
    "dist": {
        "type": "zip",
        "url": "https://github.com/doctrine/DoctrineBundle/zipball/d3c930599723c8343472a5791b0f5909a4111a73",
        "reference": "d3c930599723c8343472a5791b0f5909a4111a73",
        "shasum": ""
    },
    "require": {
        "doctrine/dbal": ">=2.2,<2.4-dev",
        "php": ">=5.3.2",
        "symfony/doctrine-bridge": "2.1.*",
        "symfony/framework-bundle": "2.1.*"
    },
    "require-dev": {
        "doctrine/orm": ">=2.2,<2.4-dev",
        "symfony/validator": "2.1.*",
        "symfony/yaml": "2.1.*"
    },
    "suggest": {
        "doctrine/orm": "The Doctrine ORM integration is optional in the bundle."
    },
    "type": "symfony-bundle",
    "extra": {
        "branch-alias": {
            "dev-master": "1.0.x-dev"
        }
    },
    "autoload": {
        "psr-0": {
            "Doctrine\\Bundle\\DoctrineBundle": ""
        }
    },
    "license": [
        "MIT"
    ],
    "authors": [
        {
            "name": "Fabien Potencier",
            "email": "fabien@symfony.com"
        },
        {
            "name": "Benjamin Eberlei",
            "email": "kontakt@beberlei.de"
        },
        {
            "name": "Symfony Community",
            "homepage": "http://symfony.com/contributors"
        }
    ],
    "description": "Symfony DoctrineBundle",
    "homepage": "http://www.doctrine-project.org",
    "keywords": [
        "DBAL",
        "Database",
        "ORM",
        "Persistence"
    ],
    "support": {
        "source": "https://github.com/doctrine/DoctrineBundle/tree/master",
        "issues": "https://github.com/doctrine/DoctrineBundle/issues"
    },
    "time": "2012-09-10 15:12:44"
}
{
“名称”:“条令/条令包”,
“版本”:“开发主机”,
“目标目录”:“条令/捆绑/条令捆绑”,
“来源”:{
“类型”:“git”,
“url”:”http://github.com/doctrine/DoctrineBundle.git",
“参考文件”:“d3c930599723c8343472a5791b0f5909a4111a73”
},
“地区”:{
“类型”:“zip”,
“url”:”https://github.com/doctrine/DoctrineBundle/zipball/d3c930599723c8343472a5791b0f5909a4111a73",
“参考文件”:“d3c930599723c8343472a5791b0f5909a4111a73”,
“shasum”:”
},
“要求”:{
“条令/dbal”:“>=2.2,=5.3.2”,
“symfony/教义桥”:“2.1.*”,
“symfony/frameworkbundle”:“2.1.*”
},
“需要开发”:{

“条令/orm”:“>=2.2,首先,您需要找出哪些包依赖于
dev master
版本

composer show -i
这将列出您的所有软件包以及安装的版本。如下所示:

symfony/http-foundation               dev-master 1234abc
symfony/http-kernel                   v2.5.7
您将看到一些软件包被列为具有版本
dev master
。请注意这些软件包的名称

现在,您可以在
供应商
目录中安装软件包的源代码,从而使自己的工作变得更轻松

composer install --prefer-source
现在,对于上面提到的每个包,
cd
进入包目录并找到最新的标记

cd vendor/symfony/http-foundation
git describe # Shows the latest tag
现在,您可以使用该标记来确定要安装的版本。例如,如果
git descripe
返回
v2.2.3
,您可以将
composer.json
中的版本号更改为
2.2.

"symfony/http-foundation": "2.2.*"
如果最新标记与已安装的提交“相距甚远”,则此部分可能会比较棘手。如果遇到太多问题,则始终可以通过将
dev master#
放入您的版本要求中来安装精确的提交哈希

"symfony/http-foundation": "dev-master#1234abc"

多亏了其他答案,我开始挖掘,并发现您可以获得以下有用信息:

composer show -t

它将生成一个依赖关系树,每个包旁边都会有版本。

要查找当前安装的版本,您可以从中使用
composer show-i
。这应该让您开始。这非常简单,如果从那时起包没有标记,但在主分支.Y上进行了一些开发,那么真正的工作就开始了您希望避免使用任何分支,但这是第二步:替换未标记为其他分支的软件。