2017-05-31 31 views

回答

5

主要區別在於lockfiles還會鎖定嵌套的依賴關係 - 依賴關係的所有依賴關係,等等。管理和跟蹤所有這些更改可能非常困難,並且使用的軟件包數量可能呈指數增長。

還有一些情況下,您無法手動指定應使用某個特定版本的軟件包 - 請考慮分別指定foo分別爲~1.0.0~2.0.0的2個庫。主要版本的差異告訴我們,foo @ v1的API不會與foo @ v2的API匹配,因此您無法在應用程序級別覆蓋軟件包版本,而不會導致衝突和故障。

最後,您可能會想:「爲什麼要在所有的時候都使用semver?爲什麼不讓所有包都手動指定它們的依賴關係的確切版本?」 semver的一個主要優點是它意味着當子依賴性更新時,不必更新樹中的每個依賴項。如果我依賴foo,並且foo依賴於barbar只是有一個修補的重要bug,並且我們使用的是精確版本的所有內容,那麼foo也必須先更新,然後才能獲得修復。如果foo和bar有不同的維護者,或者如果foo被拋棄了,那可能需要一段時間,我可能需要爲項目分配一些東西(我在Java-land中做過的不止一次)。

這對維護庫的生態系統非常有用,因爲它從根本上減少了依賴樹中每個節點所需的維護工作量,使得它更易於提取庫和模式。我曾經有一個早期的項目,我們正在構建一個使用精確版本的組件庫,並且任何時候包含共享功能的核心庫都已更新,我們必須提交一個PR到,其他軟件包的每個以更新版本,以及有時會追蹤PR到依賴於那些的組件。毋庸置疑,我們在幾個月後合併了這些軟件包。

希望有幫助!

+0

很好的解釋,謝謝! – user2061057

+0

我不確定我是否按照你的第二段。在NPM中,每個模塊都不是「它自己的依賴樹」嗎?換句話說,不是NPM OK,它有兩個衝突版本的傳遞依賴關係,因爲它使它們保持獨立? – jrahhali

+0

是的,但是如果2個軟件包共享相同的依賴關係,則npm只能在node_modules的頂級安裝該dep一次。 https://docs.npmjs.com/how-npm-works/npm3-nondet這篇文檔是針對npm3的,但它仍然適用。 – user2301179