使用 Esky 创建 .app / .dmg
Create .app / .dmg with Esky
我正在 Python 中开发 GUI 应用程序。我使用 cx_Freeze
将我的应用程序转换为 .app/
/ .dmg
文件供 OS X 用户使用。因此,例如,我可以使用 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
文件,我在 Google.
上也找不到任何东西
作为第一步,我尝试手动将 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 and 以(标准).dmg
格式向用户发送文件的人吗?我错过了什么?
迈克尔,我也在 the github issue 中看到了你的评论。我在这里回答一下。
我有相同的要求并以类似的方式解决,但我认为我没有使用 cx_Freeze。另一个区别可能是我使用了 Python 2.7.x。帮助您的最佳方法是向您展示一些对我创建 .app 和 .dmg 非常有用的相关文件。
1)python项目的主要安装文件:
https://dl.dropboxusercontent.com/u/13110611/temp/package_esky/setup_esky.py
2) 我用来准备一些数据文件等的实用程序脚本
https://dl.dropboxusercontent.com/u/13110611/temp/package_esky/prepare_setup.py
3) 我用来创建应用程序和 DMG 的主要 shell 脚本。也就是说,此脚本将调用其他所有内容,并且它是我直接从命令行使用的唯一脚本。
https://dl.dropboxusercontent.com/u/13110611/temp/package_esky/package.sh
4) dmg-setup 脚本将从 .app 文件创建 DMS。它只是一个简单的包装脚本来调用 create-dmg,一个开源项目。
https://dl.dropboxusercontent.com/u/13110611/temp/package_esky/dmg-setup
如果您有任何其他疑问或问题,请尝试告诉我。
我正在 Python 中开发 GUI 应用程序。我使用 cx_Freeze
将我的应用程序转换为 .app/
/ .dmg
文件供 OS X 用户使用。因此,例如,我可以使用 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
文件,我在 Google.
作为第一步,我尝试手动将 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 and 以(标准).dmg
格式向用户发送文件的人吗?我错过了什么?
迈克尔,我也在 the github issue 中看到了你的评论。我在这里回答一下。
我有相同的要求并以类似的方式解决,但我认为我没有使用 cx_Freeze。另一个区别可能是我使用了 Python 2.7.x。帮助您的最佳方法是向您展示一些对我创建 .app 和 .dmg 非常有用的相关文件。
1)python项目的主要安装文件: https://dl.dropboxusercontent.com/u/13110611/temp/package_esky/setup_esky.py
2) 我用来准备一些数据文件等的实用程序脚本 https://dl.dropboxusercontent.com/u/13110611/temp/package_esky/prepare_setup.py
3) 我用来创建应用程序和 DMG 的主要 shell 脚本。也就是说,此脚本将调用其他所有内容,并且它是我直接从命令行使用的唯一脚本。 https://dl.dropboxusercontent.com/u/13110611/temp/package_esky/package.sh
4) dmg-setup 脚本将从 .app 文件创建 DMS。它只是一个简单的包装脚本来调用 create-dmg,一个开源项目。 https://dl.dropboxusercontent.com/u/13110611/temp/package_esky/dmg-setup
如果您有任何其他疑问或问题,请尝试告诉我。