每當我嘗試使用作曲人添加新軟件包(如 "composer require packagename/package"
或使用"composer.phar update"
)時,我正在更新所有已安裝的軟件包。作曲家有什麼選擇排除一些我不需要更新的軟件包?從作曲家更新中排除軟件包
回答
如果您覺得需要排除一些軟件包的更新,我會認爲這是進入依賴性混亂的開始。在變壞之前,你應該清理你的依賴關係。
從我的經驗來看,不想更新依賴項的最重要的原因是當你使用包的分支而不是發佈的版本時。您應該嘗試儘可能徹底地解決此問題:
- 如果您使用自己的軟件包,請爲您要使用的提交標記發佈版本。然後切換軟件以使用該確切版本,或使用通配符版本要求,如
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無法檢測到它。
使用composer require packagename/package
,您需要一個新的軟件包,只需要packagename/package
及其依賴項的部分更新。
composer update packagename/package
可用於觸發相同的部分更新,但如果您已在composer.json
中有packagename/package
。
我需要的是排除一個或兩個軟件包並更新所有其他軟件 – user7282
您可以提供一個或多個包的姓名(或名稱)來更新:
composer update vendor1/package1 vendor1/package2 vendor2/*
,這將只更新那些包。
這不是特別排除,它包括,但它肯定會更快地更新特定軟件包。
爲避免使用require
命令進行更新,您可以手工製作composer.json(並不難),然後在剛添加的包上運行上述目標更新。
還可以使用--no-dev排除開發包(如果您沒有開發依賴於生產環境的包)。這也加速了依賴性分析。
運行此命令,看看有什麼是你的包版本:
composer show -i
去
composer.json
和編輯哪個包你想永遠不會composer update
變化,正確地爲寫版本:"jacopo/laravel-authentication-acl": "1.3.*",
更改爲:
"jacopo/laravel-authentication-acl": "1.3.11",
完成!現在如果你運行composer update
這個包沒有更新。
如果版本被鎖定」dev-master「,你想留下來與您目前的安裝? –
對於開發大師,你可以做類似於:'composer show -i'then''nahid/linkify「:」dev-master#0c4e58f「' –
一種解決方法是使用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
不會被下載。
根據我的經驗,排除1或某些軟件包的最好方法是在composer update中使用--interactive。
$ composer update --interactive
當你這樣做時,你可以選擇你想要更新的包並跳過你不想更新的包。
- 1. 從作曲家包
- 2. 如何更新一個作曲家包?
- 3. 作曲家安裝或更新包
- 4. 作曲家包更新,但不安裝
- 5. 使用作曲家重新加載所有軟件包
- 6. 執行從作曲家軟件包的遷移安裝
- 7. 無法使用作曲家安裝或更新Packagist軟件包「twbs/bootstrap」
- 8. 排除包含作曲家安裝的github repo文件夾
- 9. 從Gradle依賴中排除軟件包
- 10. 如何從jar中排除軟件包?
- 11. 從grails test-app中排除軟件包?
- 12. 作曲家更新laravel 5.2
- 13. Symfony的作曲家更新
- 14. Laravel更新作曲家
- 15. 作曲家更新kriswallsmith/assetic
- 16. 更新與作曲家
- 17. Laravel作曲家更新
- 18. Sylius老作曲家更新
- 19. 作曲家更新失敗
- 20. 作曲家:SVN倉庫中的多個軟件包
- 21. 如何禁用在作曲家中刪除未使用的軟件包?
- 22. 作曲家排除特定版本
- 23. 作曲家更新和作曲家全局更新之間的區別
- 24. 如何避免作曲家的PHP軟件包?
- 25. Symfony2和作曲家不安裝軟件包
- 26. 作曲家安裝一個軟件包失敗
- 27. 沒有作曲家的Laravel軟件包安裝
- 28. 作曲家不會安裝「require-dev」軟件包
- 29. 作曲家軟件包使用git進行版本控制
- 30. 使用作曲家安裝twilio軟件包
另外如果軟件包版本是「dev-master」呢?會像「外部/包」:「〜dev-master,!> = 1.2.5」工作? – user7282
想要排除包裝的原因有很多!例如,我正在開發一個庫,並且我正在功能分支上測試正在進行的工作。所以我需要一個應用程序與依賴關係保持一致,但我的圖書館仍然保持獨立。 – joachim
如果您需要一個環境(應用程序)來測試您的庫,那麼您的測試可能是錯誤的。庫應該能夠獨立測試,不需要集成到其他軟件中。但是,您應該可以取而代之要求您的lib的分支 - 而且您還可以直接包含本地存儲庫作爲依賴項源,因此您可以將該庫分開一點,但仍然將其放在應用程序中進行測試。 – Sven