将网站打包成桌面程序并生成安装包(跨平台)

2023-11-17

一、Nativefier将网站打包成桌面程序

介绍

Nativefier 是一个命令行工具,仅仅通过一行代码就可以轻松地为任何的网站创建桌面应用程序,应用程序通过 Electron打包成系统可执行文件(.app .exe等), 对应的可执行文件分别可在 Windows、macOS 和 Linux 上使用,是一个非常赞的开源项目

安装

全局安装本机。要求:npm install -g nativefier

  • macOS 10.10+ / Windows / Linux
  • node. js≥ 12.9 和 npm ≥ 6.9

用法

要创建 baidu.com 应用程序

nativefier "https://baidu.com"

可通过--name指定自定义程序名称, --icon 指定程序logo,--file-download-options指定下载参数(下方参数为另存为)
注意: Windows下使用命令不要用单引号

nativefier --name baidu --file-download-options "{\"saveAs\": true}" "https://baidu.com" --icon favicon.ico

其他参数及配置可以官方 API 文档或运行本机 --help以了解命令行标志并配置应用。

二、使用 Qt Installer Framework 生成安装包

Qt 安装程序框架提供了一组工具和实用程序,可以创建安装程序一次,并在所有支持的桌面 Qt 平台上部署它们,而无需重写源代码。安装程序将在运行它们的平台上具有本机外观和感觉:Linux,Microsoft Windows 和 macOS

Qt 安装程序框架工具生成安装程序,其中包含一组页面,在安装,更新或卸载过程中指导用户。您可以提供可安装的内容并指定有关它的信息,例如产品和安装程序的名称以及许可协议的文本。

您可以通过向预定义页面添加小部件或添加整个页面来自定义安装程序,以便为用户提供其他选项。您可以创建脚本以向安装程序添加操作。

选择安装程序类型

您可以为最终用户提供离线和在线安装程序两种类型,具体取决于您的使用案例。

两个安装程序都会安装一个维护工具,该工具以后可用于添加、更新和删除组件。脱机安装程序包含所有可安装的组件,并且在安装过程中不需要网络连接。联机安装程序仅安装维护工具,然后从 Web 服务器上的联机存储库下载并安装组件。因此,联机安装程序二进制文件的大小较小,其下载时间比脱机安装程序二进制文件短。如果最终用户未安装所有可用组件,则下载和运行联机安装程序所花费的总时间也可能短于下载和运行脱机安装程序。

最终用户可以使用维护工具在初始安装后从服务器安装其他组件,并在更新发布到服务器上后立即接收内容的自动更新。但是,仅当您在脱机安装程序配置中指定存储库地址或最终用户在维护工具设置中自行指定存储库地址时,这才适用于脱机安装。

创建脱机安装程序,使用户能够直接将安装包下载到媒体上,以便以后在计算机上安装。例如,您还可以将安装包分发到 CD-ROM 或 U 盘上。

创建联机安装程序,使用户能够始终安装最新版本的内容二进制文件。

使联机存储库可用,以便向安装产品的最终用户推广更新。提供更新的最简单方法是重新创建存储库并将其上载到 Web 服务器。对于大型存储库,您只能更新已更改的组件。

为安装程序提供内容

您可以允许其他内容提供程序将组件作为附加组件添加到安装程序。组件提供程序必须设置包含可安装组件的存储库,并将指向存储库的 URL 传递给最终用户。然后,最终用户必须在安装程序中配置 URL。附加组件在包管理器中可见。

如何为小型项目创建简单的安装程序:

本节介绍创建安装程序必须完成的以下任务:

  1. 创建一个包含所有配置文件和可安装包的_包目录_。

  2. 创建一个_配置文件_,其中包含有关如何构建安装程序二进制文件和联机存储库的信息。

  3. 创建一个_包信息文件_,其中包含有关可安装组件的信息。

  4. 创建安装程序内容并将其复制到包目录。

  5. 使用该工具创建_安装程序_。binarycreator

    安装程序页面是使用您在配置和包信息文件中提供的信息创建的。

示例文件位于 Qt 安装程序框架存储库的目录中。examples\tutorial

