Skip to content

Commit 90033dd

Browse files
committed
fix: 修复模板持久化问题,使用exe同目录存储并避免临时文件夹污染
- 修改模板目录为exe同目录下的templates文件夹 - 移除spec文件中的datas配置,避免在临时目录创建templates - 更新README和BUILD_INSTRUCTIONS文档 - 首次运行自动在exe同目录创建templates文件夹和demo.md
1 parent 704dbf7 commit 90033dd

4 files changed

Lines changed: 206 additions & 33 deletions

File tree

Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,182 @@
1+
# PromptComposer 打包与发布指南
2+
3+
## 📦 打包说明
4+
5+
### 环境要求
6+
- Python 3.8+
7+
- PyInstaller 6.0+
8+
9+
### 快速打包
10+
11+
```bash
12+
# 1. 进入项目目录
13+
cd PromptComposer
14+
15+
# 2. 安装打包工具(如未安装)
16+
pip install pyinstaller
17+
18+
# 3. 执行打包命令
19+
pyinstaller prompt_composer.spec --clean
20+
```
21+
22+
### 输出位置
23+
- 可执行文件:`dist/PromptComposer.exe`
24+
- 打包日志:`build/prompt_composer/`
25+
- 警告信息:`build/prompt_composer/warn-prompt_composer.txt`
26+
27+
## 🔧 关键技术方案
28+
29+
### 1. 用户数据持久化
30+
31+
**问题**:PyInstaller 单文件模式下,所有资源文件被解压到临时目录(如 `AppData\Local\Temp\_MEI323402\`),程序退出后自动清理,导致用户保存的模板丢失。
32+
33+
**解决方案**:根据运行环境动态选择模板目录
34+
- **开发环境**`python prompt_composer.py`):使用脚本所在目录的 `templates/` 文件夹
35+
- **打包环境**`PromptComposer.exe`):使用 exe 文件所在目录的 `templates/` 文件夹
36+
37+
```python
38+
if getattr(sys, 'frozen', False):
39+
# 打包后的 exe 环境:使用 exe 文件所在目录
40+
exe_dir = os.path.dirname(sys.executable)
41+
self.templates_dir = os.path.join(exe_dir, "templates")
42+
else:
43+
# 开发环境
44+
self.templates_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "templates")
45+
```
46+
47+
### 2. 用户数据位置
48+
49+
用户的模板保存在 exe 同目录下:
50+
```
51+
你的目录/
52+
├── PromptComposer.exe
53+
└── templates/
54+
├── demo.md # 内置示例
55+
├── 模板1.md # 用户保存的模板
56+
└── 模板2.md
57+
```
58+
59+
用户可以通过以下方式访问:
60+
1. **在程序中**:保存或加载模板时自动使用此目录
61+
2. **手动访问**:直接打开 exe 所在文件夹的 `templates` 子文件夹
62+
3. **快速打开**:在 PowerShell 中运行 `explorer (Split-Path (Get-Command .\PromptComposer.exe).Source)\templates`
63+
64+
### 3. 打包配置文件(prompt_composer.spec)
65+
66+
关键配置说明:
67+
68+
```python
69+
a = Analysis(
70+
['prompt_composer.py'],
71+
datas=[('templates', 'templates')], # 将初始模板打包进 exe
72+
# ...
73+
)
74+
75+
exe = EXE(
76+
# ...
77+
name='PromptComposer',
78+
console=False, # 不显示控制台窗口(GUI 应用)
79+
upx=True, # 启用 UPX 压缩减小文件体积
80+
# ...
81+
)
82+
```
83+
84+
**注意**`datas` 中的 `templates` 仅用于初始模板(如 demo.md),用户保存的模板存储在 AppData 目录。
85+
86+
## 🚀 发布流程
87+
88+
### 1. 测试开发版本
89+
```bash
90+
python prompt_composer.py
91+
```
92+
93+
### 2. 打包测试
94+
```bash
95+
pyinstaller prompt_composer.spec --clean
96+
dist/PromptComposer.exe # 启动测试
97+
```
98+
99+
### 3. 验证用户数据持久化
100+
- 启动程序
101+
- 保存一个测试模板
102+
- 关闭程序
103+
- 再次启动程序
104+
- 确认模板仍然存在
105+
106+
### 4. 创建压缩包(可选)
107+
```powershell
108+
# PowerShell
109+
Compress-Archive -Path "dist\PromptComposer.exe" -DestinationPath "PromptComposer-v1.0.1-Windows-x64.zip"
110+
```
111+
112+
### 5. 提交代码
113+
```bash
114+
git add .
115+
git commit -m "fix: 修复 exe 模板持久化问题,使用 AppData 存储"
116+
git tag -a v1.0.1 -m "Release v1.0.1: 修复模板持久化问题"
117+
git push origin main
118+
git push origin v1.0.1
119+
```
120+
121+
### 6. 创建 GitHub Release
122+
1. 访问 https://github.com/<username>/DevToolkit/releases/new
123+
2. 选择标签:`v1.0.1`
124+
3. 填写标题和说明
125+
4. 上传 `PromptComposer.exe` 或压缩包
126+
5. 发布
127+
128+
## 🐛 常见问题
129+
130+
### Q1: 为什么打包后文件这么大(11 MB)?
131+
A: 单文件打包包含了完整的 Python 解释器和所有依赖库(包括 Tkinter 和 Tcl/Tk)。
132+
133+
**可选优化方案**
134+
- 使用目录打包模式(去掉 `--onefile`):文件更小但需要多个文件
135+
- 启用 UPX 压缩(已启用)
136+
- 使用虚拟环境减少不必要的依赖
137+
138+
### Q2: 如何卸载或重置程序?
139+
A: 删除以下内容:
140+
1. 可执行文件:`PromptComposer.exe`
141+
2. 用户数据:exe 同目录下的 `templates/` 文件夹
142+
143+
### Q3: 如何备份模板?
144+
A: 复制 exe 同目录下的 templates 文件夹:
145+
```powershell
146+
# 备份(假设 exe 在 D:\Tools\PromptComposer\)
147+
Copy-Item "D:\Tools\PromptComposer\templates" -Destination "D:\Backup\PromptComposer_templates" -Recurse
148+
149+
# 恢复
150+
Copy-Item "D:\Backup\PromptComposer_templates\*" -Destination "D:\Tools\PromptComposer\templates" -Recurse -Force
151+
```
152+
153+
### Q4: 如何在多台电脑间同步模板?
154+
A: 可选方案:
155+
1. **手动同步**:复制 exe 同目录下的 `templates\` 文件夹
156+
2. **云盘同步**:将 exe 和 templates 文件夹放在 OneDrive、Dropbox 等云盘目录中
157+
3. **Git 同步**:将模板文件夹初始化为 Git 仓库
158+
4. **便携使用**:将整个文件夹(exe + templates)放在 U 盘中随身携带
159+
160+
### Q5: 打包时出现警告怎么办?
161+
A: 查看 `build/prompt_composer/warn-prompt_composer.txt` 文件。常见警告:
162+
- **缺少隐藏导入**:通常不影响运行,如有问题在 `.spec` 中添加 `hiddenimports`
163+
- **模块未找到**:检查依赖是否正确安装
164+
165+
## 📝 版本记录
166+
167+
### v1.0.1 (2026-02-10)
168+
- 🐛 修复:exe 打包后模板持久化问题
169+
- ✨ 改进:使用 AppData 目录存储用户数据
170+
- 📝 文档:添加详细的打包与发布指南
171+
172+
### v1.0.0 (2026-02-10)
173+
- 🎉 首次发布
174+
- ✨ 支持结构化提示词编辑
175+
- ✨ 模板管理系统
176+
- ✨ 实时预览与复制
177+
178+
## 📚 参考资料
179+
180+
- [PyInstaller 官方文档](https://pyinstaller.org/)
181+
- [单文件打包最佳实践](https://pyinstaller.org/en/stable/operating-mode.html#bundling-to-one-file)
182+
- [处理数据文件](https://pyinstaller.org/en/stable/spec-files.html#adding-data-files)

PromptComposer/README.md

Lines changed: 13 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@
3232

3333
### 方式一:直接运行 exe (推荐)
3434

35-
如果已有打包好的 `PromptComposer.exe`,双击即可运行。
35+
[GitHub Releases](https://github.com/YangZeCN/DevToolkit/releases) 下载最新版本的 `PromptComposer.exe`,双击即可运行。
3636

37-
> ⚠️ 确保 `templates` 文件夹与 `.exe` 在同一目录下
37+
> **数据持久化**:用户保存的模板存储在 exe 同目录下的 `templates\` 文件夹中,方便备份和管理
3838
3939
### 方式二:直接运行 Python 脚本
4040

@@ -46,41 +46,24 @@ python --version
4646
python prompt_composer.py
4747
```
4848

