我正在用 Python 开发一个 GUI 应用程序。我cx_Freeze
用来将我的应用程序转换为 OS X 用户的.app/
/文件。.dmg
因此,例如,我可以使用python setup.py bdist_dmg
cx_Freeze 创建一个.dmg
文件,我的用户可以使用它来安装我的应用程序。
我现在希望我的应用程序自动更新。Esky似乎是一个很有前途的框架。我可以python setup.py bdist_esky
创建一个可以自我更新的应用程序版本。它产生以下目录结构:
myapp
myapp-0.1/
myapp
- ...
- ...
顶层myapp
是 Esky 的引导可执行文件。它在当前目录中查找,找到myapp-0.1/
最新版本,然后启动myapp-0.1/myapp
.
如何将.dmg
其打包成可以发送给我的用户的文件?在我修改后setup.py
开始bdist_esky
工作,bdist_dmg
不再工作。我得到的印象是,Esky 根本不适合与bdist_dmg
. 它的文档根本没有提到DMG
文件,我在谷歌上也找不到任何东西。
作为第一步,我尝试手动将 Esky 生成的文件转换为 OS X.app/
包:
myapp.app/
Contents/
Info.plist
MacOS/
myapp
myapp-0.1/
myapp
- ...
- ...
Info.plist
包含使 OS X 运行所需的最少必要信息myapp
。但是,当我尝试运行myapp.app
时,我得到:
Traceback (most recent call last):
File "<string>", line 318, in bootstrap
File "<string>", line 442, in get_best_version
FileNotFoundError: [Errno 2] No such file or directory: '/Users/michael/Temp/myapp.app/appdata'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<string>", line 689, in <module>
File "<string>", line 335, in bootstrap
RuntimeError: no usable frozen versions were found
查看 Esky 的源代码,它似乎在其appdir_from_executable(...)
功能中对 OS X 捆绑包进行了一些特殊处理。为了让 Esky 高兴,我尝试重新排列我的文件以使其appdata/
实际存在:
myapp.app/
appdata/
myapp-0.1/
myapp
- ...
Contents/
Info.plist
MacOS/
myapp
- ...
不幸的是,这会导致另一个错误:
Traceback (most recent call last):
File "<string>", line 689, in <module>
File "<string>", line 336, in bootstrap
File "<string>", line 363, in chainload
File "<string>", line 425, in _chainload
UnboundLocalError: local variable 'exc_value' referenced before assignment
这真的有那么难吗?我是唯一一个想要使用 Esky并将文件以(标准).dmg
格式发送给用户的人吗?我错过了什么?