Skip to content

Comments

Enhanced datapack configuration validation#120

Merged
WhiteElephant-abc merged 1 commit intomainfrom
opencode/issue114-20260124170615
Jan 24, 2026
Merged

Enhanced datapack configuration validation#120
WhiteElephant-abc merged 1 commit intomainfrom
opencode/issue114-20260124170615

Conversation

@opencode-agent
Copy link
Contributor

工作摘要

本次任务对 Bazel 构建系统的数据包配置验证功能进行了全面增强,主要实现了以下改进:

1. 新增 pack_id 命名空间格式验证

  • rule/datapack.bzl:209-262 新增 validate_pack_id() 函数和 _is_valid_pack_id() 辅助函数
  • 严格验证 Minecraft 命名空间 ID 格式:
    • 只能包含小写字母、数字、下划线、连字符和点
    • 不能以点、连字符或下划线开头或结尾
    • 不能包含连续的点
    • 长度在 1 到 255 个字符之间
  • 提供清晰的错误信息和有效示例

2. 增强 complete_datapack_config 宏的配置检查

rule/datapack.bzl:618-650complete_datapack_config 宏中新增多项验证:

  • 版本类型验证:确保 version_type 只能是 "release""beta""alpha"
  • 目标名称验证:验证 target_name 格式(如果提供),只允许字母、数字、下划线、连字符和点
  • 游戏版本验证:验证 game_versions 列表的有效性,检查每个版本是否在支持的版本列表中
  • Modrinth 项目 ID 验证:验证 modrinth_project_id 格式(如果提供),确保符合 Modrinth 平台规范

3. 维护现有兼容性

  • 所有现有数据包(如 stone-disappearanceauto-lucky-block 等)的构建均不受影响
  • 验证规则基于现有数据包的实际使用模式设计
  • 保持向后兼容,现有配置无需修改

4. 错误处理改进

  • 所有验证失败时都会调用 fail() 提供清晰的错误信息
  • 错误消息包含具体原因和有效示例,便于开发者快速定位问题
  • 在构建早期捕获配置错误,避免后续阶段出现难以调试的问题

技术实现特点

  • 模块化设计:验证函数独立且可复用
  • 防御性编程:对所有输入参数进行类型和格式检查
  • 用户友好:错误信息包含具体示例和修复建议
  • 性能优化:验证逻辑高效,不影响构建性能

本次增强显著提高了数据包配置的健壮性,帮助开发者在构建早期发现配置错误,减少因格式问题导致的构建失败,提升整体开发体验。

Closes #114

New%20session%20-%202026-01-24T17%3A06%3A15.143Z
opencode session  |  github run

添加 pack_id 命名空间格式验证,并提供更全面的配置检查:

- 新增 validate_pack_id 函数验证 Minecraft 命名空间 ID 格式
- 验证 version_type 必须是 'release', 'beta' 或 'alpha'
- 验证 target_name 格式(如果提供)
- 验证 game_versions 列表的有效性
- 验证 modrinth_project_id 格式(如果提供)

这些验证帮助在构建早期捕获配置错误,提高开发体验。
@WhiteElephant-abc
Copy link
Member

/oc 审查此pr并提供完整报告

@opencode-agent
Copy link
Contributor Author

PR 评审:Enhanced datapack configuration validation

本次评审针对 PR #114 中对数据包配置验证功能的增强。以下是对代码修改的详细分析和建议:

✅ 优点与亮点

  1. 全面的验证覆盖

    • 新增 validate_pack_id() 函数(rule/datapack.bzl:210-273),严格遵循 Minecraft 命名空间 ID 规范
    • complete_datapack_config 宏(rule/datapack.bzl:618-650)中增加了对 version_typetarget_namegame_versionsmodrinth_project_id 的验证
    • 所有验证在构建早期进行,有助于快速定位配置错误
  2. 良好的向后兼容性

    • 验证规则基于现有数据包的实际使用模式设计
    • 所有现有数据包(如 stone_disappearanceauto_lucky_blockdfl 等)的配置均能通过新验证
    • 保持现有 API 不变,无需修改现有配置
  3. 清晰的错误信息

    • 所有验证失败都提供具体的错误原因和有效示例
    • 中文错误信息符合项目惯例,便于开发者理解
  4. 模块化设计

    • 验证函数独立且可复用(如 validate_pack_id()validate_semver()
    • 防御性编程:对所有输入参数进行类型和格式检查

🔍 潜在问题与改进建议

  1. pack_id 验证的字符范围

    • 当前验证允许点(.),但 Minecraft 命名空间规范中点的使用可能存在歧义
    • 建议:明确文档说明 pack_id 中点的使用场景,或考虑是否应限制点仅用于类似 unif.logger 的第三方依赖场景
  2. target_name 验证的字符集

    • 当前验证允许大小写字母、数字、下划线、连字符和点
    • Bazel 目标名称实际允许更多字符(如斜杠用于包路径)
    • 建议:验证逻辑可能过于严格,但考虑到 target_name 默认使用包名称且现有项目均符合规则,当前实现可接受
  3. modrinth_project_id 长度限制

    • 当前设置为 1-64 字符,符合 Modrinth 平台规范
    • Modrinth 项目 ID 通常为 8 字符,但作为上限 64 字符是合理的
  4. 缺少对 modrinth_deps 参数的验证

    • 该参数为高级功能,用户可能提供错误格式的字典
    • 建议:可考虑添加基本结构验证,但非必需

🧪 兼容性验证

检查了所有现有数据包的 BUILD.bazel 文件:

  • 所有 pack_id 均使用下划线命名(如 stone_disappearanceauto_lucky_block
  • 所有版本号均符合 SemVer 规范
  • 所有 modrinth_project_id 均为 8 字符字母数字
  • 通过 bazelisk query 验证构建目标语法正确

📋 建议的后续优化

  1. 文档更新:在 CLAUDE.md 的"配置宏"部分补充新增的验证规则说明
  2. 测试覆盖:考虑添加 Bazel 测试规则验证各种边界情况
  3. 错误信息优化:对于 game_versions 验证,可提供更详细的版本列表参考

🎯 总体评价

这是一个高质量的增强,显著提升了数据包配置的健壮性。验证逻辑合理,错误信息清晰,保持了向后兼容性。建议 批准合并

推荐的操作

  • 合并当前 PR
  • 可选择性添加文档更新(非必需)
  • 监控后续数据包创建时的验证反馈

PR 代码质量良好,符合项目编码规范,为构建系统提供了重要的防御性检查机制。

New%20session%20-%202026-01-24T17%3A27%3A33.804Z
opencode session  |  github run

@WhiteElephant-abc WhiteElephant-abc merged commit 5fb6b90 into main Jan 24, 2026
8 checks passed
@WhiteElephant-abc WhiteElephant-abc deleted the opencode/issue114-20260124170615 branch January 24, 2026 17:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

bazel:增强配置验证

1 participant