2 Commits
Author SHA1 Message Date
SkyJourney 06407650e0 feat: 发布标准 Windows 安装向导 2026-07-27 23:01:22 +08:00
SkyJourney 8d91d08809 fix: 移除桌面端原生菜单栏 2026-07-27 22:23:39 +08:00
10 changed files with 1503 additions and 4092 deletions
+12 -4
View File
@@ -26,10 +26,18 @@ npm run desktop:package
npm run make -w @md-to-pdf/desktop npm run make -w @md-to-pdf/desktop
``` ```
版本化目录包、Squirrel `Setup.exe` 和 ZIP 输出到 版本化目录包、NSIS `Setup.exe` 和 ZIP 输出到
`apps/desktop/out/v0.4.1/`。该目录被 Git 忽略。公司内部分发以 `apps/desktop/out/v0.4.3/`。该目录被 Git 忽略。公司内部分发以
`Setup.exe` 为正式安装包,ZIP 作为免安装辅助包;当前未配置代码签名, `md-to-pdf-0.4.3-x86_64-Setup.exe` 为正式安装包,ZIP 作为免安装
Windows 首次运行可能显示“未知发布者”提示。 辅助包;当前未配置代码签名,Windows 首次运行可能显示“未知发布者”
提示。
NSIS 使用标准辅助安装模式,支持选择当前用户/所有用户安装和自定义安装
目录,并创建桌面及开始菜单快捷方式。正式安装包作为 Gitea Release 附件
发布,不提交进 Git 历史。
桌面和开始菜单快捷方式由 `build/installer.nsh` 显式创建,安装完成后的
“运行”操作直接启动 `md-to-pdf.exe`,不依赖快捷方式文件。
产品名称、窗口标题、安装包名称和开始菜单名称保持为 产品名称、窗口标题、安装包名称和开始菜单名称保持为
“Markdown PDF 导出器”,实际 Windows 主程序与进程文件固定为 “Markdown PDF 导出器”,实际 Windows 主程序与进程文件固定为
+20
View File
@@ -0,0 +1,20 @@
!macro customInstall
CreateDirectory "$SMPROGRAMS\Markdown PDF 导出器"
CreateShortCut \
"$SMPROGRAMS\Markdown PDF 导出器\Markdown PDF 导出器.lnk" \
"$INSTDIR\md-to-pdf.exe" \
"" \
"$INSTDIR\md-to-pdf.exe"
CreateShortCut \
"$DESKTOP\Markdown PDF 导出器.lnk" \
"$INSTDIR\md-to-pdf.exe" \
"" \
"$INSTDIR\md-to-pdf.exe"
StrCpy $launchLink "$INSTDIR\md-to-pdf.exe"
!macroend
!macro customUnInstall
Delete "$SMPROGRAMS\Markdown PDF 导出器\Markdown PDF 导出器.lnk"
RMDir "$SMPROGRAMS\Markdown PDF 导出器"
Delete "$DESKTOP\Markdown PDF 导出器.lnk"
!macroend
+71
View File
@@ -0,0 +1,71 @@
const path = require("node:path");
const { version } = require("./package.json");
const windowsIcon = path.resolve(
__dirname,
"../../logos/desktop/windows/app.ico"
);
module.exports = {
appId: "com.md-to-pdf.desktop",
productName: "Markdown PDF 导出器",
copyright: "Copyright © YIXIONG Tech.ltd",
asar: true,
directories: {
output: `out/v${version}`
},
files: [
"dist/**/*",
"package.json"
],
extraResources: [
{
from: "../web/dist",
to: "dist",
filter: ["**/*"]
},
{
from: "../../themes",
to: "themes",
filter: ["**/*"]
},
{
from: windowsIcon,
to: "app.ico"
},
{
from: "../../logos/desktop/macos/app.icns",
to: "app.icns"
}
],
win: {
target: [
{
target: "nsis",
arch: ["x64"]
},
{
target: "zip",
arch: ["x64"]
}
],
icon: windowsIcon,
executableName: "md-to-pdf",
artifactName: `md-to-pdf-${version}-x86_64.\${ext}`
},
nsis: {
oneClick: false,
allowToChangeInstallationDirectory: true,
perMachine: false,
allowElevation: true,
createDesktopShortcut: false,
createStartMenuShortcut: false,
shortcutName: "Markdown PDF 导出器",
uninstallDisplayName: "Markdown PDF 导出器",
installerIcon: windowsIcon,
uninstallerIcon: windowsIcon,
installerLanguages: ["zh_CN"],
include: "build/installer.nsh",
artifactName: `md-to-pdf-${version}-x86_64-Setup.\${ext}`
}
};
-47
View File
@@ -1,47 +0,0 @@
const path = require("node:path");
const windowsIcon = path.resolve(
__dirname,
"../../logos/desktop/windows/app.ico"
);
const macosIcon = path.resolve(
__dirname,
"../../logos/desktop/macos/app.icns"
);
const { version } = require("../../package.json");
module.exports = {
buildIdentifier: `v${version}`,
packagerConfig: {
asar: true,
prune: false,
executableName: "md-to-pdf",
icon: process.platform === "darwin" ? macosIcon : windowsIcon,
ignore: [
/^\/node_modules(?:\/|$)/,
/^\/out(?:\/|$)/,
/^\/src(?:\/|$)/,
/^\/tests(?:\/|$)/,
/^\/tsconfig\.json$/
],
extraResource: [
path.resolve(__dirname, "../web/dist"),
path.resolve(__dirname, "../../themes"),
windowsIcon,
macosIcon
]
},
makers: [
{
name: "@electron-forge/maker-squirrel",
config: {
name: "markdown_pdf_exporter",
exe: "md-to-pdf.exe",
setupIcon: windowsIcon
}
},
{
name: "@electron-forge/maker-zip",
platforms: ["win32", "darwin"]
}
]
};
+6 -10
View File
@@ -1,32 +1,28 @@
{ {
"name": "@md-to-pdf/desktop", "name": "@md-to-pdf/desktop",
"version": "0.4.1", "version": "0.4.3",
"private": true, "private": true,
"productName": "Markdown PDF 导出器", "productName": "Markdown PDF 导出器",
"description": "Markdown PDF 导出器桌面端", "description": "Markdown PDF 导出器桌面端",
"author": "md-to-pdf contributors", "author": "YIXIONG Tech.ltd",
"type": "module", "type": "module",
"main": "dist/main.js", "main": "dist/main.js",
"dependencies": {
"@md-to-pdf/application": "0.4.1"
},
"scripts": { "scripts": {
"build": "npm run clean && npm run build:main && npm run build:preload", "build": "npm run clean && npm run build:main && npm run build:preload",
"build:main": "node scripts/build-main.mjs", "build:main": "node scripts/build-main.mjs",
"build:preload": "esbuild src/app-preload.ts src/pdf-preload.ts --bundle --platform=node --format=cjs --external:electron --outdir=dist --out-extension:.js=.cjs", "build:preload": "esbuild src/app-preload.ts src/pdf-preload.ts --bundle --platform=node --format=cjs --external:electron --outdir=dist --out-extension:.js=.cjs",
"clean": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"", "clean": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"",
"dev": "npm run build && wait-on http://localhost:5173 && electron dist/main.js --web-url=http://localhost:5173", "dev": "npm run build && wait-on http://localhost:5173 && electron dist/main.js --web-url=http://localhost:5173",
"package": "npm run build && electron-forge package", "package": "npm run build && electron-builder --dir --config electron-builder.config.cjs --x64",
"make": "npm run build && electron-forge make", "make": "npm run build && electron-builder --win nsis zip --config electron-builder.config.cjs --x64",
"test": "vitest run", "test": "vitest run",
"typecheck": "tsc -p tsconfig.json --noEmit --pretty false" "typecheck": "tsc -p tsconfig.json --noEmit --pretty false"
}, },
"devDependencies": { "devDependencies": {
"@electron-forge/cli": "7.11.2", "@md-to-pdf/application": "0.4.1",
"@electron-forge/maker-squirrel": "7.11.2",
"@electron-forge/maker-zip": "7.11.2",
"@types/node": "^24.10.1", "@types/node": "^24.10.1",
"electron": "43.2.0", "electron": "43.2.0",
"electron-builder": "26.15.3",
"esbuild": "^0.25.0", "esbuild": "^0.25.0",
"typescript": "^5.9.3", "typescript": "^5.9.3",
"vitest": "^4.1.10", "vitest": "^4.1.10",
+3
View File
@@ -3,6 +3,7 @@ import {
BrowserWindow, BrowserWindow,
dialog, dialog,
ipcMain, ipcMain,
Menu,
net, net,
protocol, protocol,
session, session,
@@ -211,6 +212,7 @@ async function createApplication(
height: 960, height: 960,
minWidth: 1024, minWidth: 1024,
minHeight: 720, minHeight: 720,
autoHideMenuBar: true,
show: false, show: false,
webPreferences: { webPreferences: {
contextIsolation: true, contextIsolation: true,
@@ -357,6 +359,7 @@ async function createApplication(
app app
.whenReady() .whenReady()
.then(async () => { .then(async () => {
Menu.setApplicationMenu(null);
if (process.platform === "win32") { if (process.platform === "win32") {
app.setAppUserModelId("com.md-to-pdf.desktop"); app.setAppUserModelId("com.md-to-pdf.desktop");
} }
+2 -2
View File
@@ -6,7 +6,7 @@ import {
describe("应用版本", () => { describe("应用版本", () => {
it("从统一构建版本生成标题徽标", () => { it("从统一构建版本生成标题徽标", () => {
expect(APP_VERSION).toBe("0.4.1"); expect(APP_VERSION).toBe("0.4.3");
expect(APP_VERSION_LABEL).toBe("v0.4.1"); expect(APP_VERSION_LABEL).toBe("v0.4.3");
}); });
}); });
+59
View File
@@ -35,6 +35,12 @@ ec48bce chore: 初始化项目骨架
受限公网图片下载、可见图片标题、图片整块分页与超高图片单页适配均复用 受限公网图片下载、可见图片标题、图片整块分页与超高图片单页适配均复用
统一渲染链路。Electron 安装包和 Docker Compose 发布候选均已通过验证。 统一渲染链路。Electron 安装包和 Docker Compose 发布候选均已通过验证。
`v0.4.2` 为仅面向桌面端的维护版本:移除 Windows 原生应用菜单栏;
Web/Compose 发布仍保持 `v0.4.1`
`v0.4.3` 将桌面发行包迁移为标准 NSIS 安装向导,并使用全英文、无空格、
包含版本与平台的安装包文件名;Web/Compose 发布仍保持 `v0.4.1`
## 2. 已完成 ## 2. 已完成
### 2.1 项目骨架 ### 2.1 项目骨架
@@ -397,6 +403,29 @@ ec48bce chore: 初始化项目骨架
- 默认示例增加 NASA 中等尺寸图与 Unsplash 超高竖图,直接覆盖正常图片 - 默认示例增加 NASA 中等尺寸图与 Unsplash 超高竖图,直接覆盖正常图片
和超高图片分页场景。 和超高图片分页场景。
### 3.15 v0.4.2 桌面窗口精简
- Electron 主进程不再创建默认应用菜单,移除窗口顶部的
`File / Edit / View / Window` 原生菜单栏。
- 应用窗口同时启用菜单栏自动隐藏,避免 Windows 恢复默认菜单。
- 该维护版本只重新生成桌面安装包和免安装 ZIP;Web/Compose 镜像继续
使用已验证的 `v0.4.1`
### 3.16 v0.4.3 标准 Windows 安装向导
- 桌面发行链路由 Electron Forge Squirrel 迁移到 electron-builder
26.15.3 的 NSIS assisted installer。
- 安装向导提供当前用户/所有用户安装选项、安装目录选择、安装进度和完成
页面;主程序继续使用 `md-to-pdf.exe`
- 正式安装包固定命名为
`md-to-pdf-0.4.3-x86_64-Setup.exe`,免安装包命名为
`md-to-pdf-0.4.3-x86_64.zip`
- 项目自有 `build/installer.nsh` 显式创建桌面和开始菜单快捷方式,
安装完成后直接启动主程序,不依赖 `.lnk`
- 卸载时显式清理桌面快捷方式、开始菜单快捷方式及其目录。
- 安装包和校验文件作为 Gitea `v0.4.3` Release 附件发布,不写入 Git
历史。
## 4. 已执行验证 ## 4. 已执行验证
2026-07-27 在当前完整工作区成功执行: 2026-07-27 在当前完整工作区成功执行:
@@ -589,6 +618,36 @@ ECharts 第二阶段浏览器与 PDF 验证结果:
`sha256:1ded8a8a11ecb8b69eaa116bb9129dd4ec039e9918b047169fe5f8add2af3a80` `sha256:1ded8a8a11ecb8b69eaa116bb9129dd4ec039e9918b047169fe5f8add2af3a80`
Compose 容器健康运行在 `http://localhost:8080` Compose 容器健康运行在 `http://localhost:8080`
2026-07-27 已完成 `v0.4.2` 桌面维护版本验证:
- 仅重新构建桌面端及其内嵌 Web 静态资源,没有重新构建或替换
Web/Compose 发布镜像。
- Windows 目录版视觉检查通过:默认原生菜单栏已经移除,应用内容直接
位于系统标题栏下方,版本徽标显示 `v0.4.2`
- Windows 主程序继续使用英文文件名 `md-to-pdf.exe`
- Squirrel 安装包为 `Markdown PDF 导出器-0.4.2 Setup.exe`
144,166,400 字节,SHA-256 为
`59DA57522C99EB6B16A9591AFDEC349B785BF9B76950504B314273520152D41B`
Authenticode 状态为未签名。
2026-07-27 已完成 `v0.4.3` 标准安装向导验证:
- NSIS 中文辅助安装向导正确显示安装范围和安装目录选择,版本显示为
`0.4.3`
- 当前用户安装成功,安装目录为
`%LOCALAPPDATA%\Programs\md-to-pdf`,卸载项版本为 `0.4.3`
- 桌面和开始菜单快捷方式均存在,实际目标均为安装目录中的
`md-to-pdf.exe`;从开始菜单快捷方式启动成功。
- 静默卸载返回 0,安装目录、桌面快捷方式和开始菜单目录全部清理;
随后重新安装成功,最终本机保持已安装状态。
- 正式安装包为 `md-to-pdf-0.4.3-x86_64-Setup.exe`
103,346,230 字节,SHA-256 为
`C027B4AC604889C7E7E00BA3CE08A12616312BC9250268775B1B7B578A7C4817`
Authenticode 状态为未签名。
- 免安装包为 `md-to-pdf-0.4.3-x86_64.zip`143,784,617 字节,
SHA-256 为
`91BED88A7CB623B98383408D5553D80A6135FB94F7FE2D77A5FCED339CCF5BC6`
## 5. 当前注意事项 ## 5. 当前注意事项
- `output/` 可能包含本地 PDF 验证产物,已被 Git 忽略,不得提交。 - `output/` 可能包含本地 PDF 验证产物,已被 Git 忽略,不得提交。
+1329 -4028
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "md-to-pdf", "name": "md-to-pdf",
"version": "0.4.1", "version": "0.4.3",
"private": true, "private": true,
"description": "可配置、可主题化的 Markdown PDF 导出工具", "description": "可配置、可主题化的 Markdown PDF 导出工具",
"workspaces": [ "workspaces": [