【问题标题】:Create .app / .dmg with Esky使用 Esky 创建 .app / .dmg
【发布时间】:2016-06-14 17:31:18
【问题描述】:

我正在用 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 以(标准).dmg 格式向用户发送文件的人吗?我错过了什么?

【问题讨论】:

    标签: macos python-3.x cx-freeze esky


    【解决方案1】:

    Michael,我也在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

    如果您有任何其他问题或问题,请尝试告诉我。

    【讨论】:

    • 非常感谢杰克。我认为您的方法有效的主要原因是您使用的是 py2app,而不是 cx_Freeze。我阅读了它并在 Esky 的教程中找到了以下内容:On Mac cxfreeze doesn't output a .app file. If you plan on packaging your executable with a program that requires a .app you are better off using py2app. 然而,我挖得更深一点,实际上确实找到了让 Esky 使用 cx_Freeze 的方法:您需要将其 bootstrap_code 选项设置为 'appdir_from_executable = dirname\nbootstrap()'。不管怎样,非常感谢!
    • 嗨@MichaelHerrmann,我知道这个评论有点晚了,但是你能把这篇文章链接到使用 Esky 和 ​​cx_freeze 的解决方案吗?
    • @elams Esky 没有维护,我早就切换到build-system.fman.io(我是其中的作者)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-14
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 2015-08-29
    相关资源
    最近更新 更多