执行自定义构建步骤

默认情况下,如果在 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": "16.x.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": "^6.0.0",
    "express": "^4.16.3"
  },
  "devDependencies": {
    "@types/express": "^4.17.17",
    "@types/node": "^18.13.0",
    "c8": "^8.0.0",
    "chai": "^4.3.7",
    "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 错误。