Turborepo 1.6

2022年10月21日 星期五
Matt Pocock
姓名
Matt Pocock
X
@mattpocockuk
Greg Soltis
姓名
Greg Soltis
X
@gsoltis
Nathan Hammond
姓名
Nathan Hammond
Tom Knickman
姓名
Tom Knickman
X
@tknickman
Anthony Shew
姓名
Anthony Shew
X
@anthonysheww
Jared Palmer
姓名
Jared Palmer
X
@jaredpalmer
Mehul Kar
姓名
Mehul Kar
X
@mehulkar
Chris Olszewski
姓名
Chris Olszewski

Turborepo 1.6 改變了 Turborepo 的遊戲規則 - 您現在可以在任何專案中使用它。

立即執行 npm install turbo@latest 來更新。

任何程式碼庫都可以使用 Turborepo

Turborepo 幫助加速您的程式碼庫中的任務。到目前為止,我們專門為 Monorepo 建構了 Turborepo - 包含多個應用程式和套件的程式碼庫。

Turborepo 在 Monorepo 中非常出色,因為它們有許多任務要處理。每個套件和應用程式都需要建置、程式碼檢查和測試。

但我們開始思考:許多 Monorepo 的程式碼庫也執行大量任務。大多數 CI/CD 流程都會執行許多重複的工作,這些工作可以從 快取 中受益。

因此,我們很高興宣布任何程式碼庫現在都可以使用 Turborepo

立即從範例開始,或將 Turborepo 新增到現有專案中,立即試用看看

將 Turborepo 新增到您的專案

  1. 安裝 turbo
終端機
npm install turbo --save-dev
  1. 在您的新儲存庫的根目錄新增一個 turbo.json 檔案
./turbo.json
{
  "pipeline": {
    "build": {
      "outputs": [".next/**", "!.next/cache/**"]
    },
    "lint": {
      "outputs": []
    }
  }
}
  1. 嘗試使用 turbo 執行 buildlint
終端機
turbo build lint

恭喜 - 您剛剛使用 turbo 執行了您的第一個建置。您可以嘗試

我應該在何時使用 Turborepo?

Turborepo 可用於非 Monorepo 開啟了許多新的使用案例。但在什麼情況下它能發揮最佳效用呢?

當腳本相互依賴時

您應該使用 turbo 來執行您的 package.json 腳本。如果您有多個相互依賴的腳本,您可以將它們表示為 Turborepo 任務

turbo.json
{
  "pipeline": {
    "build": {
      "outputs": ["dist/**"]
    },
    "lint": {
      // 'build' should be run before 'lint'
      "dependsOn": ["build"]
    },
    "test": {
      // 'build' should be run before 'test'
      "dependsOn": ["build"]
    }
  }
}

然後,您可以執行

終端機
turbo run lint test

因為您已聲明 build 應在 linttest 之前執行,所以當您執行 linttest 時,它會自動為您執行 build

不僅如此,它還會為您找出最佳排程。前往我們的核心概念文件,了解 最佳化速度

當您想要並行執行任務時

想像一下,您正在執行一個 Next.js 應用程式,同時也執行 Tailwind CLI。您可能有兩個腳本 - devdev:css

package.json
{
  "scripts": {
    "dev": "next",
    "dev:css": "tailwindcss -i ./src/input.css -o ./dist/output.css --watch"
  }
}

無需在您的 turbo.json 中新增任何內容,您就可以執行

終端機
turbo run dev dev:css

就像 concurrently 之類的工具一樣,Turborepo 會自動並行執行這兩個腳本。

這對於開發模式非常有用,但也可以用於加速 CI 上的任務 - 想像一下您有多個腳本要執行

終端機
turbo run lint unit:test e2e:test integration:test

Turborepo 將找出最快的方式並行執行您的所有任務。

Prune 現在支援 npm

在過去的幾個版本中,我們一直在為不同的 workspace 管理器新增對 turbo prune 的支援。這一直是一個挑戰 - turbo prune 會建立您 Monorepo 的子集,包括修剪鎖定檔中的依賴項。這表示我們必須為每個 workspace 管理器分別實作邏輯。

我們很高興宣布 turbo prune 現在適用於 npm,完整支援所有主要的套件管理器。這表示如果您的 Monorepo 使用 npmyarnyarn 2+pnpm,您將能夠輕鬆部署到 Docker。

查看我們之前關於 turbo prune 的部落格以了解更多資訊。

快取效能改進

在 1.6 之前,Turborepo 的本機快取是對系統上檔案的遞迴複製,複製到磁碟上的另一個位置。這很。這表示對於我們需要快取的每個檔案,我們都需要執行六個系統呼叫:來源檔案上的開啟、讀取和關閉;目的地檔案上的開啟、寫入和關閉。

在 1.6 中,我們將其減少了近一半。現在,在建立快取時,我們會建立一個單一的 .tar 檔案(一次開啟),我們以 1mb 區塊寫入它(批次寫入),然後關閉它(一次關閉)。系統呼叫減半的狀況發生在從快取中取出的過程中。

我們並沒有就此止步。在過去一個月中,我們在建置工具鏈上投入了大量資金,以啟用 CGO,這解鎖了使用以 C 語言編寫的最佳類別函式庫。這使我們能夠採用 Zstandardlibzstd 進行壓縮,這為我們帶來了演算法上 3 倍的壓縮效能提升。

在所有這些變更之後,我們經常看到本機快取建立的效能提升超過 2 倍,遠端快取建立的效能提升超過 3 倍。您的儲存庫越大,或您的裝置越慢(說的就是您,CI),情況就越好。這表示我們能夠精確地為那些最需要它的人提供效能提升。