Skip to content

fix(solaris): 修复 analyze --source-dir 不生效与重复 --package-name 的问题 - #15

Merged
Nattsu39 merged 1 commit into
SeerAPI:mainfrom
sekiwhat:fix/analyze-source-dir-and-dedupe
Sep 24, 2026
Merged

Nattsu39 merged 1 commit into
SeerAPI:mainfrom
sekiwhat:fix/analyze-source-dir-and-dedupe

Conversation

@sekiwhat

Copy link
Copy Markdown
Contributor

在真实管线里(用公开的 config-sources 仓库跑 solaris analyze 自产数据集)踩到两个问题,一并修复:

问题一:-w/--source-dir 不生效

DataSourceDirSettings 的四个分类目录(PATCH_DIR / HTML5_DIR / UNITY_DIR / FLASH_DIR)在类定义时按缺省 BASE_DIR(./source)固化,之后修改 BASE_DIR 不会传播:

settings = DataSourceDirSettings()
if source_dir:
    settings.BASE_DIR = Path(source_dir)  # 子目录仍是 source/unity 等旧值

因此 solaris analyze -w config-sources data 实际仍从 ./source 读数据(报 source\unity\xxx.json 不存在),只有 SOLARIS_DATA_UNITY_DIR 等逐目录环境变量有效,与 README「仅设置 SOLARIS_DATA_BASE_DIR 时各分类目录为 BASE_DIR/[patch|html5|unity|flash]」的描述不符。

修复:combine_dirs 校验器里,分类目录未被显式指定(环境变量或构造参数,用 model_fields_set 判断)时一律从当前 BASE_DIR 派生;CLI 改为构造时传 BASE_DIR=source_dir 而非构造后改属性。

问题二:重复 --package-name 导致误报「循环依赖」

import_all_classes 会递归导入子包,所以 pet 包自带 element_type、peak_pool、peak_cost 的分析器类;analyze 的 --package-name 逐包 extend 不去重,同一个类出现两次时 _topological_sort_analyzers 的 len(sorted) != len(analyzers) 判定失配,报出误导性的「无法完成拓扑排序,可能存在循环依赖」:

python -m solaris analyze \n  --package-name solaris.analyze.analyzers.pet \n  --package-name solaris.analyze.analyzers.skill \n  data
# solaris.analyze.AnalyzerDependencyError: 无法完成拓扑排序,可能存在循环依赖

修复:analyze 与 parse 均按类身份去重(parse 的重复虽不报错,但会让同一 parser 执行两次)。

测试

  • 新增 tests/analyze/test_data_source_settings.py(BASE_DIR 派生 / 缺省布局 / 显式子目录优先,含 SOLARIS_DATA_* 环境变量隔离)
  • 新增 tests/analyze/test_cli.py(有交集的双包 --list-analyzers 输出去重)
  • 本地 pytest 47 passed(原 43 + 新 4),ruff check / ruff format --check 对改动文件通过

顺带观察(未在本次修改)

analyze 组未开 invoke_without_command=True,所以不带子命令时 solaris analyze --list-analyzers 走不到分支、报 Missing command(README「查看帮助」一节有此用法示例)。如需要可后续单独处理。

问题一:-w/--source-dir 不生效。DataSourceDirSettings 的四个分类目录
(PATCH/HTML5/UNITY/FLASH)在类定义时按缺省 BASE_DIR 固化,构造后修改
BASE_DIR(-w/--source-dir 或 SOLARIS_DATA_BASE_DIR)不会传播,数据始终
从 ./source 读取。改为:分类目录未被显式指定(环境变量或构造参数)时
一律从当前 BASE_DIR 派生;CLI 改为构造时传入 BASE_DIR 而非构造后改属性。

问题二:--package-name 指定多个有交集的包时重复类导致拓扑排序误报
「循环依赖」。递归导入会让父包带上子包已有的分析器类(如 pet 包自带
element_type/peak_pool/peak_cost),CLI 逐包 extend 不去重,
_topological_sort_analyzers 按 len(sorted) != len(analyzers) 判定失败。
parse 命令同款模式虽不报错,但会让同一 parser 执行两次。均按类身份去重。

真实复现场景:用公开的 config-sources 仓库跑
solaris analyze -w config-sources data,需改用 SOLARIS_DATA_* 环境变量;
只跑 pet/skill 子包则触发问题二。
@Nattsu39
Nattsu39 merged commit de11d08 into SeerAPI:main Sep 24, 2026
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.

2 participants