创建包目录

创建一个目录结构,该结构反映安装程序的设计,并允许将来扩展安装程序。该目录必须包含调用的子目录。config``packages

有关包目录的详细信息,请参阅包目录

创建配置文件

在目录中,创建一个调用的文件,其中包含以下内容:config``config.xml

<?xml version="1.0" encoding="UTF-8"?>
<Installer>
    <Name>Your application</Name>
    <Version>1.0.0</Version>
    <Title>Your application Installer</Title>
    <Publisher>Your vendor</Publisher>
    <StartMenuDir>Super App</StartMenuDir>
    <TargetDir>@HomeDir@/InstallationDirectory</TargetDir>
</Installer>

配置文件指定在简介页上显示的以下信息:

  • <Title>标签指定标题栏(1)上显示的安装程序名称
  • <Name>标签指定添加到页面名称和简介文本 (2) 中的应用程序名称。

其他标签用于自定义安装程序的行为:

  • <Version>标签指定应用程序版本号
  • <Publisher>标签指定软件的发布者(例如,如 Windows 控制面板中所示)
  • <StartMenuDir>标签指定 Windows “开始” 菜单中产品的默认程序组的名称
  • <TargetDir> 标签指定向用户显示的默认目标目录位于当前用户的主目录中(因为预定义变量用作值的一部分)。有关更多信息,请参阅预定义变量

有关配置文件格式和可用元素的详细信息,请参阅配置文件

创建包信息文件

在此方案中,安装程序只处理一个被调用的组件。要向安装程序提供有关组件的信息,请创建一个包含以下内容的文件 package.xml,并将其放在目录:com.vendor.product/meta

<?xml version="1.0" encoding="UTF-8"?>
<Package>
    <DisplayName>The root component</DisplayName>
    <Description>Install this example.</Description>
    <Version>0.1.0-1</Version>
    <ReleaseDate>2010-09-21</ReleaseDate>
    <Licenses>
        <License/>
    </Licenses>
    <Default>script</Default>
    <Script>installscript.qs</Script>
    <UserInterfaces>
        <UserInterface>page.ui</UserInterface>
    </UserInterfaces>
</Package>

下面将更详细地介绍示例文件中的元素。

有关package.xml信息文件的详细信息,请参阅包信息文件语法

指定组件信息

来自以下元素的信息显示在组件选择页面上:

  • <DisplayName>标签指定组件列表(1)中组件的名称。
  • <Description>标签指定选择组件时显示的文本(2)

指定安装程序版本

<Version>标签使您能够在更新可用时向用户提供更新

添加许可证

<License>标签指定许可证检查页面上显示的许可协议(1)文本的文件的名称:

选择默认内容

<Default>script</Default>标签指定默认情况下是否选择组件。该值将组件设置为选定组件。在此示例中,脚本文件的名称 installscript.qs 在<Script>标签中进行指定,默认在mate目录下

installscript.qs(Windows通过该脚本创建桌面快捷方式)

function Component()
{
    // default constructor
}

Component.prototype.createOperations = function()
{
    // call default implementation to actually install README.txt!
    component.createOperations();

    if (systemInfo.productType === "windows") {
        component.addOperation("CreateShortcut", "@TargetDir@/README.txt", "@StartMenuDir@/README.lnk",
            "workingDirectory=@TargetDir@", "iconPath=%SystemRoot%/system32/SHELL32.dll",
            "iconId=2", "description=Open README file");
 component.addOperation("CreateShortcut", "@TargetDir@/image-center/manage.exe", "@DesktopDir@/快捷方式名字.lnk");
    }
}

创建安装程序内容


要安装的内容存储在组件的目录中。由于只有一个组件,因此将数据放在目录中。该示例已经包含一个用于测试目的的文件,但您基本上可以将任何文件放在目录packages/com.vendor.product/data

有关打包规则和选项的详细信息,请参阅数据目录

创建安装程序二进制文件


