OpenLogi 如何用 openlogi assets sync --base 或 OPENLOGI_ASSETS 固定单一设备资产镜像?
2026/9/13 7:07:15 网站建设 项目流程

OpenLogi 如何用 openlogi assets sync --base 或 OPENLOGI_ASSETS 固定单一设备资产镜像?

【免费下载链接】OpenLogi⚡️A native, local-first alternative to Logitech Options+, written in Rust 🦀 — remap buttons, DPI, and SmartShift over HID++. No account, no telemetry.项目地址: https://gitcode.com/GitHub_Trending/op/OpenLogi

OpenLogi 的设备渲染图(热点元数据、产品图、配色变体)平时通过openlogi assets sync或 GUI 的后台同步从镜像下载。默认行为是同时探测assets.openlogi.org、版本化的 Cloudflare Pages 发布别名和固定版本的 jsDelivr npm 发布,三个源并发探测,第一个返回完整有效目录(catalog)的镜像为整个同步进程提供index.json和后续全部文件 URL。这种自动选择意味着每次运行的来源可能不同。当你需要把某一次(或某个进程内所有)资产同步固定到单一镜像源——例如开发、诊断,或指向自建/内网的资产主机——openlogiCLI 提供--base参数和OPENLOGI_ASSETS环境变量两种方式,二者效果相同:用指定地址替代自动镜像选择。

两种固定单一来源的方式

两种方式最终都走同一条代码路径:AssetSource::Override,即"显式的OPENLOGI_ASSETS或 CLI--base覆盖",覆盖后本次同步的所有文件都从这一个统一来源(uniform origin)拉取,缓存不会在一次同步中途混用不同镜像(见 source.rs 中AssetRegistry::load的实现说明)。

方式一,单次运行的--base参数:

openlogi assets sync --base <URL>

方式二,OPENLOGI_ASSETS环境变量。--base在 CLI 定义上本身就声明env = "OPENLOGI_ASSETS"(见 sync.rs 的SyncArgs),所以临时设置变量等价于传参数:

OPENLOGI_ASSETS=<URL> openlogi assets sync

<URL>替换为你自己的资产基址。基址必须能在其根路径提供一个有效的资产目录:探测阶段会请求该来源的index.json并解析校验,任何一步失败即视为该来源不可用。因此使用自定义主机时,先确认它按 index.rs 定义的 schema 提供index.json(含各 depot 的asset_path与文件清单),再执行同步。

<URL>可以指向任何按上述约定提供目录的主机,包括自建服务器;文档没有推荐特定的自建托管方案,可用性由你自己保证。

执行同步并观察副作用

openlogi assets sync拉取的是整个注册表目录中各 depot 所需的全部文件,而不仅是单台设备——--base固定的是"来源"这一单一维度,不筛选设备。运行前注意两点:

  • 输出目录由--out指定,默认值是crates/openlogi-desktop/assets(相对当前工作目录),该目录会被自动创建。
  • 同步会删除输出目录中已不在目录清单里的 depot 子目录("prune orphans"),以保持与注册表一致。不要把你自己的其他文件放进同一个--out目录。

一条典型的最小主路径:

openlogi assets sync --base <URL>

需要更多细节时设置OPENLOGI_LOG=debug获取 CLI、GUI 和 agent 共用的详细追踪(见 USAGE.md)。

如何验证来源已生效

命令输出可以直接判断固定是否成功。同步开始时打印:

asset source: <你传入的 URL> index.json: <N> devices

asset source:一行显示的就是本次同步实际使用的基址(AssetSource的显示格式对覆盖来源直接输出你给的 base 字符串,见 source.rs 的Display实现)。如果这里打印的不是你设置的 URL,说明--base没有传进去或OPENLOGI_ASSETS未在当前 shell 生效。

随后的验证点按顺序为:

  1. 目录解析成功index.json: N devices说明该单一来源的目录已下载并解析。三个内置源全部失败时命令会以SourcesUnavailable报错并带上各来源的错误;使用覆盖来源时,失败则直接是该 URL 的探测错误。
  2. 文件下载/命中:每个 depot 的文件按fetch_entry_if_stale处理,sha256 一致则计为缓存命中,不一致才重新下载;输出形如<depot>/<文件名> (<字节数> B)
  3. 收尾汇总:最后一行为done: <fetched> fetched, <cache_hits> cache-hit, <MB> MB total under <out>,其中<out>应与你指定(或默认)的--out一致。
  4. 磁盘落盘:输出目录下应有index.json和各 depot 子目录(index.json以覆盖写方式落到--out根部)。再次运行同一命令,文件未变化时应全部计为 cache-hit。

个别 depot 缺少热点元数据(core_metadata.json/metadata.json)或主渲染图(front_core.png/front.png)时会打印WARN行,但命令仍继续并把已有文件打包进来;这类 depot 在 GUI 中不会显示渲染图(例如摄像头、接收器、纯键盘),属于已知行为,不算来源固定失败。

与 GUI 的 asset_source 配置的关系

固定单一来源不只影响 CLI。GUI 的自动与手动设备资产下载同样遵循这条优先级:OPENLOGI_ASSETS环境变量优先于配置文件中的持久偏好,未设置时才使用[app_settings]里保存的asset_source(取值automaticopenlogicloudflarefastly,默认automatic,即并发探测内置镜像;配置路径与完整示例见 CONFIGURATION.md 及 config.example.toml)。实现说明见 sync.rs 中selected_source的注释:"OPENLOGI_ASSETSoverride wins, otherwise the user's saved preference"。

也就是说:

  • asset_source配置只能在三类内置来源之间选择,适合长期使用某一官方镜像;
  • OPENLOGI_ASSETS进程级覆盖,文档定位为开发与诊断用途,适合临时指向任意自定义主机;
  • 两者同时存在时以OPENLOGI_ASSETS为准,且它无法在进程运行期间改变。

若完全不需要网络请求,auto_download_assets = false会让应用不做任何资产网络请求,GUI 回退到打包内置的图片和合成剪影;设置中手动的 "Refresh assets" 仍会按需发起请求。

边界与限制

  • --base/OPENLOGI_ASSETS固定的是来源,不会只下载单一设备;它把"并发竞速选择镜像"替换为"单一统一来源"。
  • 覆盖来源不提供内置三源那样的多路径容错:该 URL 不可达或目录无效,本次同步即失败。
  • 该 URL 必须提供完整的资产目录结构;文件逐个按注册表中的 sha256 校验,注册表未列出的文件会被跳过(GUI 缓存路径的说明见 sync.rs 中fetch_to_cache注释)。
  • 内置三个镜像的具体地址(assets.openlogi.org、Cloudflare Pages 分支别名、jsDelivr 上的@logi-assets/catalog@0.1.0固定版本包)定义在 source.rs 顶部常量中,可作为自建主机需要模仿的目录布局参考。

完成验证后,若asset source:行显示的是你的 base、汇总行落在预期--out目录且重复运行全部为缓存命中,即说明单一镜像固定已生效。

【免费下载链接】OpenLogi⚡️A native, local-first alternative to Logitech Options+, written in Rust 🦀 — remap buttons, DPI, and SmartShift over HID++. No account, no telemetry.项目地址: https://gitcode.com/GitHub_Trending/op/OpenLogi

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询