Skip to content

chore: 合并 preview 到 master#6

Merged
YueerMoe merged 20 commits intomasterfrom
preview
Feb 8, 2026
Merged

chore: 合并 preview 到 master#6
YueerMoe merged 20 commits intomasterfrom
preview

Conversation

@YueerMoe
Copy link
Member

@YueerMoe YueerMoe commented Feb 8, 2026

将 preview 分支的改动合并到 master,用于正式发布。

@gemini-code-assist
Copy link

Summary of Changes

Hello @YueerMoe, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

此拉取请求将 preview 分支的更改合并到 master 分支,为应用的下一次正式发布做准备。主要更新包括优化发布和版本管理策略,增强应用内更新系统以支持稳定版和预发布版渠道,以及调整开发环境和元数据处理逻辑。

Highlights

  • 发布流程与版本管理: 引入了详细的分支与发布工作流,并新增了一个 PowerShell 脚本 (set-version.ps1),用于同步 package.jsonsrc-tauri/tauri.conf.jsonsrc-tauri/Cargo.toml 中的版本号,确保版本一致性。
  • 更新机制增强: 应用内更新器现在能够检查并提供稳定版和预发布版更新,特别是对于当前是预发布版本的用户。更新逻辑已重构,并使用 semver 库进行更精确的版本比较,包括处理带有十六进制时间戳的预发布版本。
  • 开发环境更新: 将包管理器从 npm 切换到 Yarn,并将 Node.js 的最低要求更新到 24.x。同时,.gitignore 文件也进行了更新,以忽略新的开发相关文件。
  • 元数据处理优化: 简化了元数据版本确定的逻辑,现在主要依赖于 metadataVersion 设置,而不是隐式使用应用的当前版本。
  • 平台特定发布资产处理: Rust 后端现在仅针对 Windows 可执行文件有条件地获取发布资产的下载 URL,提高了其他平台的效率和正确性。
Changelog
  • .gitignore
    • 新增了 findings.mdprogress.mdtask_plan.md 到忽略列表。
    • 移除了 scripts 目录的忽略,并添加了文件末尾的换行符。
  • README.md
    • 将 Node.js 的前置要求从 v18+ 更新为 24.x
    • 新增 Yarn v1 作为推荐的包管理器。
    • 将安装和构建命令从 npm 切换为 yarn
    • 新增了“分支与发布流程”章节,详细说明了 devpreviewmaster 分支的 CI/CD 触发和版本同步机制。
  • package.json
    • 版本号从 0.1.3 更新为 0.2.0-pre.6988755b.087703a
    • 新增 engines.node 约束为 '>=24 <25'
    • 新增 semver 作为依赖,@types/semver 作为开发依赖。
  • scripts/set-version.ps1
    • 新增 PowerShell 脚本,用于同步 package.jsonsrc-tauri/tauri.conf.jsonsrc-tauri/Cargo.toml 中的版本号。
  • src-tauri/Cargo.lock
    • 更新了 endfield-cat 包的版本号。
  • src-tauri/Cargo.toml
    • 版本号从 0.1.3 更新为 0.2.0-pre.6988755b.087703a
  • src-tauri/src/app_cmd.rs
    • 修改 update_metadata 函数,不再直接使用 AppHandle 的版本信息进行元数据更新。
    • 新增 fetch_latest_prerelease Tauri 命令,用于获取最新的预发布版本信息。
  • src-tauri/src/lib.rs
    • 注册了 app_cmd::fetch_latest_prerelease 命令。
  • src-tauri/src/services/release.rs
    • 修改 fetch_latest_release,使其仅在 Windows 平台下尝试获取 .exe 文件的下载链接。
    • 新增 fetch_latest_prerelease 函数,用于从 GitHub API 获取最新的预发布版本信息。
  • src-tauri/tauri.conf.json
    • 版本号从 0.1.3 更新为 0.2.0-pre.6988755b.087703a
    • bundle.targets"all" 修改为明确的打包目标列表(nsisdmgdebrpmappimage)。
  • src/api/tauriCommands.ts
    • 新增 fetchLatestPrerelease 函数,用于调用 Tauri 后端的同名命令。
  • src/components/UpdateDialog.vue
    • 重构了本地版本获取方式,现在通过 updater.localVersion 获取。
    • 更新对话框现在可以根据是否有预发布版本信息,显示“安装稳定版”和“安装预览版”两个选项。
  • src/i18n/locales/en-US.ts
    • 新增 installStableinstallPreview 翻译键。
  • src/i18n/locales/zh-CN.ts
    • 新增 安装稳定版安装预览版 翻译键。
  • src/pages/SettingsPage.vue
    • 简化了 testSourceConnectionresetMetadata 中元数据版本参数的确定逻辑,现在优先使用 metadataVersion 或默认值 latest
  • src/stores/app.ts
    • 调整了 getMetadataBaseUrlcheckMetadataStatus 中元数据版本参数的确定逻辑,不再隐式使用应用的当前版本。
  • src/stores/updater.ts
    • 引入 semver 库进行版本比较。
    • 新增 localVersionaltUpdateInfo 状态。
    • 重构 checkForUpdate 逻辑,以支持同时检查稳定版和预发布版更新,并根据当前版本类型提供合适的更新选项。
    • 修改 installUpdatemanualDownload 方法,使其支持选择安装主更新或备用更新(如预发布版)。
  • yarn.lock
    • 新增 semver@types/semver 的依赖条目。
