# doc_proofreading_service
**Repository Path**: rumosky/doc_proofreading_service
## Basic Information
- **Project Name**: doc_proofreading_service
- **Description**: 一个文档校对工具的服务端
- **Primary Language**: Unknown
- **License**: AGPL-3.0
- **Default Branch**: app
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-09-26
- **Last Updated**: 2026-10-12
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# doc-proofreading-service
这是一个文档校对服务项目。
自用,不对外,不提供服务
```bash
.\release.ps1 -Notes "1. 新增多轮对话`n2. 修复思考过程显示顺序`n3. 移除无效的温度设置`n4. 新增自动更新"
# 两个渠道一起发(最常用)
.\release.ps1 -Notes "1.修复xxx 2.优化xxx"
# Win7 单独写更新说明
.\release.ps1 -Notes "主线更新说明" -Win7Notes "Win7 渠道说明"
# 只发其中一个渠道
.\release.ps1 -Notes "..." -SkipWin7
.\release.ps1 -Notes "..." -SkipMain
```
## 安装包分发:为什么用魔搭 ModelScope(Gitee 100MB 上限)
Win7 安装包内嵌了 WebView2 109 固定运行时,**约 150MB**,超过 Gitee Release 附件的**单文件 100MB 上限**;
用户又无法访问 GitHub。因此安装包改托管到**魔搭 ModelScope**(阿里出品,国内直连、免费、**无容量上限**,
大文件走 git LFS),公开仓库的文件直链任何人可匿名直接下载,正好供 Tauri updater 使用。
**分工**:
- 更新清单 `latest.json` / `latest-win7.json`(几 KB)仍然推 **Gitee** 的 `app` 分支,用户检查更新时从这里读;
- 安装包(`.exe`,约 7MB / 150MB)推到**魔搭公开仓库**,清单里的下载地址写成魔搭匿名直链。
首次使用:
1. 注册并登录 [modelscope.cn](https://modelscope.cn),右上角「创建模型」建一个**公开**仓库(名字随意,如 `doc-proofreader`,类型选通用模型即可,本质是个带 LFS 的文件仓库)。
2. 在[访问令牌页](https://modelscope.cn/my/access/token)创建一个 Token。
3. 发布时传入魔搭用户名/仓库名,Token 建议用环境变量(避免写进命令历史):
```powershell
$env:MODELSCOPE_TOKEN = '你的魔搭访问令牌'
.\release.ps1 -Notes "..." -ModelScopeUser "rumosky" -ModelScopeRepo "doc-proofreader"
```
```powershell
.\release.ps1 -Notes "..." -ModelScopeUser "rumosky" -ModelScopeRepo "doc-proofreader" -ModelScopeToken ""
```
脚本会在两个渠道构建完成后,自动把安装包用 git LFS 推到魔搭仓库根目录(固定文件名覆盖、直链不变),
并把清单里的 url 写成 `https://www.modelscope.cn/models/<用户>/<仓库>/resolve/master/<文件名>`。
你只需像以前一样把 `latest.json` / `latest-win7.json` 提交推送到 Gitee 的 `app` 分支即可,**不用再传 Gitee Release**。
> 不传 `-ModelScopeUser/-ModelScopeRepo` 时脚本沿用旧的 Gitee Release 附件方式(但 Win7 包会超 100MB,传不上)。
> 本机需装有 Git for Windows(自带 git-lfs),脚本依赖它完成推送。
## Win7 兼容版的 WebView2 固定运行时
Win7 / Win8 / Win8.1 只能用 **WebView2 Runtime 109**(109 是支持这些系统的最后一个大版本;110 及以上安装时会报 `无法定位程序输入点 PackageIdFromFullName 于动态链接库 KERNEL32.dll`)。
Win7 渠道([tauri.win7.conf.json](src-tauri/tauri.win7.conf.json))用 `fixedRuntime` 模式把运行时**内嵌**进安装包,因此构建前需要先把运行时放到 `src-tauri/webview2-fixed/`。该目录已在 `.gitignore` 中、**不入库**,换电脑 / 重装系统后需重新拉取。运行时从 NuGet 包 `WebView2.Runtime.X64` 的 `109.0.1518.78` 版本获取。
在**项目根目录**用 PowerShell 执行(自动下载 + 解压 + 就位):
```powershell
$ErrorActionPreference = 'Stop'
$ver = '109.0.1518.78'
$tmp = Join-Path $env:TEMP "wv2-$ver"
$pkg = "$tmp\wv2.zip" # .nupkg 本质就是 zip,改后缀用 Expand-Archive 解压
New-Item -ItemType Directory -Force -Path $tmp | Out-Null
# 1. 下载 NuGet 包
curl.exe -sL "https://api.nuget.org/v3-flatcontainer/webview2.runtime.x64/$ver/webview2.runtime.x64.$ver.nupkg" -o $pkg
# 2. 解压
Expand-Archive -Path $pkg -DestinationPath $tmp -Force
# 3. 取出运行时目录到 src-tauri/webview2-fixed(保证 msedgewebview2.exe 在该目录根下)
$dst = Join-Path $PWD 'src-tauri\webview2-fixed'
Remove-Item $dst -Recurse -Force -ErrorAction SilentlyContinue
Copy-Item (Join-Path $tmp 'contentFiles\any\any\WebView2') $dst -Recurse -Force
# 4. 校验(应输出 True)
Test-Path (Join-Path $dst 'msedgewebview2.exe')
# 清理临时文件
Remove-Item $tmp -Recurse -Force
```
手动下载地址(备用):
- NuGet 包页:
- 直链:
- 下载后把 `.nupkg` 改名为 `.zip` 解压,将里面 `contentFiles/any/any/WebView2/` 目录的**全部内容**复制到 `src-tauri/webview2-fixed/`(确保 `msedgewebview2.exe` 位于该目录根下)。
放好后正常执行 `.\release.ps1` 即可同时打主线 + Win7 两个渠道;只想单独出一个 Win7 包可执行 `pnpm tauri:win7`。
## Win7 兼容版的 Rust 工具链要求
除了内嵌 WebView2 109,Win7 渠道还必须用**专门的 Rust 目标**编译,否则安装能成功、但一打开就报
`无法定位程序输入点 GetSystemTimePreciseAsFileTime 于动态链接库 kernel32.dll 上`(还可能伴随
`WaitOnAddress`、`ProcessPrng` / `bcryptprimitives.dll` 等)。
原因:**Rust 1.78 起,`x86_64-pc-windows-msvc` 目标的预编译标准库最低系统基线提升到了 Windows 10**,
标准库会静态链接一批 Win7 没有的系统 API。解决办法是改用官方 Tier 3 目标
`x86_64-win7-windows-msvc`,配合 `build-std` 从源码重新编译标准库,生成的程序只依赖 Win7 可用的 API。
`release.ps1` 在构建 Win7 渠道时会自动加上 `--target x86_64-win7-windows-msvc` 并开启 `build-std`,
但需要本机具备以下条件(换电脑 / 重装系统后要重新准备):
```powershell
# 1. 安装 rust-src 组件(build-std 编译标准库需要源码)
rustup component add rust-src
# 2. 安装 MSVC 构建工具(Visual Studio Build Tools,含 C++ 桌面开发负载)
# 与主线构建同一套即可,无需额外安装
```
> `build-std`(`-Z` 不稳定开关)原本只在 nightly 可用,脚本通过设置 `RUSTC_BOOTSTRAP=1`
> 让当前 stable 工具链也能使用,因此**无需额外安装 nightly**。脚本仅在编译 Win7 渠道时临时设置
> `RUSTC_BOOTSTRAP` 和 `CARGO_UNSTABLE_BUILD_STD`,构建结束即还原,不影响主线构建。
> **正常发布无需关心下面这些细节**:`release.ps1` 构建 Win7 渠道时会自动设置 `RUSTC_BOOTSTRAP` /
> `CARGO_UNSTABLE_BUILD_STD`,并自动处理 tauri-cli 的 target 校验(见下一小节),构建结束即还原。
> 直接跑 `.\release.ps1 -Notes "..."` 即可。
手动单独编译 Win7 版本(不走 release.ps1 时),除了 build-std 还必须**临时把 rustup 从 PATH 隐藏**,
否则 tauri-cli 会报 `Target x86_64-win7-windows-msvc does not exist`(原因见下一小节):
```powershell
$env:RUSTC_BOOTSTRAP = "1"
$env:CARGO_UNSTABLE_BUILD_STD = "std,panic_abort" # release profile 为 panic=abort
# 绕过 tauri-cli 的 Tier 3 target 校验:用工具链真实 bin 前置,并从 PATH 移除 ~/.cargo\bin(rustup 所在)
$sysroot = rustc --print sysroot
$cargoBin = Join-Path $env:USERPROFILE ".cargo\bin"
$env:PATH = "$(Join-Path $sysroot 'bin');" + (($env:PATH -split ';') | Where-Object { $_ -and ($_.TrimEnd('\') -ne $cargoBin.TrimEnd('\')) }) -join ';'
pnpm tauri build --features win7-channel `
--config src-tauri/tauri.win7.conf.json `
--target x86_64-win7-windows-msvc
# 产物在 src-tauri\target\x86_64-win7-windows-msvc\release\bundle\nsis\
```
> 注意:`pnpm tauri:win7`(package.json 里的快捷脚本)**不带** `--target`、`build-std`,也不隐藏 rustup,
> 编出来的仍是 Win10 基线的包、Win7 打不开。发布 Win7 包请用 `.\release.ps1`,或按上面的手动命令执行。
### 为什么 Win7 构建要把 rustup 从 PATH 隐藏
tauri-cli(`tauri build`)在调用 cargo 前,会执行 `rustup target list` 校验 `--target` 是否存在:
**只有当 rustup 命令能成功运行时才校验**。而 `x86_64-win7-windows-msvc` 是 Rust 的 Tier 3 目标,
rustup 既没有它的预编译标准库、也无法 `rustup target add`,于是 tauri-cli 直接报
`Target x86_64-win7-windows-msvc does not exist` 并中止——哪怕我们其实是用 `build-std` 从源码编译标准库、
根本不需要 rustup 安装该目标。
利用的机制:rustup 的代理程序(cargo/rustc/rustup)只在 `~/.cargo\bin`,而当前工具链的**真实**
`cargo.exe` / `rustc.exe` 在 `~/.rustup\toolchains\\bin`(该目录里**没有** rustup.exe)。
所以 `release.ps1` 在 Win7 构建时临时把 PATH 里的 `~/.cargo\bin` 移除、前置工具链真实 bin:
tauri-cli 找不到 rustup.exe → `rustup target list` 启动失败 → 跳过 target 校验;而 cargo/rustc 仍由
工具链真身提供,`build-std` 借助 sysroot 内已安装的 `rust-src` 正常编译。构建结束后 PATH 原样还原,
不影响主线构建。
### 为什么仓库里有 `src-tauri/vendor/ctor` 和 `vendor/dtor`
Win7 目标 `x86_64-win7-windows-msvc` 的 `target_vendor` 是 `"win7"`(普通 Windows 目标是 `"pc"`)——
正是这个特殊 vendor 让 Rust 标准库走 Win7 兼容代码路径,**不能改**。但 `ctor` / `dtor` 这两个依赖
(Tauri 间接引入)旧版本用 `target_vendor = "pc"` 来判断"是不是 Windows",遇到 win7 目标会直接
报 `#[ctor]/#[dtor] is not supported on the current target`。
因此在 [Cargo.toml](src-tauri/Cargo.toml) 里用 `[patch.crates-io]` 把这两个 crate 指向仓库内的
vendored 副本([vendor/ctor](src-tauri/vendor/ctor)、[vendor/dtor](src-tauri/vendor/dtor)),
仅把 Windows 判断从 `target_vendor = "pc"` 改为 `target_os = "windows"`(对普通 Win10/11 目标行为完全等价)。
这两个目录**已入库**,换电脑 / 重装系统后 `git clone` 即可自动生效,无需额外操作;
也不要把它们加进 `.gitignore`。