
Prisma 服务配置指南深入解析 prisma.yml 的完整结构与变量机制【免费下载链接】prisma1 Database Tools incl. ORM, Migrations and Admin UI (Postgres, MySQL MongoDB) [deprecated]项目地址: https://gitcode.com/gh_mirrors/pr/prisma1导读prisma.yml是每个 Prisma 服务的核心配置文件它集中声明了服务的 data model 路径、API endpoint、认证 secret、订阅 webhook、数据填充seed、部署钩子hooks等全部组件。本指南基于 Prisma 1.x 文档中 Service Configuration 的prisma.yml章节Overview 与完整示例、YAML 结构详解并结合仓库内prisma-yml包的源码实现带你掌握prisma.yml每个根属性的类型约束、真实示例、变量引用机制以及它们如何在prisma deploy时被解析和执行。一个完整的 prisma.yml 示例每个 Prisma 服务都由多个可配置组件组成API endpoint、服务的数据模型data model、部署与认证信息、订阅 webhook 的配置等。这些组件全部定义在服务配置文件prisma.yml中。以下是一个完整的服务定义示例# REQUIRED # 该服务基于 database/types.graphql 与 database/enums.graphql 两个文件中的类型定义 datamodel: - database/types.graphql - database/enums.graphql # OPTIONAL # endpoint 表示 Prisma API 的 HTTP 端点它编码了以下信息 # * Prisma server本例为 localhost:4466 # * 服务名称本例为 myservice # * Stage本例为 dev # 注意当服务名和 stage 都为 default 时它们可以省略 # 即 http://myserver.com/default/default 可写作 http://myserver.com endpoint: http://localhost:4466/myservice/dev # OPTIONAL # secret 用于签发 JSON Web TokenJWT。调用 Prisma endpoint 的 HTTP 请求 # 需要在 Authorization 请求头中携带该 token。 # 警告如果不提供 secretPrisma API 将可以被无认证访问 secret: mysecret123 # OPTIONAL # post-deploy 钩子先下载 .graphqlconfig 中配置的 endpoint 的 GraphQL schema # 然后执行代码生成流程 hooks: post-deploy: - graphql get-schema --project db - graphql prepare # OPTIONAL # 该服务配置了一个事件订阅对应查询文件位于 # database/subscriptions/welcomeEmail.graphql。 # 当订阅事件触发时指定的 webhook 会通过 HTTP 被调用。 subscriptions: sendWelcomeEmail: query: database/subscriptions/sendWelcomeEmail.graphql webhook: url: https://${self:custom.serverlessEndpoint}/sendWelcomeEmail headers: Authorization: ${env:MY_ENDPOINT_SECRET} # OPTIONAL # 指向一个 .graphql 文件其中包含首次部署服务时要执行的 GraphQL 操作 seed: import: database/seed.graphql # OPTIONAL # 该服务只定义了一个自定义变量被上方 subscription 的 webhook 引用 custom: serverlessEndpoint: https://bcdeaxokbj.execute-api.eu-west-1.amazonaws.com/dev以上服务定义期望的目录结构如下. ├── prisma.yml ├── database │ ├── subscriptions │ │ └── welcomeEmail.graphql │ ├── types.graphql │ └── enums.graphql └── schemas └── prisma.graphqlprisma.yml 的根属性总览prisma.yml的根属性如下属性必填作用datamodel是数据库模型、关系、枚举及其他类型的类型定义文件endpoint否Prisma API 的 HTTP endpoint省略时会触发 CLI 的部署向导secret否用于保护 API endpoint 的密钥schema否Prisma API 的 GraphQL schema 路径subscriptions否订阅 webhook 的配置seed否指向包含数据填充 mutation 的文件custom否提供可在 prisma.yml 其他位置引用的变量hooks否定义 Prisma CLI 在特定动作前后执行的命令从源码实现看prisma-yml包中的 PrismaDefinition.ts 是解析这份 YAML 的核心类它通过readDefinition读取并校验文件然后暴露endpoint、service、stage、cluster、secrets、typesString等 getter 供 CLI 上层命令使用。HookType在源码中被定义为post-deploy即当前唯一支持的钩子类型。datamodel必填数据模型定义datamodel指向一个或多个包含 GraphQL SDLSchema Definition Language类型定义的.graphql文件。如果提供了多个文件CLI 在部署时会直接将它们的内容拼接起来。类型约束datamodel接受字符串或字符串列表。示例——数据模型定义在单个文件types.graphql中datamodel: types.graphql示例——数据模型分布在types.graphql与enums.graphql两个文件中部署时 CLI 会将二者内容拼接datamodel: - types.graphql - enums.graphql源码印证在 PrismaDefinition.ts 的getTypesString方法中datamodel会被统一规范为数组随后逐个拼接文件路径、读取内容并追加到allTypes字符串中若某个类型定义文件不存在会直接抛出The types definition file ... could not be found错误。这也解释了为什么多文件datamodel的拼接语义由 CLI 保证。endpoint可选编码服务器、服务名与 Stageendpoint是 Prisma API 的 HTTP 端点由以下组件构成Prisma server承载 Prisma API 的服务器Workspace仅 Prisma Cloud在 Prisma Cloud 中配置的 Workspace 名称Service namePrisma API 的描述性名称Stage集群的开发阶段如dev、staging、prod注意endpoint实际是部署 Prisma API 所必需的。但如果你在运行prisma deploy前没有在prisma.yml中指定它CLI 会启动一个向导通过几个提问把endpoint自动写入prisma.yml。类型约束endpoint接受字符串。示例 1——本地 Docker 部署localhost:4466表示用 Docker 在本地 4466 端口部署endpoint: http://localhost:4466/default/default当服务名和 stage 均为default时可以省略Prisma 会自动推断因此上述端点等价于http://localhost:4466/。示例 2——Prisma Sandbox 部署endpoint: https://eu1.prisma.sh/public-helixgoose-752/myservice/dev这里eu1.prisma.sh是 Prisma Sandbox 服务器public-helixgoose-752是标识 Sandbox 所属 Prisma Cloud workspace 的随机字符串服务名myservicestage 为dev。示例 3——自定义服务器部署endpoint: http://my-pr-Publi-1GXX8QUZU3T89-413349553.us-east-1.elb.amazonaws.com/cat-pictures/prod源码印证endpoint 的解析逻辑位于 parseEndpoint.ts通过new URL(endpoint)解析出 host 与 pathname按/分段提取 service、stage 与 workspaceSluglocalhost、127.0.0.1、prisma被识别为本地localeu1.prisma.sh、us1.prisma.sh被识别为共享 demo 集群shared其余非本地 host 则视为私有集群isPrivate。同时 PrismaDefinition.ts 的validate方法要求 endpoint 必须以http://或https://开头否则报错。secret可选认证与 JWT 签发secret用于生成签名认证令牌JWT。调用 Prisma API 的 HTTP 请求必须在Authorization请求头中携带该令牌。secret 必须满足以下要求必须为 utf8 编码不能包含空格长度最多 256 个字符注意可以在该字符串中编码多个 secret从而实现平滑的密钥轮换。警告如果 Prisma API 在没有secret的情况下部署则不需要任何认证。这意味着任何能访问endpoint的人都能发送任意的 query 和 mutation从而读写数据库类型约束secret接受字符串不是字符串列表。若要指定多个 secret需以逗号分隔的列表形式提供空格会被忽略但仍作为单个字符串值。示例——定义单个 secretsecret: moo4ahn3ahb4phein1eingaep示例——定义三个 secret第二个 secret 前的空格会被忽略secret: myFirstSecret, SECRET_NUMBER_2,3rd-secret示例——从环境变量MY_SECRET读取 secretsecret: ${env:MY_SECRET}源码印证在 PrismaDefinition.ts 中secret 被解析为secrets.replace(/\s/g, ).split(,)——先去除所有空白字符再按逗号切分与文档中逗号分隔、空格忽略的描述完全一致。getToken方法使用第一个 secret 通过jwt.sign签发包含service: servicestage与roles: [admin]负载的令牌有效期 7 天。subscriptions可选订阅 webhook 配置subscriptions用于定义服务的所有订阅 webhook。一个订阅需要至少两类信息subscription query定义在何种事件下应调用函数、payload 长什么样webhook 的 URL事件发生时通过 HTTP 调用的地址可选随请求发送到该 URL 的一组 HTTP headers类型约束subscriptions接受对象包含以下属性query必填订阅查询文件的路径webhook必填被调用 webhook 的信息URL 与可选 HTTP headers。如果没有 headers可以直接把 URL 字符串赋给该属性见示例 1否则webhook需要是一个包含url与headers的对象见示例 2示例——不带 HTTP headers 的事件订阅subscriptions: sendWelcomeEmail: query: database/subscriptions/sendWelcomeEmail.graphql webhook: https://bcdeaxokbj.execute-api.eu-west-1.amazonaws.com/dev/sendWelcomeEmail示例——带两个 HTTP headers 的事件订阅subscriptions: sendWelcomeEmail: query: database/subscriptions/sendWelcomeEmail.graphql webhook: url: https://bcdeaxokbj.execute-api.eu-west-1.amazonaws.com/dev/sendWelcomeEmail headers: Authorization: ${env:MY_ENDPOINT_SECRET} Content-Type: application/json源码印证PrismaDefinition.ts 的getSubscriptions方法展示了订阅在部署时如何被解析当webhook为字符串时直接作为 url、headers 为空为对象时提取url并通过transformHeaders把 headers 对象转换为键值对数组。订阅查询若以.graphql结尾则读取该文件的真实内容作为 query文件不存在时会抛出明确错误。seed可选数据填充数据库种子填充seeding是一种用测试数据填充服务的标准化方式。类型约束seed接受对象包含以下两个子属性之一import导入数据以填充服务支持两类文件一个包含 GraphQL 操作的.graphql文件路径一个包含 Normalized Data Format (NDF) 数据集的.zip文件路径run填充服务时要执行的 shell 命令用于import无法覆盖的更复杂填充场景Seeds 会在服务首次部署时隐式执行除非使用--no-seed标志显式禁用。示例——引用包含填充 mutation 的.graphql文件seed: import: database/seed.graphql示例——引用 NDF 格式数据集的.zip文件seed: import: database/backup.zip示例——通过 Node 脚本执行填充seed: run: node script.js源码印证在 deploy.ts 中可以看到 seed 的完整执行链路deploy命令通过--no-seed标志描述为 Disable seed on initial service deploy控制是否执行 seed部署逻辑会读取seed.import或seed.run作为 seedSource两者都不存在时抛出 Invalid seed property inprisma.yml. Please useimportorrununder theseedproperty. 错误随后创建Seeder实例执行填充。custom可选自定义变量custom允许你指定任何希望在prisma.yml其他位置复用的值因此它没有预定义的结构。可以使用self变量源引用这些值例如${self:custom.myVariable}。类型约束custom接受对象对对象的形状没有任何假设。示例——定义两个自定义值并在事件订阅中复用custom: serverlessEndpoint: https://bcdeaxokbj.execute-api.eu-west-1.amazonaws.com/dev subscriptionQueries: database/subscriptions/ subscriptions: sendWelcomeEmail: query: ${self:custom.subscriptionQueries}/sendWelcomeEmail.graphql webhook: https://${self:custom.serverlessEndpoint}/sendWelcomeEmailhooks可选部署前后的 CLI 钩子hooks用于定义 Prisma CLI 在某些命令之前或之后执行的终端命令。目前可用的钩子post-deploy在prisma deploy命令之后被调用类型约束hooks接受对象属性名对应当前可用的钩子名。示例——在prisma deploy后依次执行三个任务打印 Deployment finished、下载.graphqlconfig.yml中db项目的 GraphQL schema、按.graphqlconfig.yml的配置触发代码生成hooks: post-deploy: - echo Deployment finished - graphql get-schema --project db - graphql prepare该示例假设存在一个类似的.graphqlconfig.ymlprojects: prisma: schemaPath: generated/prisma.graphql extensions: prisma: prisma.yml prepare-binding: output: generated/prisma.ts generator: prisma-ts源码印证PrismaDefinition.ts 的getHooks方法要求 hook 值必须是字符串或字符串数组否则报 Hook post-deploy provided in prisma.yml must be string or an array of strings并把单个字符串规范为单元素数组返回deploy.ts 在部署完成后遍历执行这些命令并打印post-deploy:标记。在 prisma.yml 中使用变量变量允许你在服务定义文件中动态替换配置值。它们在提供服务secrets以及多 stage 开发工作流中尤其有用。要在prisma.yml中使用变量需要用${}包裹引用值yamlKeyXYZ: ${variableSource} # 见下方当前变量源列表 # 第二个参数为默认值 otherYamlKey: ${variableSource, defaultValue}变量源可以是以下三种之一对同一服务内其他值的递归自引用recursive self-reference环境变量environment variable命令行选项option from the command line注意你只能在属性值中使用变量不能在属性键中使用。因此例如无法在 custom resources 部分用变量生成动态逻辑 ID。递归自引用self你可以递归引用prisma.yml中其他属性的值。使用自引用变量时方括号内的值由以下部分组成前缀self:可选被引用属性的_路径_如果未指定路径变量的值将是整个 YAML 文件。subscriptions: sendWelcomeEmail: query: database/subscriptions/sendWelcomeEmail.graphql webhook: url: https://${self:custom.serverlessEndpoint}/sendWelcomeEmail custom: serverlessEndpoint: example.org这对prisma.yml内的任何属性都有效不仅限于custom。源码印证Variables.ts 完整实现了这套变量引擎variableSyntax正则负责匹配${...}表达式getValueFromSelf按点号路径递归查找 JSON 中的深层值getValueFromEnv从process.env或自定义 envVars读取环境变量getValueFromOptions读取命令行参数opt:前缀。特别地populateProperty对替换后的字符串还会递归再次展开因此支持${self:custom.a}/x/${env:B}这类嵌套引用当引用的值缺失时warnIfNotFound会给出 A valid environment variable / option / self reference to satisfy the declaration ... could not be found 的警告。环境变量env你可以在服务定义文件中引用环境变量。使用环境变量时方括号内的值由以下部分组成前缀env:环境变量的_名称_下面示例通过环境变量指定 webhook 的 URL 与认证 tokensubscriptions: sendWelcomeEmail: query: database/subscriptions/sendWelcomeEmail.graphql webhook: url: https://example.org/sendWelcomeEmail headers: Authorization: ${env:MY_ENDPOINT_SECRET}源码印证PrismaDefinition.ts 的load方法会在解析前调用dotenv.config加载.env文件可通过--env-file指定路径因此环境变量既来自系统环境也来自项目中的.env文件。工具链集成prisma.yml 的自动补全与校验如果你希望在编写prisma.yml时获得自动补全以及在部署服务前进行静态错误检查可以使用 JSON Schema对应 schema 定义在 prisma-json-schema 相关实现中仓库内prisma-yml的类型定义即导入自prisma-json-schema。不过目前该体验仅适用于 VSCode。第 1 步下载并安装 redhat 的 vs-code-yaml 插件。第 2 步在用户与工作区设置中添加以下内容yaml.schemas: { http://json.schemastore.org/prisma: prisma.yml }第 3 步在prisma.yml文件中用常用快捷键默认为Ctrl Space触发智能提示。此时应显示所有可用字段及其描述如果出现任何错误VSCode 会立即捕获。类型约束的工程意义prisma-yml的 types/rc.ts 与 types/common.ts 从prisma-json-schema导入PrismaDefinition等类型这正是上述 JSON Schema 校验在 CLI 层面的对应实现——IDE 静态校验与 CLI 运行时校验共用同一份 schema 定义保证了配置编写与部署执行的一致性。总结prisma.yml以单一 YAML 文件承载了 Prisma 服务的全部声明式配置datamodel定义数据结构、endpoint定位 API、secret提供认证、subscriptions连接事件与 webhook、seed初始化数据、hooks串起部署后自动化流程而custom与变量机制让配置可以动态组装、跨环境复用。通过对照prisma-yml包PrismaDefinition.ts、Variables.ts、parseEndpoint.ts与 deploy.ts 的源码可以看到文档中的每一条规则——从 secret 的逗号拆分、多文件 datamodel 拼接、endpoint 的 local/shared/private 判定到 seed 与 post-deploy 钩子的执行时序——都在 CLI 实现中被严格遵循。这份配置文件既是服务的说明书也是 Prisma 部署流水线的第一道关卡。【免费下载链接】prisma1 Database Tools incl. ORM, Migrations and Admin UI (Postgres, MySQL MongoDB) [deprecated]项目地址: https://gitcode.com/gh_mirrors/pr/prisma1创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考