包服务器
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> 、any 或 localhost 之一。可以通过 :<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
目录。此目录包含实际包,并由包服务器管理。您可以从此目录中删除包,但如果这样做,则必须重新启动服务器。
文件系统操作
包服务器在数据目录内创建两个特殊目录:upload
和 remove
。
- 放置在
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)
返回可用应用程序的列表。此列表可以通过可选的category、filter和architecture参数进一步过滤。
参数
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公司有限公司的商标。所有其他商标均为其各自所有者的财产。