现在,您已准备好创建第一个安装程序。命令行上切换到qt目录下的examples\tutorial目录。若要创建名为 YourInstaller.exe 的安装程序,其中包含由 com.vendor.product 标识的程序包,请输入以下命令:

  • 在Windows上:

    ..\..\bin\binarycreator.exe -c config\config.xml -p packages YourInstaller.exe
    
  • 在 Linux 或 macOS 上:

    ../../bin/binarycreator -c config/config.xml -p packages YourInstaller
    

安装程序在当前目录中创建,您可以将其交付给最终用户。

有关使用该工具的详细信息,请参阅 binarycreator

注意:如果在运行教程安装程序时显示错误消息,请检查您是否使用了静态构建的 Qt 来创建安装程序。有关更多信息,请参阅配置 Qt指定设置 创建安装程序

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将网站打包成桌面程序并生成安装包(跨平台) 的相关文章

  • 与 Qt 项目的静态链接

    我有一个在 Visual Studio 2010 Professional 中构建的 Qt 项目 但是 当我运行它 在调试或发布模式下 时 它会要求一些 Qt dll 如果我提供 dll 并将它们放入 System32 中 它就可以工作 但
  • 错误:找不到模块“jasmine-core”

    我安装了以下内容进行测试 devDependencies jasmine core 2 4 1 karma 0 13 22 karma jasmine 0 3 7 karma phantomjs launcher 1 0 0 运行后karm
  • 使用 TFS 2015 运行 Jest 单元测试

    有人尝试将 jest 单元测试与 TFS 2015 集成吗 我尝试使用 Chutzpah 测试适配器 https visualstudiogallery msdn microsoft com f8741f04 bae4 4900 81c7
  • 计算两点之间的最短路线

    过去几周我一直在开发一款多人 HTML5 游戏 使用nodejs and websockets 我已经被这个问题困扰了一段时间 想象一下 我用数组实现了这个平铺地图 如下所示 1 or 棕色瓷砖 路上有障碍物 玩家无法通过 0 or 绿色瓷
  • Qt:测量事件处理时间

    我想测量我的应用程序中的哪些事件在主线程中需要很长时间才能执行 阻塞 GUI 或者至少是否有任何事件花费的时间超过 比如说 10 毫秒 显然 我对需要很长时间的任务使用线程和并发 但有时很难在其他线程中放入的内容和可以保留在 GUI 中的内
  • 动态更改温斯顿的日志级别

    我尝试在运行时实现日志级别更改 我一直在关注https github com yannvr Winston dynamic loglevel blob master test https github com yannvr Winston
  • Nodemailer发送日历事件并将其添加到谷歌日历

    我正在尝试使用 nodemailer 将日历事件发送到 Gmail 帐户 这是我的代码 let transporter nodemailer createTransport host smtp gmail com port 587 secu
  • 函数不会等到 Promise 得到解决

    我正在开发一个简单的不和谐机器人 我正在尝试打印有关某个玩家的一些一般数据 我最近了解了 async await 并尝试将其实现到我的代码中 然而 它似乎不起作用 因为当我第一次触发此代码时 它会打印 null 但在后续触发时 它将打印正确
  • 电子应用程序可以播放本地支持的任何视频吗?

    我知道浏览器通常会限制玩家mp4 and webm类型的媒体 但我想知道基于电子的应用程序是否可以运行 MKV 和 AVI 等格式的本地视频 我找不到明确的来源来告诉我什么是可用的 什么是不可用的 Electron 仍然仅限于网络技术 这意
  • 将随机字节转换为整数范围 - 如何?

    我试图通过读取 crypto randomBytes 来获取一定范围内的随机整数 现在 我的问题是我不知道如何从该字节流中读取整数 我想生成一个范围只是 丢弃 不在范围内的整数的问题 有任何想法吗 您可以从以下位置获取一个 32 位整数cr
  • Qt 插槽是否与其他代码并行运行?

    在此函数示例中 void MyClass myFunction emit MySignal1 emit MySignal2 如果我有slot1倾听MySignal1 and slot2倾听MySignal2 1 Is slot1总是会在之前
  • 使用 Socket.io 向多个房间发送消息?

    是否可以使用socket io向多个房间发送消息 发送至 1 个房间 io sockets in room emit id 发送到N个房间 io sockets in room1 room2 roomN emit id 是的 可以同时发送到
  • 简单 AJAX Get 请求“待处理”

    我正在尝试实现一个简单的 AJAX GET 请求 该请求告诉服务器删除数据库中的文档 虽然我从服务器得到文档已删除的确认 但 Chrome 检查器显示该请求处于 待处理 状态 最终导致服务器错误 我做错了什么 HTML div class
  • 将 gnuplot 嵌入现有 QtWidget 中

    我正在用 C 创建一个 伪 实时绘图应用程序 使用 gnuplot 作为绘图后端 我的要求之一是绘图必须位于现有窗口内 而不是有一个单独的绘图窗口 gnuplot 默认为 Gnuplot 有一个选项可以指定 Qt 小部件 ID 这似乎适合我
  • Node.js 中的 PHP exit()/die() 等价物是什么

    什么是 PHP die http www php net manual de function die php http www php net manual de function die php 在 Node js 中等效吗 https
  • 第一次使用node.js - “ReferenceError:节点未定义”

    我刚刚安装了node js 我尝试编写应该检查版本的node v 但它不起作用 这是输出 gt node v ReferenceError node is not defined at repl 1 2 at REPLServer self
  • 构建:找不到“节点”的类型定义文件

    VS 2015 社区版 在家 npm 3 10 Angular 2 我试图在 ASP Net MVC 5 应用程序中获取 Angular2 设置 我开始使用的模板使用旧版本的 Angular 因此我更新了包引用 当我构建时 列表中的第一个错
  • Qt - 无法让 lambda 工作[重复]

    这个问题在这里已经有答案了 我有以下功能 我想在其中修剪我的std set
  • 一次更新猫鼬中的多个文档

    我有一个用户文档数组 每个用户都有关注者属性 它是一个数字 我只想将此属性增加 1 然后立即更新数据库中的所有这些用户文档 更多细节 在请求中 我有一组用户 id 我使用这些 id 进行查询以获取一组用户文档 const users awa
  • Node.js 未处理的“错误”事件

    我编写了一个简单的代码并将其保存在文件 try js 中 var http require http var makeRequest function message var options host localhost port 8080

