FinDataHub
f112e9d277
feat(paths): 服务资源定位支持 bundle 与源码树两种布局(关闭 L2)
## 问题
backfill_stock_daily.py 把部署路径写死在 sys.path.insert 里:
sys.path.insert(0, "/Applications/FinDataHub.app/Contents/Resources/akshare_fetcher/src")
macOS 现网能跑,换平台或换安装位置即 ImportError。这是待办清单里长期挂着的 L2。
## 为什么不在脚本里写 try/except 双路径
那样只解决 bundle 形态,源码树运行时仍走 hardcode。正确做法是让「资源在哪」
由 paths.py 统一回答——它已经是路径的唯一事实来源。
## 新增三个函数
- resources_root():bundle → <App>/Contents/Resources;源码树 → 仓库根
- service_dir(name):<root>/<name> 或 <root>/Services/<name>
- service_src_dir(name):service_dir(name)/"src",可直接塞进 sys.path
**判据是内容而非层级**:仓库根下有 Services/,bundle 的资源目录下没有
(build-app.sh 把各服务平铺拷进 Resources/)。首版按「两级往上」硬算,
源码树里解析成 <repo>/Scripts——被 test_real_repo_layout_resolves 当场抓出。
## 验证(两形态实跑)
源码树:<repo>/Services/akshare_fetcher/src 存在 ✓
bundle:/Applications/…/Resources/akshare_fetcher/src 存在 ✓
import akshare_fetcher 成功 ✓
bundle 侧解析结果与旧硬编码**逐字一致**,故行为零漂移。
## 回归
TestServiceLayout 6 条:bundle / 源码树 / 两者共存时优先 bundle /
都不存在时返回 bundle 形态(错误信息才能指向期望位置)/ src 后缀 / 真实仓库解析。
scripts 257 → 263。
2026-10-27 23:23:06 +08:00
..
2026-09-18 22:37:32 +08:00
2026-09-18 22:37:32 +08:00
2026-09-19 00:27:21 +08:00
2026-09-18 22:37:32 +08:00
2026-09-18 22:37:32 +08:00
2026-09-18 22:37:32 +08:00
2026-09-18 22:37:32 +08:00
2026-09-18 22:37:32 +08:00
2026-10-26 20:55:31 +08:00
2026-09-18 22:37:32 +08:00
2026-10-27 23:23:06 +08:00
2026-09-18 22:37:32 +08:00
2026-09-18 22:37:32 +08:00