2015-05-14 79 views
7

每當我嘗試使用作曲人添加新軟件包(如 "composer require packagename/package"或使用"composer.phar update")時,我正在更新所有已安裝的軟件包。作曲家有什麼選擇排除一些我不需要更新的軟件包?從作曲家更新中排除軟件包

回答

1

如果您覺得需要排除一些軟件包的更新,我會認爲這是進入依賴性混亂的開始。在變壞之前,你應該清理你的依賴關係。

從我的經驗來看,不想更新依賴項的最重要的原因是當你使用包的分支而不是發佈的版本時。您應該嘗試儘可能徹底地解決此問題:

  • 如果您使用自己的軟件包,請爲您要使用的提交標記發佈版本。然後切換軟件以使用該確切版本,或使用通配符版本要求,如1.0.*,~1.2^1.3.4
  • 如果您使用的是無法直接影響的外部代碼,請嘗試聯繫該代碼的開發人員並要求他們標記一個版本。標記版本對於維護一個合理的依賴樹非常重要。
  • 如果你不能讓外部開發者標記一個版本,找到一種方法,自己標記爲:
    • 克隆他們在Github上庫,標籤版本,並註明您的存儲庫,而不是去packagist副本.ORG。
    • ,「類型=包」庫在composer.json文件條目創建必要的元數據。
    • 或者至少是,取決於分支時,它分配一個版本的別名允許的平穩過渡後,當外部項目開始標記它們的版本。請注意,這不會解決您當前的問題,但它可能會使事情在未來更好。
  • 如果一切都失敗了,您可能會在composer.json中指向某個提交ID。這將

一般來說,您應該始終無條件地運行composer update。如果沒有,這是一個警告標誌,表示在您自己的composer.json文件中沒有正確聲明的依賴關係。

不希望更新的第二個原因是標記爲錯誤修復而不是主要版本增加的軟件包中的不兼容更改。因爲這將是簡單的解決辦法:

  • 首先你必須要探討這種錯誤的原因:當時真的不兼容的API的變化?如果是,則向該軟件包的開發者提出問題。他們應該創建一個新的錯誤修復版本,並將該不兼容的更新回滾或修復,如果他們想保留更改,則應根據更改的內容爲其添加次要或主要版本增量標記。
  • 如果不正確地使用他們的代碼,不知何故不使用公共API,錯誤修復不太可能。你應該嘗試通過不使用不應該是公共API的東西來修復你的代碼。例如,在Symfony的最新版本中,公共API在代碼和文檔中顯式標記 - 即使在執行「兼容」版本更新(如從2.6.x到2.7.x)時,使用其他內容也會中斷。
  • 解決這個問題的另一種方法是排除composer.json文件中的較新版本:如果您發現版本1.2.5破壞了您的軟件,則會將"external/package":"~1.2,!1.2.5"代替爲"external/package":"~1.2"。或者,也許你害怕進一步的更新也打破了你的軟件,你會投入"external/package":"~1.2,!>=1.2.5"

還有一件事要補充:如果您運行的是composer require,那麼您將無法獲得已安裝軟件包的更新。他們是固定的。所需的軟件包將根據所有已安裝的版本進行選擇,並且只有在存在與所有已安裝版本兼容的版本時纔會安裝。請注意,如果在你自己的composer.json和新軟件包中依賴於軟件包分支,這將無法正常工作。原因是分支名稱將是相同的,但您永遠不會知道正在使用哪個提交。也許這個新軟件包使用第三個軟件包的最近提交dev-master,而你自己的軟件是一個非常古老的軟件,並且兩者之間存在不兼容的變化 - 這會破壞事情,而Composer無法檢測到它。

+0

另外如果軟件包版本是「dev-master」呢?會像「外部/包」:「〜dev-master,!> = 1.2.5」工作? – user7282

+0

想要排除包裝的原因有很多!例如,我正在開發一個庫,並且我正在功能分支上測試正在進行的工作。所以我需要一個應用程序與依賴關係保持一致,但我的圖書館仍然保持獨立。 – joachim

+0

如果您需要一個環境(應用程序)來測試您的庫,那麼您的測試可能是錯誤的。庫應該能夠獨立測試,不需要集成到其他軟件中。但是,您應該可以取而代之要求您的lib的分支 - 而且您還可以直接包含本地存儲庫作爲依賴項源,因此您可以將該庫分開一點,但仍然將其放在應用程序中進行測試。 – Sven

2

使用composer require packagename/package,您需要一個新的軟件包,只需要packagename/package及其依賴項的部分更新。

composer update packagename/package可用於觸發相同的部分更新,但如果您已在composer.json中有packagename/package

+0

我需要的是排除一個或兩個軟件包並更新所有其他軟件 – user7282

4

您可以提供一個或多個包的姓名(或名稱)來更新:

composer update vendor1/package1 vendor1/package2 vendor2/* 

,這將只更新那些包。

這不是特別排除,它包括,但它肯定會更快地更新特定軟件包。

爲避免使用require命令進行更新,您可以手工製作composer.json(並不難),然後在剛添加的包上運行上述目標更新。

還可以使用--no-dev排除開發包(如果您沒有開發依賴於生產環境的包)。這也加速了依賴性分析。

+0

大多數情況下,我想排除一個或兩個軟件包並更新所有其他軟件包。可能嗎? – user7282

+0

我不知道排除方法,但您可以預先格式化所有想要的軟件包命令行:'composer update vendor/package1 vendor/package2 vendor2/*',並將該命令放在方便的地方。 – scipilot

+0

但是我會有一些10 - 20的套餐,這些套餐會適時增加,而那些需要排除的套餐會少一些。所以很難跟蹤需要更新的軟件包。 – user7282

9
  1. 運行此命令,看看有什麼是你的包版本:

    composer show -i 
    
  2. composer.json和編輯哪個包你想永遠不會composer update變化,正確地爲寫版本:

    "jacopo/laravel-authentication-acl": "1.3.*", 
    

    更改爲:

    "jacopo/laravel-authentication-acl": "1.3.11", 
    

完成!現在如果你運行composer update這個包沒有更新。

+0

如果版本被鎖定」dev-master「,你想留下來與您目前的安裝? –

+0

對於開發大師,你可以做類似於:'composer show -i'then''nahid/linkify「:」dev-master#0c4e58f「' –

0

一種解決方法是使用replace property,但沒有爲專用命令,這樣你就可以運行composer require foo/bar像往常一樣(這將創建composer.json),然後添加一個新replace段爲包忽視。您可以自己創建composer.json文件。這裏是例子:

{ 
    "require": { 
     "radic/tmp-underscore-php": "1.2.0" 
    }, 
    "replace": { 
     "patchwork/utf8": "*" 
    } 
} 

一旦運行composer install,所需的軟件包patchwork/utf8不會被下載。

2

根據我的經驗,排除1或某些軟件包的最好方法是在composer update中使用--interactive。

$ composer update --interactive 

當你這樣做時,你可以選擇你想要更新的包並跳過你不想更新的包。