feat: 发布标准 Windows 安装向导

This commit is contained in:
SkyJourney
2026-07-27 23:01:22 +08:00
parent 8d91d08809
commit 06407650e0
9 changed files with 1477 additions and 4092 deletions
+12 -4
View File
@@ -26,10 +26,18 @@ npm run desktop:package
npm run make -w @md-to-pdf/desktop
```
版本化目录包、Squirrel `Setup.exe` 和 ZIP 输出到
`apps/desktop/out/v0.4.2/`。该目录被 Git 忽略。公司内部分发以
`Setup.exe` 为正式安装包,ZIP 作为免安装辅助包;当前未配置代码签名,
Windows 首次运行可能显示“未知发布者”提示。
版本化目录包、NSIS `Setup.exe` 和 ZIP 输出到
`apps/desktop/out/v0.4.3/`。该目录被 Git 忽略。公司内部分发以
`md-to-pdf-0.4.3-x86_64-Setup.exe` 为正式安装包,ZIP 作为免安装
辅助包;当前未配置代码签名,Windows 首次运行可能显示“未知发布者”
提示。
NSIS 使用标准辅助安装模式,支持选择当前用户/所有用户安装和自定义安装
目录,并创建桌面及开始菜单快捷方式。正式安装包作为 Gitea Release 附件
发布,不提交进 Git 历史。
桌面和开始菜单快捷方式由 `build/installer.nsh` 显式创建,安装完成后的
“运行”操作直接启动 `md-to-pdf.exe`,不依赖快捷方式文件。
产品名称、窗口标题、安装包名称和开始菜单名称保持为
“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",
"version": "0.4.2",
"version": "0.4.3",
"private": true,
"productName": "Markdown PDF 导出器",
"description": "Markdown PDF 导出器桌面端",
"author": "md-to-pdf contributors",
"author": "YIXIONG Tech.ltd",
"type": "module",
"main": "dist/main.js",
"dependencies": {
"@md-to-pdf/application": "0.4.1"
},
"scripts": {
"build": "npm run clean && npm run build:main && npm run build:preload",
"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",
"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",
"package": "npm run build && electron-forge package",
"make": "npm run build && electron-forge make",
"package": "npm run build && electron-builder --dir --config electron-builder.config.cjs --x64",
"make": "npm run build && electron-builder --win nsis zip --config electron-builder.config.cjs --x64",
"test": "vitest run",
"typecheck": "tsc -p tsconfig.json --noEmit --pretty false"
},
"devDependencies": {
"@electron-forge/cli": "7.11.2",
"@electron-forge/maker-squirrel": "7.11.2",
"@electron-forge/maker-zip": "7.11.2",
"@md-to-pdf/application": "0.4.1",
"@types/node": "^24.10.1",
"electron": "43.2.0",
"electron-builder": "26.15.3",
"esbuild": "^0.25.0",
"typescript": "^5.9.3",
"vitest": "^4.1.10",
+2 -2
View File
@@ -6,7 +6,7 @@ import {
describe("应用版本", () => {
it("从统一构建版本生成标题徽标", () => {
expect(APP_VERSION).toBe("0.4.2");
expect(APP_VERSION_LABEL).toBe("v0.4.2");
expect(APP_VERSION).toBe("0.4.3");
expect(APP_VERSION_LABEL).toBe("v0.4.3");
});
});