建構 Node.js 應用程式

指定 Node.js 版本

這個 Buildpack 專案支援 Node.js 的目前和有效的 LTS 版本。舊版 Node.js 也能使用,但可能不會由專案積極維護。

正在使用 package.json

您可以在部署期間,透過在 package.json 中設定 engines.node 欄位,指定應用程式的 Node.js 版本。如要設定 Buildpack,以便在部署應用程式時使用最新版本的 Node.js v16,您可以在 package.json 中使用下列值:

"engines": {
  "node": "16.x.x"
}

正在使用 GOOGLE_NODEJS_VERSION

您也可以透過 GOOGLE_NODEJS_VERSION 環境變數指定 Node.js 版本。如果同時設定兩種設定,GOOGLE_NODEJS_VERSION 值會優先於 engines.node 屬性。如果未提供任何值,系統會使用 Node.js 的最新 LTS 版本

如要設定 buildpack 在部署應用程式時使用 Node.js 16,請按照下列步驟操作:

pack build --builder=gcr.io/buildpacks/builder \
   sample-functions-framework-node \
   --env GOOGLE_NODEJS_VERSION=16.x.x

您也可以使用 project.toml 專案描述元,為專案檔案和環境變數編碼。請參閱使用環境變數建構應用程式的操作說明。

提示

  • engines.node 欄位可採用 semver 限制。我們在 Node.js 建構包中使用的特定程式庫是 Masterminds/semver
  • 避免在 engines.node 中使用大於 (>) 指定符
  • 將應用程式部署至 App Engine 標準環境時,engines.node 屬性應與 app.yaml 中指定的執行階段相容
  • 如要進一步瞭解 package.json 中的 engines.node 設定選項,請參閱官方 NPM 說明文件中的「引擎主題
  • 將函式部署至 Cloud Run 函式時,engines.node 屬性應與用於部署函式的執行階段相容

安裝依附元件

使用 NPM

  • NPM 是預設套件管理工具。
  • 請盡可能使用 package-lock.json 來改善快取效能。
  • 根據預設,系統只會安裝正式環境依附元件。
  • 您可以使用 package.json 檔案中的 engines.npm 欄位,指定 npm 版本區段。

使用 Yarn

  • 如果在專案中加入 yarn.lock 檔案,系統會改用 Yarn。
  • 您可以在 package.json 檔案的 engines.yarn 欄位中,指定要使用的 Yarn 版本。
  • 如果專案包含 .yarn/cache,我們就會支援 Yarn2 PnP 模式。

使用 Pnpm

  • 在專案中加入 pnpm-lock.yaml 檔案時,系統會改用 Pnpm。
  • 您可以在 package.json 檔案的 engines.pnpm 欄位中指定 pnpm 版本。
  • 如需實際範例,請參閱 sample-node-pnpm 應用程式。

使用私人模組

您可以使用私人 npm 模組,方法是在函式目錄的 .npmrc 檔案中提供登錄檔驗證設定。如果您使用 Yarn 2 以上版本做為套件管理工具,這個檔案的名稱會是 .yarnrc.yml

Artifact Registry 中的私人模組

Artifact Registry Node.js 套件存放區可代管函式的私人模組。部署 Buildpacks 函式時,建構程序會自動為 Cloud Build 服務帳戶產生 Artifact Registry 憑證。使用 NPM 或 Yarn 1 版時,只需在 .npmrc 檔案中列出 Artifact Registry 存放區。舉例來說,使用 NPM 或 Yarn 1.x 版本時:

@SCOPE:registry=https://REGION_ID-npm.pkg.dev/PROJECT_ID/REPOSITORY_NAME
//REGION_ID-npm.pkg.dev/PROJECT_ID/REPOSITORY_NAME:always-auth=true

如果您使用的是 Yarn 2 以上版本,只需在 .yarnrc.yml 檔案中列出 Artifact Registry 存放區,無須額外提供憑證。例如:

npmScopes:
  SCOPE:
    npmRegistryServer: https://REGION_ID-npm.pkg.dev/PROJECT_ID/REPOSITORY_NAME
    npmAlwaysAuth: true

其他存放區的私人模組

