运行自定义构建步骤

默认情况下,如果在 package.json 文件中检测到 build 脚本,则 node.js 运行时将执行 npm run build。如果您需要在启动应用之前对构建步骤进行额外的控制,则可以提供自定义构建步骤。您可以通过在 package.json 文件中添加 gcp-build 来执行自定义构建步骤。

如需阻止构建运行 npm run build 脚本,您必须执行以下操作之一:

  • package.json 文件中添加具有空值的 gcp-build 脚本:"gcp-build":""。如需详细了解如何配置 package.json,请参阅 Node.js Buildpack 配置
  • app.yaml 文件中添加具有空值的 GOOGLE_NODE_RUN_SCRIPTS 构建环境变量。

    build_env_variables:
      GOOGLE_NODE_RUN_SCRIPTS: ''
    
如需详细了解如何指定构建环境变量,请参阅 app.yaml 文件中的 build_env_variables 部分。

执行此脚本时,可以使用 package.json 文件的 dependenciesdevDependencies 字段中的依赖项。执行自定义构建步骤后,App Engine 仅安装 package.json 文件的 dependencies 字段中声明的生产依赖项,以移除并重新生成 node_modules 文件夹。

如需详细了解如何为自定义构建步骤配置运行时,请参阅在 Node.js Buildpack 部署期间执行自定义构建步骤

示例

自定义构建脚本可用于预处理任务,例如预处理 CSS、缩减客户端 JavaScript 大小或者运行工具(如 webpackgulp)。

例如,要将 TypeScript 编译为 JavaScript,您的 package.json 文件可能如下所示。请注意 gcp-build 脚本:

{
  "name": "appengine-typescript",
  "description": "An example TypeScript app running on Google App Engine.",
  "version": "0.0.1",
  "private": true,
  "license": "Apache Version 2.0",
  "author": "Google Inc.",
  "engines": {
    "node": "20.x"
  },
  "scripts": {
    "prepare": "npm run gcp-build",
    "pretest": "npm run gcp-build",
    "test": "c8 mocha -p -j 2 test/*.test.js --exit",
    "lint": "gts lint",
    "start": "node ./index.js",
    "deploy": "gcloud app deploy",
    "clean": "gts clean",
    "compile": "tsc -p .",
    "fix": "gts fix",
    "build": "tsc -p .",
    "gcp-build": "tsc -p ."
  },
  "dependencies": {
    "@typescript-eslint/parser": "^8.0.0",
    "express": "^4.16.3"
  },
  "devDependencies": {
    "@types/express": "^4.17.17",
    "@types/node": "^20.0.0",
    "c8": "^10.0.0",
    "chai": "^4.5.0",
    "gts": "^5.0.0",
    "mocha": "^10.2.0",
    "typescript": "^5.0.0",
    "wait-port": "^1.0.0"
  }
}

传送静态文件

在自定义构建步骤中生成或复制文件时,App Engine 不会使用 app.yaml 文件中定义的 static_dirstatic_files 元素直接从您的应用提供这些静态文件。但是,App Engine 会在运行自定义构建步骤之前将静态文件上传到标准环境中的服务基础设施。对自定义构建步骤期间生成或复制的文件的任何请求都会导致 404 NOT FOUND HTTP 错误。