Ignored Files
  • Ignored by pattern: .github/workflows/** (4)
    • .github/workflows/dev.yml
    • .github/workflows/preview.yml
    • .github/workflows/release.yml
    • .github/workflows/tauri.yml
Activity
  • 此拉取请求由 YueerMoe 发起,旨在将 preview 分支的最新改动合并到 master 分支,为正式发布做准备。
  • 引入了一个新的 PowerShell 脚本,用于自动化版本号在多个配置文件间的同步,这表明了对发布流程自动化的投入。
  • 更新了前端的更新对话框组件,以支持新的稳定版和预发布版更新选项,这需要前端 UI/UX 的调整。
  • 项目依赖项进行了更新,并切换了包管理器,可能涉及了项目构建和依赖管理方面的迁移工作。
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

本次 PR 将 preview 分支的改动合并到 master 以进行正式发布,包含了大量改进。主要有:

  • 构建流程改进:切换到 yarn 作为包管理器,并新增了 set-version.ps1 脚本来同步项目各处的版本号。
  • 文档更新README.md 中更新了开发指南,并增加了新的分支与发布流程说明。
  • 更新逻辑重构:对 updater.ts 进行了重大重构,引入 semver 库进行更可靠的版本比较,并增加了对预发布版本的支持。
  • 后端支持:在 Rust 后端增加了相应接口来从 GitHub 获取预发布版本信息。

整体来看,这些改动大大提升了项目的发布流程自动化程度和更新功能的健壮性。我的审查意见主要针对新引入的脚本和后端服务,提出了一些关于代码可维护性和鲁棒性的建议。

Comment on lines +89 to +90
$indent = ($line -replace '^(\s*).+$', '$1')
$lines[$i] = ($indent + 'version = "' + $NewVersion + '"')

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

当前更新 Cargo.toml 中版本号的实现方式是重新构建整个 version 行,这会导致该行原有的注释被清除。为了让脚本更健壮,建议只替换引号内的版本字符串,以保留可能的行内注释。

      $lines[$i] = $line -replace '(?<=version\s*=\s*")[^^"]+', $NewVersion

Comment on lines +106 to +167
pub async fn fetch_latest_prerelease(client: &reqwest::Client) -> Result<LatestRelease, String> {
let url = "https://api.github.com/repos/BoxCatTeam/endfield-cat/releases?per_page=20";
let resp = client
.get(url)
.header("Accept", "application/vnd.github+json")
.header("User-Agent", "endfield-cat/tauri")
.send()
.await
.map_err(|e| e.to_string())?;

let status = resp.status();
if !status.is_success() {
return Err(format!("GitHub API status {}", status));
}

let json: serde_json::Value = resp.json().await.map_err(|e| e.to_string())?;
let releases = json.as_array().ok_or("Invalid GitHub response: expected array")?;

let target = releases.iter().find(|r| {
r.get("draft").and_then(|v| v.as_bool()) == Some(false)
&& r.get("prerelease").and_then(|v| v.as_bool()) == Some(true)
});

let Some(target) = target else {
return Err("No prerelease found".to_string());
};

let tag_name = target
.get("tag_name")
.or_else(|| target.get("name"))
.and_then(|v| v.as_str())
.unwrap_or("")
.to_string();

if tag_name.is_empty() {
return Err("Missing tag_name in GitHub response".to_string());
}

let name = target.get("name").and_then(|v| v.as_str()).map(|s| s.to_string());
let html_url = target.get("html_url").and_then(|v| v.as_str()).map(|s| s.to_string());
let body = target.get("body").and_then(|v| v.as_str()).map(|s| s.to_string());

let download_url = if cfg!(target_os = "windows") {
target
.get("assets")
.and_then(|v| v.as_array())
.and_then(|assets| {
assets.iter().find_map(|asset| {
let name = asset.get("name").and_then(|v| v.as_str())?;
if name.ends_with(".exe") {
asset.get("browser_download_url").and_then(|v| v.as_str()).map(|s| s.to_string())
} else {
None
}
})
})
} else {
None
};

Ok(LatestRelease { tag_name, name, html_url, download_url, body })
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

新增的 fetch_latest_prerelease 函数与 fetch_latest_release 内部的 fetch 函数存在大量重复代码,特别是从 serde_json::Value 解析成 LatestRelease 结构体的逻辑。为了提高代码的可维护性并减少冗余,建议将这部分解析逻辑提取到一个独立的辅助函数中。

例如,可以创建一个这样的函数:

fn latest_release_from_json(json: &serde_json::Value) -> Result<LatestRelease, String> {
    let tag_name = json
        .get("tag_name")
        .or_else(|| json.get("name"))
        .and_then(|v| v.as_str())
        .ok_or("Missing tag_name in GitHub response")?
        .to_string();

    if tag_name.is_empty() {
        return Err("Missing tag_name in GitHub response".to_string());
    }

    let name = json.get("name").and_then(|v| v.as_str()).map(|s| s.to_string());
    let html_url = json.get("html_url").and_then(|v| v.as_str()).map(|s| s.to_string());
    let body = json.get("body").and_then(|v| v.as_str()).map(|s| s.to_string());

    let download_url = if cfg!(target_os = "windows") {
        json.get("assets")
            .and_then(|v| v.as_array())
            .and_then(|assets| {
                assets.iter().find_map(|asset| {
                    let name = asset.get("name").and_then(|v| v.as_str())?;
                    if name.ends_with(".exe") {
                        asset.get("browser_download_url").and_then(|v| v.as_str()).map(|s| s.to_string())
                    } else {
                        None
                    }
                })
            })
    } else {
        None
    };

    Ok(LatestRelease { tag_name, name, html_url, download_url, body })
}

然后 fetch_latest_releasefetch_latest_prerelease 都可以调用这个函数来解析 Release 信息。

@YueerMoe YueerMoe merged commit bf5a99e into master Feb 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant