progen 是一个离线、单二进制分发的 Go 命令行工具(https://github.com/sivaprasadreddy/progen),用于脚手架生成一个完整、可直接投产的 Spring Boot 项目,包含构建文件、Java 源码、测试、Docker Compose、GitHub Actions、数据库迁移、安全配置等。
本技能的目标:把用户对目标应用的描述转化为 .progen.json 配置,补全缺失信息(必要时向用户提问),运行 progen 生成项目;如果用户要求了 progen 原生不支持的功能,则在生成之后再通过编辑生成代码叠加实现。
一、确认 progen 可用
先检查二进制是否可用:
progen --version
如果未找到(或版本过旧而用户想要最新版),从最新 release 下载对应当前操作系统/架构的资源:
以 macOS arm64 为例 —— 根据 uname -s / uname -m 调整 OS/ARCH
curl -L -o progen.tar.gz
"https://github.com/sivaprasadreddy/progen/releases/latest/download/progen_<os>_<arch>.tar.gz"
tar -xzf progen.tar.gz
chmod +x progen
sudo mv progen /usr/local/bin/ # 或任意位于 PATH 的目录
progen --version
如果资源文件命名不明确,先访问 releases 页面(https://github.com/sivaprasadreddy/progen/releases)确认对应用户操作系统/架构的正确文件名再下载。如果本机有 Go 工具链,也可用 go install github.com/sivaprasadreddy/progen@latest,完全避开资源命名问题。
在 macOS 上,下载的二进制可能触发 Gatekeeper 的“无法打开,因为无法验证开发者”提示——应告知用户在 Finder 中右键 → 打开一次以批准(如果不介意非交互方式,也可用 xattr -d com.apple.quarantine progen)。
二、配置结构(.progen.json)
progen 不通过命令行参数接收脚手架信息——所有内容都通过 JSON 配置文件传入,以 progen -c <file> 消费(交互式提示是唯一的其他输入途径,本技能不使用)。下表的字段名与序列化为 JSON 时完全一致(Go 字段名,首字母大写)。
字段 / 类型与取值 / 默认值 / 是否必填
AppName / string(用作输出目录名)/ myapp / 是——无法推导时询问
GroupID / string,如 com.mycompany / com.mycompany / 是——无法推导时询问
ArtifactID / string,如 boot-demo / myapp / 是——无法推导时询问
AppVersion / string,如 1.0.0 / 1.0.0 / 否
BasePackage / string,如 com.mycompany.myapp / 由 GroupID+ArtifactID 推导 / 否
AppType / "REST API" | "Web App" | "Spring Boot + Angular Full Stack" / "REST API" / 否(但会影响许多其他选择)
BuildTool / "Maven" | "Gradle" / "Maven" / 否
PersistenceType / "Spring Data JPA" | "Spring JdbcClient" | "jOOQ" / "Spring Data JPA" / 否
DbType / "PostgreSQL" | "MySQL" | "MariaDB" / "PostgreSQL" / 否
DbMigrationTool / "Flyway" | "Liquibase" / "Flyway" / 否
SpringCloudAWSSupport / bool / false / 否
ThymeleafSupport / bool —— AppType 为 "Web App" 时自动设为 true;其他情况保持 false / false / 否(不要询问;由 AppType 推导)
HTMXSupport / bool —— 仅在 AppType 为 "Web App" 时有意义 / false / 否
EmailSupport / bool / false / 否
RabbitMQSupport / bool / false / 否
RedisCachingSupport / bool / false / 否
OpenTelemetrySupport / bool / false / 否
K8sSupport / bool —— 生成 Kubernetes 清单 / false / 否
说明:
Spring Modulith 包结构、Docker Compose、Testcontainers、JUnit、Spotless、SDKMAN、GitHub Actions、Renovate 以及 .editorconfig/AI 助手配置文件始终会生成——没有开关。
"Spring Boot + Angular Full Stack" 还会额外生成 Angular + TailwindCSS 前端;HTMXSupport 和 ThymeleafSupport 对它不适用。
随时可用 progen init 获取一份全新的默认值副本,它会在当前目录写入一个预填上述默认值的 .progen.json。
三、从用户描述推导配置
读取用户描述并映射到上述字段:
应用/构件标识:寻找明确名称、公司/组织(→ GroupID),或仓库风格 slug(→ ArtifactID、AppName)。如果确实缺失,这些是必填项——需询问(见第四步)。
应用类型:"API"、"backend"、"microservice" → RestApi。"website"、"server-rendered pages"、"HTMX" → WebApp(若提到 HTMX 则设置 HTMXSupport)。"Angular"、"SPA"、"single page app" → SpringBootAngularFullStack。
构建工具:明确提到 "Maven"/"Gradle" → 使用它;否则默认 Maven。
持久化:"JPA"/"Hibernate" → SpringDataJPA;"JdbcClient"/"plain JDBC"/"no ORM" → SpringJdbcClient;"jOOQ" → SpringJOOQ。
数据库:"Postgres" → PostgreSQL;"MySQL" → MySQL;"MariaDB" → MariaDB。
迁移:"Flyway" 或未指定 → Flyway;"Liquibase" → Liquibase。
功能关键词 → 布尔值:
AWS/S3/SQS/Cloud → SpringCloudAWSSupport;
email/SMTP/notifications → EmailSupport;
RabbitMQ/messaging/queue → RabbitMQSupport;
caching/Redis → RedisCachingSupport;
tracing/observability/OpenTelemetry → OpenTelemetrySupport;
Kubernetes/k8s/Helm-adjacent manifests → K8sSupport。
未提及的内容:保留默认值而不是询问——只有第四步中的标识字段值得打断用户。
四、询问缺失的必填信息
只有当 AppName、GroupID 或 ArtifactID 无法从描述中合理推导时才暂停询问(progen 自身的提示流程将这三个视为必填;其他字段都有合理默认值)。简洁地问,例如:
应用/构件应该叫什么,group id 是什么(例如 com.acme)?
不要询问 AppType、BuildTool、PersistenceType、DbType、DbMigrationTool 或功能布尔值——应用第三步的映射,静默回退到默认值。
五、生成项目
将推导出的配置写入 .progen.json 文件,然后以非交互方式运行 progen:
cat > .progen.json <<'EOF' { "AppType": "REST API", "AppName": "orders-service", "GroupID": "com.acme", "ArtifactID": "orders-service", "AppVersion": "1.0.0", "BasePackage": "com.acme.ordersservice", "BuildTool": "Maven", "PersistenceType": "Spring Data JPA", "DbType": "PostgreSQL", "DbMigrationTool": "Flyway", "SpringCloudAWSSupport": false, "ThymeleafSupport": false, "HTMXSupport": false, "EmailSupport": false, "RabbitMQSupport": false, "RedisCachingSupport": false, "OpenTelemetrySupport": false, "K8sSupport": false } EOF progen -c .progen.json
这会在以 AppName 命名的新目录中创建生成的项目(并把解析后的配置副本写入 <AppName>/.progen.json)。任何无效的枚举值都会被替换为默认值并打印 WARNING: ——请检查命令输出中的这些提示。
六、progen 不支持的功能
progen 只认识第二步表格中的字段。如果用户要求了列表之外的东西(例如 GraphQL、超出 Spring Cloud AWS 之外的特定云厂商集成、特定认证提供商、gRPC、未列出的数据库、GitHub Actions 以外的 CI 平台):
先用第三步至第五步中最接近的配置生成基础项目。
然后通过手工编辑生成的项目来添加额外功能——从此把它当作普通的 Spring Boot 代码库(遵循其既有约定:BasePackage 下的包布局、所选的持久化/构建工具、既有测试设置等)。
不要因为等待不支持功能的设计决策而阻塞项目生成——先脚手架,再叠加自定义功能。