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

php*_*uru 7 php symfony composer-php

我继承了一个用PHP 5.3.x,Symfony2和Composer构建的项目,用于依赖管理.

composer.json文件有很多这样的行:"vendorname/library" : "dev-master"对于正在使用的库的版本.它最后一次编辑于2012年8月,并且由于composer.lock文件存在且项目在我们主机的服务器上运行,因此显然有效.

值得庆幸的是,对composer.lock进行了一次小调整,我开始composer install工作,但我现在要做的就是修复运行composer update时遇到的一些失败.网上有很多关于作曲家依赖地狱的帖子 - 而且我在河上的一条漏水船上朝着那里拔头发.

简而言之,几年前当composer.lock被创建时,该项目与当时版本的几十个包含供应商库的"dev"一起工作,但现在我正在努力清理这些混乱,我想将正确的版本放入composer.json并尝试从已知状态更新内容.

如何通过composer install发现实际安装的版本?或者composer.lock文件中的键/值告诉你这个?

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

这是composer.json的一个示例行:

"doctrine/doctrine-bundle"              : "dev-master",
Run Code Online (Sandbox Code Playgroud)

这是该模块的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"
}
Run Code Online (Sandbox Code Playgroud)

我猜测作曲家会安装来自composer.lock的dist-> url或source-> url,但我有几十个模块要经历并想知道如何为每个引用的库找到最接近的(按日期)标记来创建一个合理的composer.json文件继续更新我们的代码.

Jus*_*ard 4

首先您需要找出哪些软件包依赖于某个dev-master版本。

composer show -i
Run Code Online (Sandbox Code Playgroud)

这将列出您的所有软件包以及安装的版本。像这样的东西:

symfony/http-foundation               dev-master 1234abc
symfony/http-kernel                   v2.5.7
Run Code Online (Sandbox Code Playgroud)

您将看到一些软件包被列为具有版本dev-master <commit>。记下这些包的名称。

现在,您可以通过在目录中安装包的源代码来让自己更轻松一些vendor

composer install --prefer-source
Run Code Online (Sandbox Code Playgroud)

现在,对于上面提到的每个包,cd进入包目录并找到最新的标签。

cd vendor/symfony/http-foundation
git describe # Shows the latest tag
Run Code Online (Sandbox Code Playgroud)

现在您可以使用该标签来确定要安装的版本。例如,如果git describe返回v2.2.3,您可以将版本号更改composer.json2.2.*.

"symfony/http-foundation": "2.2.*"
Run Code Online (Sandbox Code Playgroud)

如果最新标签距离已安装的提交“很远”,这部分可能会很棘手。如果遇到太多问题,您始终可以通过输入dev-master#<commit>版本要求来安装精确的提交哈希。

"symfony/http-foundation": "dev-master#1234abc"
Run Code Online (Sandbox Code Playgroud)