ci(windows): 实测 akshare 可行性,推翻「硬阻塞点」假设

## 假设被推翻

迁移计划曾把 akshare 的 py_mini_racer(62MB V8 预编译)列为「唯一硬阻塞点」,
理由是 Windows + cp312 是否有 wheel 未验证。

2026-10-26 用 uv 做离线解析(无需 Windows 机器):

    uv pip install --python-platform windows --python-version 3.12 --dry-run akshare
    → 解析成功,mini-racer==0.14.1,与本机 macOS 上的版本完全一致
    → pandas/numpy 仅小版本差异(3.1.0/2.5.4 vs 本机 3.0.3/2.4.6)

## 但「能装」不等于「能跑」

V8 原生库在 win32 上能否真正加载并执行 JS 必须实测。故选在观察期的
windows job 里加三步实测(各自 continue-on-error,避免装不上时中断后续步骤):

1. 安装 akshare
2. 验证 py_mini_racer 可执行 JS(ctx.eval('1+1') == 2)
3. 跑 Services/akshare_fetcher/tests

## 一个必须写死的命名陷阱

PyPI 包名是 mini-racer,但**顶层模块名仍是 py_mini_racer**
(akshare 源码里全是 import py_mini_racer)。写成 import mini_racer 会
ModuleNotFoundError,从而误判为「Windows 装不上」。

本机已验证正确写法:import py_mini_racer → ctx.eval('1+1') == 2,
akshare 1.18.64 及其依赖 mini-racer 的模块均可正常导入。

首次 CI 反馈后:若三步全绿,可去掉 continue-on-error,并考虑把 tushare
一并纳入 Windows 范围。
This commit is contained in:
FinDataHub committed 2026-10-26 21:07:59 +08:00
1 parent 649085ab3b
commit 21606708d0
1 file changed
+31
+31
View File
@@ -204,3 +204,34 @@ jobs:
- name: SDK 测试
run: python -m pytest Services/findatahub-client/tests -q
# ── akshare 可行性实测 ──────────────────────────────────
#
# 迁移计划曾把 akshare 的 py_mini_racer(62MB V8 预编译)列为「唯一硬阻塞点」,
# 理由是"Windows 上是否有 cp312 wheel 未验证"。
#
# 2026-10-26 用 uv 做离线解析,结论是**可以**:
# uv pip install --python-platform windows --python-version 3.12 --dry-run akshare
# → 解析成功,其中 mini-racer==0.14.1,与本机 macOS 上的版本完全一致
# (pandas/numpy 仅小版本差异:CI 3.1.0/2.5.4 vs 本机 3.0.3/2.4.6)
#
# 但"能装"不等于"能跑"——V8 二进制在 win32 上能否真正加载需要实测。
# 下面两步就是这次实测。各自 continue-on-error,避免装不上时中断后续步骤;
# 整个 job 本身也在观察期,失败不阻塞合并。
- name: 安装 akshare(Windows 可行性实测)
continue-on-error: true
run: python -m pip install --quiet akshare
- name: 验证 mini-racer 原生库可加载
# 注意包名与模块名不一致:PyPI 包叫 mini-racer,**顶层模块仍是 py_mini_racer**
# (akshare 源码里也全是 import py_mini_racer / from py_mini_racer import MiniRacer)。
# 写成 import mini_racer 会 ModuleNotFoundError 而误判为"Windows 装不上"。
continue-on-error: true
run: >-
python -c "import py_mini_racer;
ctx = py_mini_racer.MiniRacer();
print('py_mini_racer 可执行 JS:', ctx.eval('1+1'))"
- name: akshare 采集器测试
continue-on-error: true
run: python -m pytest Services/akshare_fetcher/tests -q