現在py2exeを使用してexeをビルドし、WiXツールセットを使用してMSIをビルドするWindowsサービスが動作しています。
この構造は機能しますが、サービスのサイレント更新と自動更新のために 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 を実行すると、更新が正しく認識されますが、実行に失敗し、次の例外が返されます。
You are running: 1.0.0
('ERROR UPDATING APP:', OSError(None, 'unable to cleanup: startup hooks not run'
))
eskyに関連する私のWin32Service実装の抜粋は次のとおりです
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
- どこにでも展開
- 中央サーバーから自動的に更新します。
私はディストリビューションとエスキー全般に非常に慣れていません。あらゆるアドバイスをいただければ幸いです。