2014-12-04 42 views
6

我已經繼承了一個用PHP 5.3.x,Symfony2和Composer構建的用於依賴管理的項目。如何讀取或反向工程composer.lock文件?

composer.json文件中有很多這樣的代碼行:"vendorname/library" : "dev-master"代表正在使用的庫版本。它最後一次編輯於2012年8月,並且自從composer.lock文件存在並且項目在我們的主機上的服務器上運行以後,工作得很清楚。

謝謝你對composer.lock進行了一個小小的調整,我得到了composer install,但我現在要做的是修復運行作曲者更新時遇到的一些故障。網上有很多關於作曲家依賴地獄的帖子 - 我正在河頭的一條泄漏的小船上,那裏的頭髮把我的頭髮拉出來。

簡而言之,在composer.lock創建幾年之後,該項目與當時包含數十個供應商庫的「開發」版本一起工作,但現在我正試圖清理混亂,我想把適當的版本放入composer.json並嘗試從已知狀態更新事物。

如何發現作曲家安裝實際安裝的版本?或者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": "[email protected]" 
     }, 
     { 
      "name": "Benjamin Eberlei", 
      "email": "[email protected]" 
     }, 
     { 
      "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" 
} 

我猜測作曲家安裝dist- >來自composer.lock的url或source-> url,但是我有幾十個模塊需要通過,並且想知道如何爲每個引用的庫找到最接近的(通過日期)標籤來創建一個理智的composer.json文件,以便更新我們的代碼。

+0

要找到當前安裝的版本,您可以使用'composer show -i',從[此答案](http://stackoverflow.com/questions/15185459/how-to-get-list-of-all-installed -packages-沿與版本,在作曲家)。應該讓你開始。 – geoB 2014-12-05 00:09:02

回答

3

首先,您需要找出哪些軟件包依賴於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" 
+0

這很簡單,如果軟件包從那時起未被標記,真正的工作就開始了,但是在主分支上有一些開發。你想避免使用任何分支,但這是第二步:替換沒有標記的軟件。 – Sven 2014-12-06 01:13:23

2

由於其他答案我開始挖掘,發現你可以有有用的信息:

composer show -t 

它會產生一種依賴關係樹,和旁邊的每個包都會有版本。