From 6bf34e051bf4e6ee8e06c59506788de3f5df86ca Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Fri, 4 Sep 2026 10:34:51 +0800 Subject: [PATCH] =?UTF-8?q?fix(release):=20upload=5Fassets.py=20=E6=8C=89?= =?UTF-8?q?=20go.mod=20=E5=AE=9A=E4=BD=8D=E4=BB=93=E5=BA=93=E6=A0=B9?= =?UTF-8?q?=EF=BC=8C=E4=B8=8D=E5=86=8D=E6=95=B0=20dirname?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 脚本从 scripts/ 移到 deploy/scripts/ 后目录深度 1→2,而两层 dirname 是写死的,于是资产目录解析成 deploy/dist/release,上传直接 FileNotFoundError(v1.0.1 首次上传即因此失败)。 这与 v0.7.2 的 2c5f9ff 把 package/ 移到 deploy/packaging/ 打断 build.sh 的 PROJECT_ROOT 是同一个坑:目录搬家没更新相对路径。改成 向上找 go.mod,以后脚本放哪都不会错。 顺带把两个静默失败改为显式报错:目录不存在、目录下无可识别产物 (原先前者抛裸 FileNotFoundError,后者会打出 ALL OK 却一个都没传)。 --- deploy/scripts/upload_assets.py | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/deploy/scripts/upload_assets.py b/deploy/scripts/upload_assets.py index def07ad..97fe7c2 100755 --- a/deploy/scripts/upload_assets.py +++ b/deploy/scripts/upload_assets.py @@ -66,19 +66,41 @@ def put_file(url: str, headers: dict, path: str) -> tuple[int, str]: return 0, f"{type(e).__name__}: {e}" +def project_root() -> str: + """向上找带 go.mod 的目录作为仓库根。 + + 为何不数 dirname:本脚本初版在 scripts/(深度 1),移到 deploy/scripts/ + (深度 2)后写死的两层 dirname 就指向了 deploy/dist/release,上传直接 + FileNotFoundError。这正是 v0.7.2 那次 package/ → deploy/packaging/ 打断 + PROJECT_ROOT 的同一个坑,改成按标记文件定位以后怎么挑位置都不会错。 + """ + d = os.path.dirname(os.path.abspath(__file__)) + while d != os.path.dirname(d): + if os.path.exists(os.path.join(d, "go.mod")): + return d + d = os.path.dirname(d) + # 实在找不到(脚本被单独拷出仓库)就回退到 cwd,给 ASSET_DIR 一个机会 + return os.getcwd() + + def main() -> int: if len(sys.argv) < 3: print(__doc__) return 2 tag, token = sys.argv[1], sys.argv[2] outdir = os.environ.get("ASSET_DIR") or os.path.join( - os.path.dirname(os.path.dirname(os.path.abspath(__file__))), - "dist", - "release", + project_root(), "dist", "release" ) + if not os.path.isdir(outdir): + print(f"error: 资产目录不存在: {outdir}") + print(" 用 ASSET_DIR=<目录> 显式指定,或先跑构建生成 dist/release/") + return 2 files = sys.argv[3:] or sorted( f for f in os.listdir(outdir) if is_artifact(f) ) + if not files: + print(f"error: {outdir} 下没有可识别的发布产物") + return 2 print(f"repo={REPO} tag={tag} dir={outdir}", flush=True) failed = [] for name in files: