我继承了一个用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",
,这是该模块的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"
}
我猜测作曲家会安装来自composer.lock的dist-&gt; url或source-&gt;网址,但是我有几十个模块可以通过,并想知道如何找到每个引用的最近(按日期)标记库创建一个理智的composer.json文件,以便继续更新我们的代码。
答案 0 :(得分:4)
首先,您需要找出哪些软件包依赖于dev-master
版本。
composer show -i
这将列出您的所有软件包以及安装的版本。像这样:
symfony/http-foundation dev-master 1234abc
symfony/http-kernel v2.5.7
您会看到某些软件包列为版本dev-master <commit>
。记下这些包裹的名称。
现在,您可以通过在vendor
目录中安装软件包的源代码来使自己更容易一些。
composer install --prefer-source
现在,对于您在上面提到的每个包,cd
进入包目录并找到最新的标记。
cd vendor/symfony/http-foundation
git describe # Shows the latest tag
现在,您可以使用该标记来确定要安装的版本。例如,如果git describe
返回v2.2.3
,您可以将composer.json
中的版本号更改为2.2.*
。
"symfony/http-foundation": "2.2.*"
如果最新标记距离已安装的提交“很远”,则此部分可能会非常棘手。如果遇到太多问题,可以通过将dev-master#<commit>
放入版本要求来始终安装确切的提交哈希。
"symfony/http-foundation": "dev-master#1234abc"
答案 1 :(得分:2)
感谢其他答案,我开始挖掘,发现你可以获得有用的信息:
composer show -t
它将生成一个依赖树,每个包旁边都会有版本。