包服务器

appman-package-server 是一个命令行工具,开发者可以使用它来模拟应用商店或更新服务器后端,并通过 HTTP 连接方便地测试包安装。

其主要目的是在开发者的桌面机器上进行交互式使用,但也可用于服务器上,在开发阶段将包分发给多个设备或其他开发者的机器。

注意:不要在生产环境中使用此工具!

配置

此服务器接受未签名以及开发人员签名的包。 appman-packager 可以创建所有这些变体。在下载方面,它默认分布未签名包,但可以配置在运行时对包进行存储签名。

有关包安装的更多信息,请参阅 包安装 文档。

在运行服务器时需要配置的内容不多。唯一需要指定的是包服务器将使用其来管理包的数据目录。所有配置选项都可通过命令行参数和 YAML 基于的配置文件进行。如果在数据目录中存在 amps-config.yaml 文件,则会隐式解析。这些配置文件可以手动创建和编辑,但还可以使用方便的 --create-config 选项来使用命令行参数生成或修改文件。

尽管如此,命令行选项总是优先于配置文件。

参数
[YAML 字段]
描述
--dd--data-directory <dir>要使用的数据目录。默认为当前目录,但只有当它包含 amps-config.yaml 文件时。否则,您需要明确指定目录。
--la--listen-address <address>
[listenAddress]
要侦听的网络地址。可以是 <ip address>anylocalhost 之一。可以通过 :<port number> 将可选端口号附加到任一选项。默认为 localhost:8020
--pi--project-id <id>
[projectId]
将项目 ID 设置为非空 ASCII 字符串。默认为 PROJECT。此设置是可选的,有助于确保不会在互不兼容的项目之间混合包。
--sc <certificate file>
[storeSignCertificate]
用于签署存储下载的证书文件。默认值为无证书,这意味着下载不会进行存储签名。
--sp <password>
[storeSignPassword]
存储签名证书的密码。默认值为无密码。
--dc <certificate file>
[developerVerificationCaCertificates]
用于上传时验证开发者签名的CA证书文件。命令行选项可以多次使用,而YAML字段接受字符串列表,如果需要多个CA证书。默认情况下,不验证开发者签名。
--cc--create-config将当前配置保存到数据目录中的配置文件 amps-config.yaml。这使得可以从已知良好的命令行参数轻松生成未来使用的配置文件。保留现有配置文件的设置,但不保留注释。

appman-package-server自然支持标准的Unix –help 命令行选项。

示例配置文件

这些配置文件遵循应用程序管理器使用的所有YAML文件相同的模式。第一个文档表示文件格式标题,第二个文档是实际的配置数据

%YAML 1.1
---
formatType: amps-configuration
formatVersion: 1
---
listenAddress: 'any:7070'
projectId: 'HELLO'

命令行输出

这是一个示例输出,在一个支持ANSI颜色的控制台启动包服务器

$ appman-package-server --dd /tmp/ps-data
Qt ApplicationManager Package Server
> Data directory: /tmp/ps-data
> Project: PROJECT
> Verify developer signature on upload: no
> Add store signature on download: no
> Scanning .packages
 + adding   hello-world.red [all]
> HTTP server listening on: 127.0.0.1:8020

术语表

术语含义
id包的唯一标识符。这通常是一个反向域名,但可以是任何东西,只要它是唯一的。有关更多信息,请参阅清单定义
架构为了方便混合开发环境(例如,Windows和macOS桌面,Linux/ARM目标),同一个包可以为多个架构构建,包服务器可以分配匹配的包给请求的客户端。《架构》是一个表示包的二进制架构的字符串。这是一个不应由用户代码解析或解释的令牌。在客户端,当前架构可以通过PackageManager::architecture检索。在服务器端,包服务器解析上传的任何包的内容以确定架构,基于找到的任何二进制或共享库。如果没有找到此类文件,架构默认为all(平台无关)。
硬件ID如果要从应用商店分发绑定到特定设备单元的应用程序包,应用管理器的安装程序部分需要唯一的设备ID。这里的用例是为那些需要测试此机制的开发者提供便利。有关更多信息,请参阅《安装》章节中的硬件ID文档。

用法

可用的包可以通过文件系统操作和HTTP REST API进行维护。包服务器在数据目录内创建一个.packages目录。此目录包含实际包,并由包服务器管理。您可以从此目录中删除包,但如果这样做,则必须重新启动服务器。

文件系统操作

包服务器在数据目录内创建两个特殊目录:uploadremove

  • 放置在upload目录中的任何有效包文件将被解析,并在验证后移动并重命名为内部.packages目录。
  • remove目录中创建的任何文件,其文件名将与应用程序ID或应用程序ID与体系结构的组合进行匹配。然后,所有匹配的应用程序都将从内部.packages目录中移除。通常,您会使用touch命令来创建这些文件名。

示例

# Upload a package:
$ cp app.ampkg <datadir>/upload/

# Remove the 'hello.world' packages for all architectures:
$ touch <datadir>/remove/hello.world

