This documentation is available as Markdown for AI agents and LLMs. See the full Markdown index or append .md to any documentation URL.

TypeScript 函数

编辑页面

了解如何在自定义构建配置中创建和使用 EAS Build 函数。


EAS Build 函数是扩展自定义构建功能的绝佳方式。你可以用它们来创建可复用的步骤,并使用 JavaScript、TypeScript 或 Bash 编写你的逻辑(更多信息请参见配置 schema 中的 command)。本指南将带你逐步创建一个 TypeScript 函数。

1

初始化一个 EAS Build 函数模块

创建 EAS Build 函数最简单的方法是使用 create-eas-build-function CLI 工具。在与你的 eas.json 文件相同的目录中运行以下命令,即可创建一个新的自定义 TypeScript 函数:

Terminal
npx create-eas-build-function@latest ./.eas/build/myFunction

这会在 .eas/build 目录中创建一个名为 myFunction 的新模块。该模块将包含一个预生成的模块配置,以及包含默认 TypeScript 函数模板的 src 目录和 index.ts 文件。

.eas/build/myFunction/src/index.ts
// 此文件由 `create-eas-build-function` 命令自动生成。 // 前往 README.md 了解更多关于如何编写你自己的自定义构建函数的信息。 import { BuildStepContext } from '@expo/steps'; // interface FunctionInputs { // // 在这里指定 inputs 值的类型以及它们是否必需 // // 示例:name: BuildStepInput<BuildStepInputValueTypeName.STRING, true>; // } // interface FunctionOutputs { // // 在这里指定函数输出以及它们是否必需 // // 示例:name: BuildStepOutput<true>; // } async function myFunction( ctx: BuildStepContext // { // inputs, // outputs, // env, // }: { // inputs: FunctionInputs; // outputs: FunctionOutputs; // env: BuildStepEnv; // } ): Promise<void> { ctx.logger.info('Hello from my TypeScript function!'); } export default myFunction;

2

编译函数

函数必须编译为一个可以在无需安装任何依赖的情况下运行的单个 JavaScript 文件。生成函数的默认 build 脚本使用 ncc 将你的函数编译为一个包含其所有依赖项的单文件。如果你的机器上没有全局安装 ncc,请运行 npm install -g @vercel/ncc 进行安装。接下来,在 .eas/build/myFunction 目录中运行构建脚本:

Terminal
npm run build

此命令会触发你的自定义函数模块的 package.json 文件中设置的 build 脚本。

package.json
{ ... "scripts": { ... "build": "ncc build ./src/index.ts -o build/ --minify --no-cache --no-source-map-register" ... }, ... }

build 脚本会生成 build/index.js。该文件必须作为你项目归档的一部分上传到 EAS Build,以便构建器可以运行你的函数。请确保该文件没有被 .gitignore 文件或 .easignore 文件排除。

3

在自定义构建配置中公开该函数

假设你在 .eas/build 目录中有一个 config.yml 文件。其内容如下:

.eas/build/config.yml
build: name: My example config steps: - eas/checkout - eas/install_node_modules - run: name: Finished command: echo Finished

要将函数添加到配置中,你需要向 config.yml 文件中添加以下几行:

.eas/build/config.yml
build: name: My example config steps: - eas/checkout - eas/install_node_modules - run: name: Finished command: echo Finished functions: my_function: name: My function path: ./myFunction

path 属性应该是从配置文件到你的函数目录的相对路径。在这个例子中,它就是 ./myFunction

现在,在 config.yml 文件中添加对 my_function 函数的调用:

.eas/build/config.yml
build: name: My example config steps: - eas/checkout - eas/install_node_modules - my_function - run: name: Finished command: echo Finished functions: my_function: name: My function path: ./myFunction

4

编写函数

作为一个更高级的示例,假设你想让一个函数计算两个数字的和,并将结果打印到控制台,然后从函数中输出该值。为此,修改 config.ymlindex.ts 文件,使函数接受两个名为 num1num2 的输入,并返回它们的和,作为名为 sum 的输出。

.eas/build/config.yml
build: name: My example config steps: - eas/checkout - eas/install_node_modules - my_function: inputs: num1: 1 num2: 2 id: sum_function - run: name: Print the sum inputs: sum: ${ steps.sum_function.sum } command: echo ${ inputs.sum } - run: name: Finished command: echo Finished functions: my_function: name: My function inputs: - name: num1 type: number - name: num2 type: number outputs: - name: sum path: ./myFunction
.eas/build/myFunction/src/index.ts
// 此文件由 `create-eas-build-function` 命令自动生成。 // 前往 README.md 了解更多关于如何编写你自己的自定义构建函数的信息。 import { BuildStepContext, BuildStepInput, BuildStepInputValueTypeName, BuildStepOutput, } from '@expo/steps'; interface FunctionInputs { // 第一个模板参数是输入值的类型,第二个模板参数是一个表示该输入是否必需的布尔值 num1: BuildStepInput<BuildStepInputValueTypeName.NUMBER, true>; num2: BuildStepInput<BuildStepInputValueTypeName.NUMBER, true>; } interface FunctionOutputs { // 模板参数是一个表示该输出是否必需的布尔值 sum: BuildStepOutput<true>; } async function myFunction( ctx: BuildStepContext, { inputs, outputs, }: // env, { inputs: FunctionInputs; outputs: FunctionOutputs; // env: BuildStepEnv; } ): Promise<void> { ctx.logger.info(`num1: ${inputs.num1.value}`); ctx.logger.info(`num2: ${inputs.num2.value}`); const sum = inputs.num1.value + inputs.num2.value; ctx.logger.info(`sum: ${sum}`); outputs.sum.set(sum.toString()); // 当前,outputs 必须是字符串。未来这会得到改进。 } export default myFunction;

总结

  • 编写函数是通过你自己的逻辑扩展自定义构建功能的绝佳方式。
  • EAS Build 函数是可复用的——你可以在多个自定义构建配置中使用它们。
  • 对于那些通过编写 shell 脚本不容易实现的更高级用例,使用 EAS Build 函数是个不错的选择。
  • 大多数内置函数都是开源的,你可以 fork 它们或将它们作为编写自己函数的参考。

查看示例仓库以获取更详细的示例:

自定义构建示例仓库

一个自定义 EAS Build 示例,包含自定义构建的示例,例如设置函数、使用环境变量、上传构件等。