1

我有一个可用的 Windows 服务,我目前使用 py2exe 构建一个 exe,然后使用 WiX 工具集构建 MSI。

但是,当将 esky 引入到静默和自动服务更新的组合中时,这种结构是有效的,我没有正确获得更新的版本。

from distutils.core import setup
import  shutil, os
from esky import bdist_esky

# Setup.py for Windows Service. Works with Py2exe

#
class Target:
    def __init__(self, **kw):
        self.__dict__.update(kw)
        self.version = "1.0.0"
        self.company_name = ""
        self.copyright = "2015"
        self.name = " Edit Service"


myservice = Target(
    description = 'Edit Tracker Service',
    modules = ['Logon_Service'],
    cmdline_style='pywin32'
)


setup(
    name = " Edit Service",
    data_files=[('files', ['configs.yaml']),
               ],
    version = "1.0.0",
    options = {
        "bdist_esky":
        {
        "includes": ['yaml', 'pymysql', 'win32timezone'],
        "freezer_module": 'py2exe',
        }
    },
    zipfile = None,
    service=[myservice]
)

python setup.py bdist_esky使用上述 setup.py运行会生成 .zip 文件。解压缩后,可执行文件和服务可以正确安装并启动。

增加版本号并python setup.py bdist_esky再次运行后,我创建了另一个 zip 文件。

然后我运行原始的.exe 并且它正确地看到了 hte 更新,但它无法执行,返回以下异常

You are running: 1.0.0 ('ERROR UPDATING APP:', OSError(None, 'unable to cleanup: startup hooks not run' ))

我的 Win32Service 实现与 esky 相关的摘录如下

if getattr(sys, "frozen", False):
    app = esky.Esky(sys.executable, "http://localhost.com:8000")
    print "You are running: %s" % app.active_version
    try:
        if(app.find_update() != None):
            app.auto_update()
            appexe = esky.util.appexe_from_executable(sys.executable)
            os.execv(appexe,[appexe] + sys.argv[1:])
    except Exception as e:
        print("ERROR UPDATING APP:", e)
    app.cleanup()

如果需要更多信息,我将根据需要添加更多代码。目标是实现以下目标。

  1. 构建可执行文件/MSI
  2. 到处部署
  3. 从中央服务器自动更新。

总的来说,我对 distrubtions 和 esky 很陌生,任何和所有的建议都会受到赞赏!

4

0 回答 0