# Remove the 'hello.world' package for Windows 64bit only:
$ touch <datadir>/remove/hello.world_windows_x86_64

HTTP REST接口

包服务器提供一个HTTP REST API来上传和下载应用程序。由于这仅是一个开发工具,因此不支持身份验证或授权!

以下表格列出了可用的API端点


/hello (GET或POST)

这应该是向服务器发出的第一次调用,因为它验证了客户端和服务器之间的大小写是否匹配。技术上没有必要调用此端点来设置会话,但建议这样做,以确保项目兼容性。

参数
project-id必需的<project-id>
结果

服务器将返回HTTP代码200和一个包含以下字段的JSON对象

状态要么是ok,要么是incompatible-project-id

/package/list (GET或POST)

返回可用应用程序的列表。此列表可以通过可选的categoryfilterarchitecture参数进一步过滤。

参数
category可选的仅返回给定分类中的应用程序。
filter可选的仅返回名称中包含给定字符串的应用程序。
架构可选的仅返回与给定体系结构兼容的应用程序。
结果

服务器将返回HTTP代码200(ok)和一个包含以下字段的JSON数组对象

id应用程序的ID。
架构应用程序的体系结构。
names应用程序的所有名称作为一个对象(有关更多详细信息,请参阅描述定义)。
descriptions应用程序的所有描述作为一个对象(有关更多详细信息,请参阅描述定义)。
version应用程序的版本字符串。
categories应用程序分类名称列表。
iconUrl指向该服务器上应用程序图标文件的相对URL。

/package/icon (GET或POST)

以标准PNG图像文件下载的方式返回应用程序的图标。

参数
id必需的指定要获取图标的程序的ID。
架构可选的指定请求程序的具体体系结构。如未指定,服务器将使用平台独立(code all
结果

有多个可能的场景

404(未找到)无法找到具有特定ID的应用程序,或者应用程序不包含图标。
200(ok)找到了包含图标的匹配包,并开始下载。图标以 image/png 作为mime-type发送。

/package/download (GET 或 POST)

请求下载通过 id 识别的包。如果服务器配置为这样做,包将进行存储签名。如果请求参数包含 硬件-id,它将被纳入存储签名。

参数
id必需的指定要下载的包的id。
架构可选的指定要下载的包的架构。如果省略,服务器将使用平台独立的(all)包,如果可用。
硬件ID可选的下载包的设备的硬件id。如果指定,则包的存储签名将包含此令牌。
结果

有多个可能的场景

404(未找到)找不到 id 对应的包。
500(内部错误)指令包服务器为下载包存储签名,但签名失败。详细的错误消息打印在服务器的控制台上。
200(ok)找到了匹配的包,它已存储签名(如果配置了的话),并开始下载。包以 application/octet-stream 设置的mime-type发送。

/package/upload (PUT)

将包上传到服务器。服务器将解析并验证包。如果包有效,它将被添加到服务器上可用的包列表中。如果出现问题,服务器将响应一个错误消息。

结果

服务器将返回HTTP代码200和一个包含以下字段的JSON对象

状态ok,如果包成功上传,否则 fail
结果其中 added(上传了新包),updated(已更新现有包)或 no changes(已上传精确相同的包)之一。
id上传包的 id
架构上传包的 架构
消息如果上传失败,此字段包含一个可读的错误消息。

/package/remove (POST)

向服务器发送包删除请求。服务器将删除所有匹配给定 id架构 的包。如果没有指定 架构,将删除给定包的所有架构。

参数
id必需的指定要删除的包的id。
架构可选的如果指定,仅删除给定架构的包。
结果

服务器将返回HTTP代码200和一个包含以下字段的JSON对象

状态ok 如果至少删除了一个包,否则 fail
删除删除包的数量(整数)。

/category/list (GET 或 POST)

返回服务器上所有目前可用的包定义的所有类别名称。

结果

服务器将使用HTTP代码200和类别名称的JSON数组响应。如果没有可用包,或其中没有任何包具有类别,则数组为空。


示例

# Send a hello request:
$ curl -s 'http://localhost:8020/hello?project-id=MYPROJID' | json_pp

# Upload a package:
$ curl -s -X PUT --data-binary "@hello-world.ampkg" 'http://localhost:8020/package/upload' | json_pp

# Remove a package:
$ curl -s -X POST 'http://localhost:8020/package/remove?id=hello.world&architecture=all' | json_pp

# Download a package for Linux/x86-64, bound to a specific hardware id:
$ curl -s -X POST 'http://localhost:8020/package/download?id=hello.world&architecture=linux_x86_64&hardware-id=08154711'

版权所有© 2024 Qt公司有限公司。这里包含的文档贡献为其各自的版权所有者所有。提供的文档是根据自由软件基金会发布的GNU自由文档许可证第1.3版许可的。GNU自由文档许可证版本1.3。Qt及其相关标志是芬兰及/或其他国家Qt公司有限公司的商标。所有其他商标均为其各自所有者的财产。