1

我正在用 Python 开发一个 GUI 应用程序。我cx_Freeze用来将我的应用程序转换为 OS X 用户的.app//文件。.dmg因此,例如,我可以使用python setup.py bdist_dmgcx_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格式发送给用户的人吗?我错过了什么?

4

1 回答 1

1

迈克尔,我也在github 问题上看到了你的评论。让我在这里回答一下。

我有相同的要求并以类似的方式解决,但我认为我没有使用 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

如果您有任何其他问题或问题,请尝试让我知道。

于 2016-06-16T00:31:38.670 回答