TypeScript 函数

编辑页面

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


For the complete documentation index, see llms.txt. Use this Use this file to discover all available pages.

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.json 中进行了配置。如果没有,请在继续之前先查看开始使用自定义构建

假设你在 .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;

信息 每次你对函数进行更改后,都要重新编译它:npm run build

总结

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

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

自定义构建示例仓库

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