From 933aa295b27377b5f1fab03ef84f892fadeb27a4 Mon Sep 17 00:00:00 2001 From: Blank038 Date: Sat, 9 May 2026 17:13:29 +0800 Subject: [PATCH] =?UTF-8?q?fix(release):=20zip=20=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=90=8D=E5=B8=A6=E9=A1=B9=E7=9B=AE=E5=90=8D=E5=89=8D=E7=BC=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 发布包现在从 canonicalize 后的项目目录提取项目名,并生成 <项目名>_release_<版本>.zip。这样在项目根目录直接执行 release 时也能得到稳定、可区分的产物名称。 --- src/commands/release.rs | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/commands/release.rs b/src/commands/release.rs index af6fb40..7764cd2 100644 --- a/src/commands/release.rs +++ b/src/commands/release.rs @@ -10,7 +10,7 @@ use walkdir; use zip::write::SimpleFileOptions; use crate::commands::ReleaseArgs; -use crate::error::Result; +use crate::error::{CliError, Result}; use crate::utils::file; use crate::{entity, entity::project::ReleaseInfo}; @@ -160,7 +160,30 @@ fn package_project( pack_dirs: &PackDirs, version: &str, ) -> Result { - let output_path = format!("{}/release_{}.zip", project_dir.display(), version); + let canonical_project_dir = project_dir + .canonicalize() + .map_err(|e| file::io_error("解析项目目录", project_dir, e))?; + let project_name = canonical_project_dir + .file_name() + .ok_or_else(|| { + CliError::InvalidInput(format!( + "无法从项目目录 '{}' 确定项目名", + canonical_project_dir.display() + )) + })? + .to_str() + .ok_or_else(|| { + CliError::InvalidInput(format!( + "项目目录名不是有效的 UTF-8: '{}'", + canonical_project_dir.display() + )) + })?; + let output_path = format!( + "{}/{}_release_{}.zip", + project_dir.display(), + project_name, + version + ); let output_pathbuf = PathBuf::from(&output_path); let file = fs::File::create(&output_path) .map_err(|e| file::io_error("创建打包文件", &output_pathbuf, e))?;