跳到主要内容

Deployer

Deployer 通过打包代码、管理环境文件以及使用 Hono 框架提供应用,处理独立 Mastra 应用的部署。具体实现必须为特定部署目标定义 deploy 方法。

使用示例
使用示例的直接链接

要创建自定义 deployer,可以扩展抽象 Deployer 类,并使用你的特定部署逻辑实现 deploy 方法。示例如下:

import { Deployer } from '@mastra/deployer'

class CustomDeployer extends Deployer {
constructor() {
super({ name: 'custom-deployer' })
}

async deploy(outputDirectory: string): Promise<void> {
// Prepare the output directory
await this.prepare(outputDirectory)

// Bundle the application
await this._bundle('server.ts', 'mastra.ts', outputDirectory)

// Custom deployment logic
}
}

参数
参数的直接链接

构造函数参数
构造函数参数的直接链接

args:

object
Deployer 的配置选项。

args.name:

string
deployer 实例的唯一名称。

deploy 参数
deploy 参数的直接链接

outputDirectory:

string
输出已打包且可部署应用的目录。

方法
方法的直接链接

getEnvFiles:

() => Promise<string[]>
返回部署期间使用的环境文件列表。默认查找 '.env.production' 和 '.env' 文件。

deploy:

(outputDirectory: string) => Promise<void>
必须由子类实现的抽象方法。处理到指定输出目录的部署过程。

从 bundler 继承的方法
从 bundler 继承的方法的直接链接

Deployer 类从 Bundler 类继承以下关键方法:

prepare:

(outputDirectory: string) => Promise<void>
通过清理输出目录并创建必要的子目录来准备输出目录。

writePackageJson:

(outputDirectory: string, dependencies: Map<string, string>) => Promise<void>
使用指定依赖在输出目录中生成 package.json 文件。

_bundle:

(serverFile: string, mastraEntryFile: string, outputDirectory: string, bundleLocation?: string) => Promise<void>
使用指定的服务器文件和 Mastra 入口文件打包应用。

核心概念
核心概念的直接链接

部署生命周期
部署生命周期的直接链接

Deployer 抽象类实现了结构化的部署生命周期:

  1. 初始化:使用名称初始化 deployer,并创建用于依赖管理的 Deps 实例。
  2. 环境设置getEnvFiles 方法识别部署期间要使用的环境文件(.env.production、.env)。
  3. 准备prepare 方法(继承自 Bundler)清理输出目录并创建必要的子目录。
  4. 打包_bundle 方法(继承自 Bundler)打包应用代码及其依赖。
  5. 部署:由子类实现抽象 deploy 方法,以处理实际部署过程。

环境文件管理
环境文件管理的直接链接

Deployer 类通过 getEnvFiles 方法内置了环境文件管理支持。该方法:

  • 按预定义顺序查找环境文件(.env.production、.env)
  • 使用 FileService 查找第一个存在的文件
  • 返回找到的环境文件数组
  • 如果未找到环境文件,则返回空数组
getEnvFiles(): Promise<string[]> {
const possibleFiles = ['.env.production', '.env.local', '.env'];

try {
const fileService = new FileService();
const envFile = fileService.getFirstExistingFile(possibleFiles);

return Promise.resolve([envFile]);
} catch {}

return Promise.resolve([]);
}

打包与部署的关系
打包与部署的关系的直接链接

Deployer 类扩展了 Bundler 类,在打包与部署之间建立了明确的关系:

  1. 打包是前置条件:打包是部署的前置步骤,会将应用代码封装为可部署格式。
  2. 共享基础设施:打包与部署共享依赖管理和文件系统操作等通用基础设施。
  3. 专用部署逻辑:打包侧重于封装代码,而部署会添加面向具体环境的逻辑来部署已打包的代码。
  4. 可扩展性:抽象 deploy 方法支持为不同目标环境创建专用 deployer。