修改打包方式为onedir,自更新适配新打包方式

This commit is contained in:
li-xiaochen 2024-12-01 19:56:55 +08:00
parent 7fbbc088ae
commit 988924ed3a
4 changed files with 33 additions and 32 deletions

1
.gitignore vendored
View file

@ -163,6 +163,7 @@ cython_debug/
# and can be added to the global gitignore or merged into this file. For a more nuclear # and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder. # option (not recommended) you can uncomment the following to ignore the entire idea folder.
.idea/ .idea/
launcher.iml
# Mower-ng # Mower-ng
git/ git/

View file

@ -9,5 +9,11 @@
前端运行 `npm run build` 生成 `ui/dist`,之后安装 PyInstaller,运行 前端运行 `npm run build` 生成 `ui/dist`,之后安装 PyInstaller,运行
```bash ```bash
pyinstaller -w -F --add-data ui/dist:ui/dist launcher.py pyinstaller -w --add-data ui/dist:ui/dist launcher.py
```
在dist文件夹生成launcher文件夹,切到dist文件夹下运行
```bash
tar -cf launcher.tar launcher
``` ```

View file

@ -1,6 +1,5 @@
import json import json
import mimetypes import mimetypes
import sys
from pathlib import Path from pathlib import Path
from shutil import rmtree from shutil import rmtree
from subprocess import PIPE, STDOUT, Popen from subprocess import PIPE, STDOUT, Popen
@ -15,7 +14,7 @@ mimetypes.add_type("text/html", ".html")
mimetypes.add_type("text/css", ".css") mimetypes.add_type("text/css", ".css")
mimetypes.add_type("application/javascript", ".js") mimetypes.add_type("application/javascript", ".js")
version = "V0.2" version = "v0.2"
config = { config = {
"page": "init", "page": "init",
@ -42,22 +41,6 @@ def custom_event(data):
window.evaluate_js(js) window.evaluate_js(js)
def replace_restart(exename, new_exename):
script_path = os.path.join(os.getcwd(), upgrade_script_name)
with open(script_path, 'w') as b:
TempList = f"@echo off\n"
TempList += f"timeout /t 3 /nobreak\n" # 等待进程退出
TempList += f"del {exename}\n" # 删除旧程序
TempList += f"move {new_exename} {exename}\n" # 复制新版本程序
TempList += f"timeout /t 1 /nobreak\n" # 等待复制完成
TempList += f"start {exename}\n" # 启动新程序
TempList += f"exit"
b.write(TempList)
# 不显示cmd窗口
subprocess.Popen([script_path], creationflags=subprocess.CREATE_NO_WINDOW)
os._exit(0)
mirror_list = { mirror_list = {
"pypi": "https://pypi.org/simple", "pypi": "https://pypi.org/simple",
"aliyun": "https://mirrors.aliyun.com/pypi/simple/", "aliyun": "https://mirrors.aliyun.com/pypi/simple/",
@ -107,24 +90,35 @@ class Api:
# 更新启动器本身 # 更新启动器本身
def update_self(self, download_url): def update_self(self, download_url):
# 获取当前启动器的路径 # 下载压缩包的全路径
current_path = sys.argv[0] download_path = os.path.join(os.getcwd(), os.path.basename(download_url))
# 如果current_path是以py结尾,则将其转换为.exe logger.info(f"下载新版本: {download_url}{download_path}")
if current_path.endswith(".py"):
current_path = current_path[:-3] + ".exe"
temp_path = current_path + '.tmp'
logger.info(f"下载新版本: {download_url}")
response = requests.get(download_url, stream=True) response = requests.get(download_url, stream=True)
if response.status_code == 200: if response.status_code == 200:
with open(temp_path, 'wb') as file: with open(download_path, 'wb') as file:
shutil.copyfileobj(response.raw, file) shutil.copyfileobj(response.raw, file)
logger.info("下载完成")
else: else:
logger.error(f"下载新版本失败: {response.status_code}") logger.error(f"下载新版本失败: {response.status_code}")
return f"下载新版本: {response.status_code}" return f"下载新版本失败: {response.status_code}"
logger.info(f"替换旧版本,{temp_path} -> {current_path}") script_path = os.path.join(os.getcwd(), upgrade_script_name)
replace_restart(current_path, temp_path) folder_path = os.path.join(os.getcwd(), "_internal")
exe_path = os.path.join(os.getcwd(), "launcher.exe")
with open(script_path, 'w') as b:
TempList = f"@echo off\n"
TempList += f"timeout /t 3 /nobreak\n" # 等待进程退出
TempList += f"rmdir {folder_path}\n" # 删除_internal
TempList += f"del {exe_path}\n" # 删除exe
TempList += f"tar -xf {download_path} -C ..\n" # 解压压缩包
TempList += f"timeout /t 1 /nobreak\n" # 等待解压
TempList += f"start {exe_path}\n" # 启动新程序
TempList += f"del {download_path}\n" # 删除压缩包
TempList += f"exit"
b.write(TempList)
# 不显示cmd窗口
subprocess.Popen([script_path], creationflags=subprocess.CREATE_NO_WINDOW)
os._exit(0)
def rm_site_packages(self): def rm_site_packages(self):
site_packages_path = Path("./python/Lib/site-packages") site_packages_path = Path("./python/Lib/site-packages")

View file

@ -75,7 +75,7 @@ async function check_update() {
</n-form-item> </n-form-item>
<n-alert style="margin: 8px 0" type="success" v-if="update_able"> <n-alert style="margin: 8px 0" type="success" v-if="update_able">
<template #header> <template #header>
最新版本{{ new_version.name }} 最新版本{{ `${new_version.tag_name} ${new_version.name}` }}
<n-button style="float: right" @click="open_new_version_html">了解此版本</n-button> <n-button style="float: right" @click="open_new_version_html">了解此版本</n-button>
</template> </template>
<n-space> <n-space>