Amplication contenteditable="false">【免费下载链接】amplicationAmplication brings order to the chaos of large-scale software development by creating Golden Paths for developers - streamlined workflows that drive consistency, enable high-quality code practices, simplify onboarding, and accelerate standardized delivery across teams.
项目地址: https://gitcode.com/GitHub_Trending/am/amplication
本文是 Amplication 仓库中data-service-generator-catalog服务(位于 packages/data-service-generator-catalog)的完整技术指南。它是一套由 Amplication 生成的后端服务组件,负责代码生成器的版本目录与发布管理,对外提供 REST/GraphQL API、认证授权、日志与数据库连接等能力。读完本文,你将掌握该服务的全部环境变量配置、本地开发与容器化启动流程,并能从源码层面理解其引导过程、模块组织与版本同步机制。
服务定位:代码生成器的"版本目录"
data-service-generator-catalog是 Amplication 生态中一个独立的 NestJS 服务。从 README.md 的说明来看,它承载着生成项目的服务端职责:REST API、GraphQL API、认证、授权、日志、数据校验以及数据库连接。
与仓库中的data-service-generator(负责实际生成代码)不同,catalog 服务的核心职责从源码结构中清晰可见——它维护着**代码生成器(Generator)与其版本(Version)**的目录关系:
- prisma/schema.prisma 中定义了
Generator与Version两个模型,Version通过generatorId外键关联到Generator,并以@@unique([name, generatorId])约束同一生成器下版本名的唯一性; - src/version/version.service.ts 实现了版本查询、排序、选取与 AWS ECR 同步的完整逻辑;
- src/generator 目录提供生成器资源的 CRUD 能力。
从源码结构看,该服务还通过 src/aws/aws-ecr.service.ts 直接对接 AWS ECR(Elastic Container Registry),把容器镜像仓库中的镜像标签同步为数据库中的版本记录,这使其成为生成器镜像发布与消费之间的"目录中枢"。
第一步:环境变量配置
服务配置通过环境变量提供,既可以注入到运行环境中,也可以通过服务根目录下的.env文件传入。README 指出:以下变量是生成后默认存在的变量,通过插件扩展时可能会引入额外变量;生成时已填充默认值,请按需修改。
| 变量 | 说明 | 默认值 |
|---|---|---|
| BCRYPT_SALT | 用于哈希的字符串 | [随机字符串] |
| COMPOSE_PROJECT_NAME | 服务标识符加前缀 | amp_[服务标识符] |
| PORT | 服务运行的端口 | 3000 |
| DB_URL | 数据库连接 URL | [db-provider]://[username]:[password]@localhost:[db-port]/[db-name] |
| DB_PORT | 数据库实例使用的端口 | [db-provider-port] |
| DB_USER | 连接数据库的用户名 | [username] |
| DB_PASSWORD | 连接数据库的密码 | [password] |
| DB_NAME | 数据库名称 | [service-name] / [project-name] |
| JWT_SECRET_KEY | 用于签名 JSON Web Token 的密钥 | [secret] |
| JWT_EXPIRATION | JSON Web Token 的过期时间 | 2d |
注意Amplication 会生成默认值并存储到
.env文件中。生产环境建议使用某种形式的密钥管理(secrets manager/vault)方案。
关键变量的源码级印证
- DB_URL:在 prisma/schema.prisma 中,数据源直接声明为
url = env("DB_URL"),即 Prisma Client 完全依赖该变量建立 PostgreSQL 连接,provider = "postgresql"。 - JWT_SECRET_KEY / JWT_EXPIRATION:src/constants.ts 定义了
JWT_SECRET_KEY_PROVIDER_NAME = "JWT_SECRET_KEY"与JWT_EXPIRATION = "JWT_EXPIRATION"两个常量名;src/auth/jwt/jwtSecretFactory.ts 目录下的工厂逻辑会从配置/密钥管理中读取该值用于签发与校验 JWT。 - PORT:src/main.ts 通过
const { PORT = 3000 } = process.env读取端口,缺省 3000;而 Dockerfile 中容器内则设置ENV PORT=3005并EXPOSE 3005,说明容器场景下端口会以构建配置为准。 - JWT_EXPIRATION默认
2d,即令牌默认有效期为两天,可按安全策略收紧或放宽。
其他可用的运行时配置
虽然不在 README 的默认表中,src/app.module.ts 显示服务还支持一组 GraphQL 相关环境变量:
GRAPHQL_SCHEMA_DEST:schema.graphql 输出路径,缺省为src/schema.graphql;GRAPHQL_DEBUG:设为"1"开启调试;PLAYGROUND_ENABLE:设为"1"同时开启 GraphQL Playground 与 introspection;DEV_VERSION_TAG:由 src/version/version.service.ts 读取,用于注入"最新开发版本"占位记录,在版本选择策略中拥有最高优先级。
第二步 1:脚本执行前的环境准备
配置完成后即可运行应用。运行服务端前,请先确认以下前置条件已满足:
- Node.js16.x 及以上
- npm
- Docker
前置环境就绪后,安装依赖并生成 Prisma Client:
# 安装依赖 $ npm install # 生成 prisma client $ npm run prisma:generateprisma:generate依据 prisma/schema.prisma 中的 generator 配置,将客户端输出到./generated-prisma-client,并声明了native、debian-openssl-1.1.x、linux-arm64-openssl-1.1.x多个二进制目标,兼顾本地与容器运行环境。
第二步 2:本地开发启动
# 启动服务将要连接的数据库 $ npm run docker:dev # 初始化数据库 $ npm run db:init # 启动服务端 $ npm run start默认情况下,应用自带一个初始用户:用户名为admin,密码为admin。
启动后的完整引导流程可以在 src/main.ts 中观察到:
- 通过
Tracing.init(来自@amplication/util/nestjs/tracing)初始化分布式追踪,服务名取自 src/constants.ts 的data-service-generator-catalog; NestFactory.create(AppModule, { cors: true })创建应用并开启 CORS;app.setGlobalPrefix("api")为所有 HTTP 路由统一添加/api前缀;- 注册全局
ValidationPipe(transform: true)负责请求数据校验与类型转换; - 生成 Swagger 文档,并对标记了
isPublic的路由去除安全声明(对应 src/decorators/public.decorator.ts),从而允许匿名访问公开接口; - 调用
connectMicroservices(src/connectMicroservices.ts)与startAllMicroservices启动微服务连接; - 在
swaggerPath挂载 Swagger UI,注册全局HttpExceptionFilter异常过滤器,最后app.listen(PORT)。
服务启动后同时暴露两类接口层:REST 控制器(如 src/version/version.controller.ts、src/generator/generator.controller.ts)与 GraphQL Resolver(如 src/version/version.resolver.ts),二者由 src/app.module.ts 统一装配,并叠加 src/auth/acl.module.ts 的访问控制(ACL)能力。
第二步 3:基于容器的开发启动
# 以 docker 容器方式启动服务端 $ npm run compose:up容器化路径对应的产物定义在 Dockerfile 中:
- 基于
node:18.13.0-slim镜像; - 仅复制
dist/packages/data-service-generator-catalog构建产物并执行npm install --production,只安装生产依赖; - 临时安装
openssl以满足 Prisma 运行需求; - 创建非特权用户(uid/gid 默认 1001)并以该用户运行,遵循最小权限原则;
- 容器内默认端口 3005,启动命令为
node ./main.js。
源码深挖:版本目录的幕后机制
版本选择策略
src/version/version.service.ts 的getCodeGeneratorVersion是目录服务的核心方法,支持三种由 @amplication/code-gen-types 定义的CodeGeneratorVersionStrategy:
- Specific:按指定版本号精确匹配,未命中或缺少
codeGeneratorVersion时抛出BadRequestException; - LatestMinor:解析出指定版本的主版本号,再在同主版本下挑选最新的次要版本(
getLatestMinorVersion),找不到时抛出错误; - LatestMajor(默认):直接返回活跃版本列表中的最新版本(
getLatestVersion)。
版本排序由sortVersions(src/version/version.service.ts)实现,它会剥离去掉v前缀,按点分数字逐段比较。若配置了DEV_VERSION_TAG,则开发版本优先于一切策略被返回。
与 AWS ECR 的版本同步
syncVersions(src/version/version.service.ts)展示了目录如何从镜像仓库刷新版本:
- 查询所有活跃生成器;
- 调用 src/aws/aws-ecr.service.ts 的
getTags,通过DescribeImagesCommand拉取镜像仓库中匹配正则/v\d+\.\d+\.\d+/的标签(默认仓库名为data-service-generator),并自动翻页; - 将新标签写入
Version表,把已不存在的旧版本标记为deletedAt、isActive: false、isDeprecated: true; - 全程通过
AmplicationLogger记录同步开始、成功与失败信息。
配合 src/aws/aws-ecr.service.ts 的getGeneratorImages(按generator-前缀枚举仓库),可以推断出:每个生成器镜像对应一个 ECR 仓库,其镜像标签即版本号,catalog 服务负责把"镜像即版本"的发布模型落库并提供给上层查询。
数据模型与健康检查
数据库模型非常精简,prisma/schema.prisma 仅包含三张表:
User:内置用户(username唯一、roles为 JSON),对应 README 中admin/admin的初始账号;Generator:生成器实体,fullName与name唯一,isActive默认false;Version:版本实体,isActive、isDeprecated、deletedAt等字段支撑上文提到的版本生命周期管理。
服务还提供了 src/health 健康检查模块(含 src/health/health.controller.ts 与其基础实现),用于探活与容器编排场景的就绪检测。
总结
data-service-generator-catalog的部署链路非常典型:环境变量(尤其是DB_URL与JWT_SECRET_KEY)决定运行时行为,npm install+prisma:generate完成依赖与客户端准备,docker:dev+db:init+start支撑本地开发,compose:up支撑容器化运行。而在表面配置之下,它通过 Prisma + NestJS 提供了生成器/版本目录的 CRUD 与查询 API,并通过 AWS ECR 同步机制把镜像标签自动转化为版本元数据,是 Amplication 代码生成流水线中连接镜像发布与版本消费的关键服务。
如需进一步深入,可以继续阅读同仓库中与其协作的 packages/data-service-generator(实际代码生成器)与 libs/util/code-gen-types(版本策略等类型定义)。
【免费下载链接】amplicationAmplication brings order to the chaos of large-scale software development by creating Golden Paths for developers - streamlined workflows that drive consistency, enable high-quality code practices, simplify onboarding, and accelerate standardized delivery across teams.项目地址: https://gitcode.com/GitHub_Trending/am/amplication
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考