譯 理解 NPM 5 中的 lock 檔案

2021-09-11 08:59:47 字數 3310 閱讀 1926

譯文出自:掘金翻譯計畫

譯者:changkun ou

校對者:jackgit, aladdin-add

npm 的下個主版本(npm 5)在速度、安全性和一堆其他時髦的東西上,相比較前乙個版本帶來了一些改進。然而從使用者的角度來看,最突出的就是全新的 lock 檔案,不止乙個lock 檔案。我們一會兒再談論這個。對於新手來說,乙個package.json檔案使用了語義化版本規範,去描述對於其他包的直接依賴,而這些包可能依賴於其他包等等,以此類推。lock 檔案則是整個依賴關係樹的快照,包含了所有包及其解析的版本。

這個檔案目前取消from字段。眾所周知,這個欄位和時常發生不一致的version字段一起,給**審查看檔案改動差異時,帶來了不少痛苦。不過現在應該變得更加整潔了。

該檔案現在增加了lockfileversion欄位來指定的 lock 格式的版本,並將其設定為1。這是為了使將來的格式更新時,不用去猜測該檔案使用什麼特定版本。以前的 lock 格式仍然支援並被識別為版本0

,

"duplexify": ,複製**

你可能已經注意到了,指向特定 uri 的檔案的resolved字段仍然得到了保留。注意,npm 現在可以(根據 .npmrc 中的設定)解析機器配置使用的不同倉庫,這樣的話,與 integrity 字段一起配合,只要簽名是匹配的,包的**並無關緊要。

上面已經提到過 lock 檔案不止乙個。當安裝新的依賴關係或檔案不存在時,npm 將自動生成乙個名為package-lock.json的 lock 檔案。如開始所述,lock 檔案是當前依賴關係樹的快照,允許不同機器間的重複構建。因此,建議將它新增到您的版本控制中去。

你可能會認為,使用npm shrinkwrap及其npm-shrinkwrap.json可以實現同樣的效果。你的想法沒錯,但建立新 lock 檔案的原因是,這樣能夠更好的傳達乙個資訊,就是 npm 真正支援了 locking 機制,這在以前確實是乙個顯著的問題。

不過還是有一些區別。首先,npm 強制該package-lock.json不會被發布。 即使你將其顯式新增到軟體包的files屬性中,它也不會是已發布軟體包的一部分。這種情況同樣不適用於npm-shrinkwrap.json檔案,哪怕這個檔案可以是發布包的一部分、即便存在巢狀的依賴關係,npm 也會遵守它。你可以簡單的通過執行npm pack來檢視生成的歸檔內部的內容。

接下來,您可能會想知道在已經包含package-lock.json的目錄中執行npm shrinkwrap時會發生什麼。答案很簡單,npm 僅僅會把package-lock.json重新命名為npm-shrinkwrap.json。因為檔案的格式是完全一樣的。

最好奇的還會問,當兩個檔案都存在時會發生什麼。 在這種情況下,npm將完全忽略package-lock.json,只使用npm-shrinkwrap.json。 當只使用 npm 操縱檔案時,這種情況不應該發生。

這很酷,但是什麼時候使用新的 lock 檔案而不是舊的 shrinkwrap? 它通常取決於您正在處理的包的型別。

如果你正在開發乙個庫(如其他人所依賴的軟體包),則應使用新的 lock 檔案。 另一種替代方案是使用 shrinkwrap,並確保它不會隨包發布(新的 lock 檔案不會自動發布)。 但為什麼不發布 shrinkwrap 呢? 這是因為 npm 遵守在包中找到的 shrinkwraps,並且由於 shrinkwrap 總是指向單個包的特定版本,所以你無法利用 npm 可以使用相同的包來滿足多個包的要求(在 semver 允許範圍內)的優勢。 換句話說,通過不去強制 npm 來安裝特定的版本,您可以讓 npm 更好的復用包,並使結果更小更快地組合。