49-
### 方式二:打包成独立 .exe
49+
### 方式三:打包成独立 .exe
5050

51-
#### 1. 安装 PyInstaller
51+
详细打包说明请查看 [BUILD_INSTRUCTIONS.md](BUILD_INSTRUCTIONS.md)
5252

53-
```powershell
54-
pip install pyinstaller
55-
```
56-
57-
#### 2. 打包命令
53+
#### 快速打包
5854

5955
```powershell
60-
pyinstaller --onefile --noconsole --name="PromptComposer" prompt_composer.py
61-
```
62-
63-
**参数说明:**
64-
- `--onefile`:打包成单个 .exe 文件
65-
- `--noconsole`:运行时不显示黑色控制台窗口
66-
- `--name`:自定义生成的 .exe 文件名(PromptComposer)
67-
68-
#### 3. 部署步骤
69-
70-
⚠️ **重要提示**:打包完成后,必须手动执行以下步骤:
71-
72-
1.`dist/` 文件夹中找到生成的 `PromptComposer.exe`
73-
2. 将程序源码目录下的 `templates` 文件夹**完整复制**`.exe` 文件旁边
74-
3. 最终目录结构应为:
56+
# 1. 安装打包工具
57+
pip install pyinstaller
7558
76-
```
77-
your_deploy_folder/
78-
├── PromptComposer.exe
79-
└── templates/
80-
└── demo.md
59+
# 2. 使用配置文件打包
60+
pyinstaller prompt_composer.spec --clean
8161
```
8262