npm 文件說明如何建立自訂唯讀存取憑證。在主目錄中建立的 .npmrc 檔案包含讀取/寫入憑證,因此我們不建議使用。部署期間不需要寫入權限,且這項權限可能會帶來安全風險。

.npmrc 檔案可能會增加函式的部署時間,因此如果您未使用私人存放區,請不要加入這個檔案。

檔案格式

如果您使用 .npmrc 檔案設定自訂驗證權杖,檔案應包含下列程式碼行。

//REGISTRY_DOMAIN/:_authToken=AUTH_TOKEN

取代:

  • REGISTRY_DOMAIN:私人 npm 登錄表的網域名稱。舉例來說,如果存放區主機為 npmjs.org,請將這個欄位設為 registry.npmjs.org
  • AUTH_TOKEN:npm 登錄的授權權杖。這可以是符記的文字常值或文字字串 ${NPM_TOKEN}npm 指令會將其替換為環境中的實際符記值。

    您可以將 --set-build-env-vars 引數設為 gcloud functions deploy 指令的 $NPM_TOKEN 環境變數。如要進一步瞭解 NPM 授權權杖,請參閱 NPM 私人模組教學課程

在部署期間執行自訂建構步驟

根據預設,如果 package.json 檔案中指定了指令碼,系統就會執行 npm run build。不過,您可以改為指定自訂建構步驟來覆寫預設行為,並只在建構期間執行所需的指令碼。您可以使用 package.json 檔案中的 GOOGLE_NODE_RUN_SCRIPTS 環境變數或 gcp-build 來控制建構步驟。

但請注意,GCDS 和 Google 管理控制台只能擇一使用。請注意,GOOGLE_NODE_RUN_SCRIPTS 環境變數具有優先順序,並會覆寫 gcp-buildpackage.json 中指定的任何內容。

根據預設,在您設定自訂建構步驟時,系統會先安裝 package.json 檔案中的 dependenciesdevDependencies,再執行任何指令碼或指令。如要覆寫預設行為,您可以使用 NODE_ENV 環境變數。

正在使用 GOOGLE_NODE_RUN_SCRIPTS

您可以將 GOOGLE_NODE_RUN_SCRIPTS 環境變數傳遞至建構作業,以控管要執行哪些指令碼。您可以指定一或多個指令碼,或者傳遞空白環境變數,以免預設行為 (例如 GOOGLE_NODE_RUN_SCRIPTS=) 執行。如需完整詳細資料,請參閱「環境變數」。

正在使用 package.json

package.json 檔案中新增 gcp-build 只會執行 npm run gcp-build,也就是會覆寫預設行為。您可以指定一或多個指令,也可以指定空字串,以防止執行任何指令,例如 "gcp-build":""

"scripts": {
  ...
  "gcp-build": "npm run lint && npm run build"
  ...
}

應用程式進入點

Node.js 建構包會執行 package.json scripts.start 欄位中指定的指令。如果未設定 scripts.start,Buildpack 會執行 npm start

建議您使用 Procfile,因為它會將 npmyarn 從路徑中移除。

環境變數

您可以設定環境變數來設定容器映像檔的建構作業

Node.js 建構包支援下列環境變數,可用於自訂容器。

NPM_CONFIG_<key>

請參閱說明文件

範例: NPM_CONFIG_FLAG=value-flag=value 傳遞至 npm 指令。

NODE_ENV

指定建構期間的開發環境;設定為 npm install

範例: NODE_ENV=development 會同時安裝 package.json 中指定的 dependenciesdevDependencies

GOOGLE_NODE_RUN_SCRIPTS

指定要從 package.json 執行的 npm 指令碼有序清單,以便在安裝依附元件後執行。清單必須以半形逗號分隔,並依照您列出每個指令碼的順序執行。

指定 GOOGLE_NODE_RUN_SCRIPTS 時,系統只會執行您列出的指令碼。舉例來說,如果您想避免預設 npm run build 執行,請指定不含值的環境變數。

範例:

  • GOOGLE_NODE_RUN_SCRIPTS=lint,build 會先執行 npm run lint,再執行 npm run build
  • GOOGLE_NODE_RUN_SCRIPTS= 不會執行任何指令碼。