Qt安装程序框架:自动更新

16
我目前正在使用Qt安装框架并成功设置了在线代码库。我想知道的是:
该框架是否提供某种“自动更新”机制,例如每次程序/系统启动时检查更新的插件/服务? 检查更新就足够了,因为可以使用维护工具进行安装。
关于这个话题我所能找到的全部内容只有这个小句子:
最终用户可以使用维护工具从服务器安装其他组件,以及在服务器上发布更新后立即接收到内容的自动更新。
来自这里:http://doc.qt.io/qtinstallerframework/ifw-overview.html#choosing-installer-type 感谢您的帮助!
编辑:建议 根据此问题的已接受答案,我创建了一个小型库,可使用安装程序框架自动检查更新-https://github.com/Skycoder42/QtAutoUpdater

你可能会对Mendeley/Update-Installer感兴趣。 - Innokentiy Alaytsev
5个回答

21

我的做法是使用 QProcess 运行维护工具,然后检查输出。它有一个模式,不运行 GUI,只在有更新信息时输出更新信息。

请注意,当应用程序启动时,我将工作目录设置为应用程序的路径,所以我只需要运行 maintenancetool。

QProcess process;
process.start("maintenancetool --checkupdates");

// Wait until the update tool is finished
process.waitForFinished();

if(process.error() != QProcess::UnknownError)
{
    qDebug() << "Error checking for updates";
    return false;
}

// Read the output
QByteArray data = process.readAllStandardOutput();

// No output means no updates available
// Note that the exit code will also be 1, but we don't use that
// Also note that we should parse the output instead of just checking if it is empty if we want specific update info
if(data.isEmpty())
{
    qDebug() << "No updates available";
    return false;
}

// Call the maintenance tool binary
// Note: we start it detached because this application need to close for the update
QStringList args("--updater");
bool success = QProcess::startDetached("maintenancetool", args);

// Close the application
qApp->closeAllWindows();

这个是放在controller.qs还是installscript.qs里面? - Franco
@Franco 你把这段C++代码加到你的应用程序源代码中。 - undefined

4
在最新的Qt Installer Framework 4.1版本中,--checkupdates不会返回任何内容,请使用chcheck-updates代替。
Commands:
  in, install - install default or selected packages - <pkg ...>
  ch, check-updates - show available updates information on maintenance tool
  up, update - update all or selected packages - <pkg ...>
  rm, remove - uninstall packages and their child components - <pkg ...>
  li, list - list currently installed packages - <regexp>
  se, search - search available packages - <regexp>
  co, create-offline - create offline installer from selected packages - <pkg ...>
  pr, purge - uninstall all packages and remove entire program directory

2

0

在指南中有一个关于如何实现它的部分,但他们称其为推广更新而不是自动更新,IFW Updates on doc.qt.io


我看到了那个,但如果我理解正确,用户将需要运行维护工具来获取这些更新? - Felix

0
根据这里的答案,我为PyQt应用程序做了一个修改。与其检查maintenancetool输出是否为空,我实际上对其进行了解析。
from AnyQt.QtCore import QProcess
from AnyQt.QtWidgets import QApplication
from AnyQt.QtXml import QDomDocument

def extract_xml(self, data):
    xml_string = str(data, encoding='utf-8')
            
    # Find the start and end positions of the XML content
    start_pos = xml_string.find('<?xml')
    end_pos = xml_string.find('</updates>') + len('</updates>')
    xml_content = xml_string[start_pos:end_pos]
            
    return xml_content

def parse_xml(self, xml_content):
    doc = QDomDocument()
    doc.setContent(xml_content)
            
    # Access and process the XML data as needed
    root = doc.documentElement()
    updates = root.elementsByTagName('update')
            
    package_names = []

    for i in range(updates.count()):
        update = updates.item(i)
        if update.isElement():
            element = update.toElement()
            name = element.attribute('name')
            version = element.attribute('version')
            # size = element.attribute('size')
            # _id = element.attribute('id')
            package_names.append( (name, version) )

    return package_names

# ...

updates_list = []
updater_tool_path = "maintenancetool.exe"
if updater_tool_path:
    process = QProcess()
    params = ["ch"]
    process.start(updater_tool_path, params)
    process.waitForFinished()

    if process.error() != QProcess.UnknownError:
        print("Error checking for updates")
        # Handle error

    data = process.readAllStandardOutput()
    xml_content = extract_xml(data)
    updates_list = parse_xml(xml_content)
 else:
     print("Couldn't found maintenancetool.exe for checking updates")
     # Handle error

# If there are updates let's start maintenancetool with "Update components" radiobutton selected:
if len(updates_list) > 0:
    args = ["--updater"]
    success = QProcess.startDetached(update_tool_path, args)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接