83-
如果缺少 `templates` 文件夹,程序会自动创建并生成示例模板,但**已有的自定义模板将丢失**
63+
#### 输出位置
64+
- 可执行文件:`dist/PromptComposer.exe`
65+
- 首次运行自动创建 `templates/` 文件夹和示例模板
66+
- 用户模板保存在 exe 同目录下的 `templates/` 文件夹
8467

8568
---
8669

PromptComposer/prompt_composer.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import os
99
import re
10+
import sys
1011
import glob
1112
from tkinter import Tk, Frame, Label, Entry, Text, Button, messagebox, simpledialog, Scrollbar
1213
from tkinter.ttk import Combobox, PanedWindow
@@ -21,8 +22,15 @@ def __init__(self, root):
2122
self.root.title("PromptComposer")
2223
self.root.geometry("1000x700")
2324

24-
# 模板目录
25-
self.templates_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "templates")
25+
# 模板目录:始终使用程序所在目录
26+
if getattr(sys, 'frozen', False):
27+
# 打包后的 exe 环境:使用 exe 文件所在目录
28+
exe_dir = os.path.dirname(sys.executable)
29+
self.templates_dir = os.path.join(exe_dir, "templates")
30+
else:
31+
# 开发环境:使用脚本所在目录
32+
self.templates_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "templates")
33+
2634
self._ensure_templates_folder()
2735

2836
# 字段名中英文映射

PromptComposer/prompt_composer.spec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ a = Analysis(
66
['prompt_composer.py'],
77
pathex=[],
88
binaries=[],
9-
datas=[('templates', 'templates')], # 包含模板文件夹
9+
datas=[], # 不打包模板文件夹,首次运行时自动在exe同目录创建
1010
hiddenimports=[],
1111
hookspath=[],
1212
hooksconfig={},

0 commit comments

Comments
 (0)