我有一个可用的 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()
如果需要更多信息,我将根据需要添加更多代码。目标是实现以下目标。
- 构建可执行文件/MSI
- 到处部署
- 从中央服务器自动更新。
总的来说,我对 distrubtions 和 esky 很陌生,任何和所有的建议都会受到赞赏!