pack_verify_entry.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. r"""`pack.bat verify` 的入口:找最新的交付包(或用户给的路径)→ 交给 pack_dist.py --verify。
  4. 为什么要单独一个: `pack.bat verify` 不带参数时应该"自动找最新那个 zip",而批处理里做这个
  5. (dir /b /o-d 之类) 既啰嗦又在中文路径上不稳 —— 放到 Python 里三行搞定,批处理只负责传参。
  6. 用法:
  7. python scripts/pack_verify_entry.py # 找 <安装根父目录>/guanlan-v*_dist_*.zip 里最新的
  8. python scripts/pack_verify_entry.py <zip 路径>
  9. """
  10. from __future__ import annotations
  11. try:
  12. from app_common.app_common_guanlan.api import install_root as _install_root
  13. except ImportError: # 理论不可达;包结构异常时回退到按位置上跳
  14. from pathlib import Path as _P
  15. def _install_root(_f): return _P(_f).resolve().parents[4]
  16. import pathlib
  17. import subprocess
  18. import sys
  19. ROOT = _install_root(__file__)
  20. def newest_zip() -> pathlib.Path | None:
  21. """找最新的交付包: 先看安装根的父目录(打包器默认输出处), 再看安装根自己。"""
  22. cands: list[pathlib.Path] = []
  23. for d in (ROOT.parent, ROOT):
  24. if d.is_dir():
  25. cands += [p for p in d.glob('guanlan-*.zip') if p.is_file()]
  26. cands += [p for p in d.glob('*guanlan*v*.zip') if p.is_file()]
  27. cands = sorted(set(cands), key=lambda p: p.stat().st_mtime, reverse=True)
  28. return cands[0] if cands else None
  29. def main() -> int:
  30. arg = sys.argv[1] if len(sys.argv) > 1 else ''
  31. zp = pathlib.Path(arg) if arg else newest_zip()
  32. if zp is None or not zp.is_file():
  33. print('[X] 找不到交付包 zip。给一个路径: python scripts/pack_verify_entry.py <zip>')
  34. return 2
  35. print(f'[i] 开箱验证: {zp} ({zp.stat().st_size/1e6:.0f} MB)')
  36. if arg == '' and not str(zp).startswith(str(ROOT.parent)):
  37. pass
  38. return subprocess.call([sys.executable, str(ROOT / 'scripts' / 'pack_dist.py'), '--verify', str(zp)],
  39. cwd=str(ROOT))
  40. if __name__ == '__main__':
  41. sys.exit(main())