這裡有乙個警告。當你正在開發庫時,因為倉庫中存在package-lock.jsonnpm-shrinkwrap.json,所以每次都會獲得完全相同的依賴關係,這對於你的持續整合伺服器也是如此。現在想象你的package.json指定某個包的依賴關係為^1.0.0,也恰好是 lock 檔案中指定的版本,並且每次安裝。到目前為止一切正常。但如果依賴項發布了乙個新版本,並且意外的破壞了 semver 和你開發的包,這時候會發生什麼?

遺憾的是,在出現錯誤報告之前,你可能無法注意到這個問題。在沒有 lock 檔案的倉庫中,你的構建至少在 ci 伺服器上會失敗,因為它總是嘗試去安裝依賴的latest版本,從而執行出錯的版本(只要該版本定期執行,而不僅僅是針對 pr)。 然而,當 lock 檔案出現後,它將始終安裝能正常工作的被 lock 的版本。

然而,對於這個問題有幾個其他的解決方案。 首先,你可以犧牲問題重現的精確性,而將 lock 檔案新增到版本控制系統中。 其次,你可以做乙個分離的配置來進行構建,在執行測試之前執行npm update。 第三,你可以簡單的在你執行測試之前刪除 lock。 如何處理發現的損壞依賴是另乙個話題了,其主要原因是因為 npm 實現的 semver 不僅沒有涉及如此廣範圍的問題,而且還不支援特定版本的黑名單特性。

這當然就會引起乙個問題,在開發庫的時候,是否真的值得將 lock 檔案新增到版本控制中去。要記住的是,lock 檔案不僅包含依賴關係,還包含dev的依賴關係。在這種意義下來講,開發庫與開發應用時類似(見下一節),無論什麼時候都有著完全相同的 dev 依賴關係,並且不同裝置也算一種優勢。

好,那麼終端使用者在終端中使用的包或打包的可執行檔案會是個什麼情況?在這種情況下,包就是最終結果,即應用。你想要確保終端使用者總能獲得你發布時所具有的確切依賴性。確保在安裝時讓 npm 遵守規則,這就是您想要使用 shrinkwrap 的地方。 記住,使用npm pack發布包時,你可以隨時檢視軟體包的情況。

注意,在package.json中指定乙個特定版本依賴是不夠的,因為你希望確保終端使用者獲得完全相同的依賴關係樹,包括其所有子依賴關係。而package.json中的乙個特定版本保證只會發生在頂層。

其他型別的應用怎麼樣,比如在倉庫內啟動的專案?這種情況並不重要。重要的是安裝正確的依賴項,而兩個 lock 都滿足這一點要求。隨你怎麼選。

譯 在Linux中清空或刪除大檔案內容的5種方法

1.通過重定向到空來清空檔案內容 使用shell重定向null 不存在的物件 清空或清空檔案內容的最簡單方法,如下所示 access.log2.使用 true 命令重定向清空檔案 這裡我們將使用乙個符號 是乙個shell內建命令,它本質上等同於true命令,它可以用作無操作 無操作 另一種方法是將輸...

譯 理解 NodeJS 中基於事件驅動的架構

本文講的是 譯 理解 nodejs 中基於事件驅動的架構,譯文出自 掘金翻譯計畫 譯者 劉德元 薛丁格的貓 校對者 bambooom zaraguo function filesize filename,cb fs.stat filename,err,stats 非同步 cb null,stats....

理解和運用PHP中的多型性 譯

在物件導向程式設計,多型性是乙個強大的和基本的工具。它可以用來在您的應用程式建立乙個更有機的流。本教程將介紹多型性的籠統的概念,以及它如何在php中可以很容易地部署。什麼是多型性?polymorphism 多型性 是乙個很長的單詞,但是它表示的是乙個非常簡單的概念。多型性描述了在物件導向程式設計模式...