跳至主要內容

完整性檢查與鎖定檔案

簡介

假設你的模組依賴於遠端模組 https://some.url/a.ts。當你第一次編譯你的模組時,a.ts 會被擷取、編譯並快取。它將保持這種方式,直到你在新機器上執行你的模組(例如在製作時)或重新載入快取(例如透過 deno cache --reload)。但是,如果遠端網址 https://some.url/a.ts 中的內容被變更,會發生什麼事?這可能會導致你的製作模組執行與你的本機模組不同的依賴項程式碼。Deno 避免此問題的解決方案是使用完整性檢查和鎖定檔案。

快取和鎖定檔案

Deno 可以使用小型 JSON 檔案儲存和檢查模組的子資源完整性。若要選擇鎖定檔案,請執行下列任一動作

  1. 在目前或祖先目錄中建立一個 deno.json 檔案,它會自動在 deno.lock 中建立一個加法鎖定檔案。
  2. 使用 --lock=deno.lock 來啟用並指定鎖定檔案檢查。若要更新或建立鎖定,請使用 --lock=deno.lock --lock-write--lock=deno.lock 會告訴 Deno 要使用哪個鎖定檔案,而 --lock-write 則用於將依賴項雜湊輸出到鎖定檔案(--lock-write 必須與 --lock 結合使用)。

一個 deno.lock 可能看起來像這樣,儲存檔案的雜湊以對抗依賴項

{
"https://deno.land/std@0.220.0/textproto/mod.ts": "3118d7a42c03c242c5a49c2ad91c8396110e14acca1324e7aaefd31a999b71a4",
"https://deno.land/std@0.220.0/io/util.ts": "ae133d310a0fdcf298cea7bc09a599c49acb616d34e148e263bcb02976f80dee",
"https://deno.land/std@0.220.0/async/delay.ts": "35957d585a6e3dd87706858fb1d6b551cb278271b03f52c5a2cb70e65e00c26a",
...
}

自動產生的鎖定檔案

如上所述,當 Deno 設定檔(例如 deno.json)已解析,將會自動產生附加鎖定檔。預設情況下,此鎖定檔的路徑將為 deno.lock。你可以透過更新 deno.json 來指定此路徑

{
"lock": "./lock.file"
}

或透過指定以下內容來停用自動建立和驗證鎖定檔

{
"lock": false
}

使用 --lock--lock-write 旗標

典型的流程如下所示

src/deps.ts

// Add a new dependency to "src/deps.ts", used somewhere else.
export { xyz } from "https://unpkg.com/xyz-lib@v0.9.0/lib.ts";

然後

# Create/update the lock file "deno.lock".
deno cache --lock=deno.lock --lock-write src/deps.ts

# Include it when committing to source control.
git add -u deno.lock
git commit -m "feat: Add support for xyz using xyz-lib"
git push

另一台電腦上的協作者 - 在一個剛複製的專案樹中

# Download the project's dependencies into the machine's cache, integrity
# checking each resource.
deno cache --reload --lock=deno.lock src/deps.ts

# Done! You can proceed safely.
deno test --allow-read src

執行階段驗證

如同上述的快取,你也可以在使用 deno run 子指令期間使用鎖定檔,在執行期間驗證任何鎖定模組的完整性。請記住,這只會針對先前新增至鎖定檔的相依性進行驗證。

你也可以更進一步使用 --cached-only 旗標來要求已快取遠端相依性。

deno run --lock=deno.lock --cached-only mod.ts

如果 mod.ts 的相依性樹中有任何尚未快取的相依性,這將會失敗。