随机推荐

  • 开源之父--Linus

    Git 很多人都知道 Linus在1991年创建了开源的Linux 从此 Linux系统不断发展 已经成为最大的服务器系统软件了 Linus虽然创建了Linux 但Linux的壮大是靠全世界热心的志愿者参与的 这么多人在世界各地为Linux
  • Python3 初学 DAY2

    num1 minute py minute 7 24 60 print minute num2 print py 注 显示颜色格式 033 显示方式 字体色 背景色m 033 0m 显示颜色参数 显示方式 效果 字体色 背景色 颜色描述 0
  • spark报Got an error when resolving hostNames. Falling back to /default-rack for all

    一 报错代码如下 21 06 01 20 13 36 INFO yarn SparkRackResolver Got an error when resolving hostNames Falling back to default rac
  • 【Spring】Spring官方文档笔记

    Spring 官方文档 和任何一本spring书籍相比 它都更新更全 文章目录 Spring 1 控制反转 Inversion of Control IoC 1 1 依赖注入 dependency injection DI 1 Spring
  • java虚拟机+分隔符

    java 入门 java 虚拟机 1 java虚拟机的平台可移植性 只要将java虚拟机安装于不同平台 我们编译的 class 文件就可以运行 2 jdk java开发 3 jre java运行时环境 jdk jre 下载安装后必须在环境变
  • C语言:利用队列逆置栈

    关注作者 Aqu 蓝空 定义一些功能的函数 void InitStack SqStack S 栈的初始化 void Push SqStack S int data 入栈 int Pop SqStack S 出栈 void StackTrav
  • 根据身份证号获取出生日期,年龄,性别

    java语言 根据身份证号获取出生日期 年龄 性别 测试程序 public class TestUtils public static void main String args String idcard xxxxxxxxxxxxxxxx
  • oracle 获取日期的毫秒_Oracle 毫秒时间戳

    其实很早以前就经常碰到这个问题 就是得到自1970年1月1日以来的秒数 这个问题很容易解决 SQL gt SELECT SYSDATE TO DATE 1970 1 1 8 YYYY MM DD HH24 86400 FROM DUAL S
  • Linux学习笔记-----缓冲区概念及git使用

    一 编译文件 编译器是如何知道我的生成软件需要被重新编译了 根据文件的修改时间来的 因为用户不可能同时修改多个问题 所以文件修改总是有先后顺序的 又因为 源文件和可执行程序时间总是交叉 二 缓冲区概念及理解 1 概念 就是一块内存 刷新策略
  • clickhouse导入数据 DBeaver大坑

    测试数据有一亿条需要导入数据库 使用DBeaver自带导入数据功能 结果放置一晚才导入一千万条 估计导入设置有问题 于是寻找合适方式 记录如下 首先将待导入的csv数据表45G 传输到clickhouse所在的服务器 在数据库中提前建好表
  • 魔方机器人之硬件篇

    待续 点击打开链接 思睿硬件设计博客
  • 面向组织分析的内容

    声明 本文是学习GB T 42859 2023 航天产品质量问题三个面向分析方法实施要求 而整理的学习笔记 分享出来希望更多人受益 如果存在侵权请及时联系我们 1 范围 本文件规定了航天产品质量问题三个面向分析方法实施的一般要求 程序和分析
  • 进制转换(C++)

    文章目录 一 任意2 36进制数转换为10进制数 1 1 c 代码实现 二 十进制转换为其他进制 2 1 方法一 2 2 c 代码实现 2 3 方法二 2 4 Demo 一 任意2 36进制数转换为10进制数 以二进制转换为十进制为例 基本
  • Vue2 vue-cropper裁剪图片-使用方法及注意事项

    记录vue croppe的使用及过程中遇到的问题 参考文章 Vue2中使用vue croper插件实现图片上传裁剪 超详细 效果图 安装 npm install vue cropper 或 yarn add vue cropper 封装vu
  • Linux之gdb的使用

    当我们能够在windows下 使用vs 2019等编译器去进行调试的时候 我们可以将在Linux下使用gdb调试这两者之间进行对比 调试这个操作 在方法上有区别吗 Linux和windows 其实 在调试思路上是一样的 在调试的操作方式上一
  • 超详细的移动Web知识树状图(flex、移动适配、响应式)

    前言 学习任何新知识 最重要的永远都是搭建属于自己的知识框架 随后学习的细碎知识点往框架里面填入 最后形成一棵属于自己的知识大树 本系列的博客专注更新总结好的思维导图 希望可以帮助大家快速理清知识结构 注意 本系列文章是拿来建立知识体系 没
  • 基于51单片机的热水器设计

    概述 本实例是基于51单片机的智能热水器控制系统 主要硬件由51单片机最小系统 LCD1602显示屏屏电路 水位传感器电路 ADC转换电路 DS18B20数字温度传感器 蜂鸣器报警电路 按键电路 加水继电器电路 加热继电器电路电路构成 功能
  • IPv6 ‘dadfailed‘异常问题:重复地址检测【已解决】

    ipv6地址显示异常 inet6 x x x x 1 64 scope global tentative dadfailed 无法使用命令ping6 这个地址 原因是当另一台主机关闭 但ipv6地址未被删除 并且新主机无法使用此地址时 为防
  • Kali开启ssh服务

    Kali开启ssh 尝试Powershell连接ssh服务 输入密码 发现被拒绝 ssh root kali的ip 一般出现这个问题大概率可能是ssh服务没有开启 开启一下即可 注 密码错误也会报该错误提示 这里是正确密码的情况下 第一步
  • 将网站打包成桌面程序并生成安装包(跨平台)

    一 Nativefier将网站打包成桌面程序 介绍 Nativefier 是一个命令行工具 仅仅通过一行代码就可以轻松地为任何的网站创建桌面应用程序 应用程序通过 Electron打包成系统可执行文件 app exe等 对应的可执行文件分别