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> devicesasset source:一行显示的就是本次同步实际使用的基址(AssetSource的显示格式对覆盖来源直接输出你给的 base 字符串,见 source.rs 的Display实现)。如果这里打印的不是你设置的 URL,说明--base没有传进去或OPENLOGI_ASSETS未在当前 shell 生效。
随后的验证点按顺序为:
- 目录解析成功:
index.json: N devices说明该单一来源的目录已下载并解析。三个内置源全部失败时命令会以SourcesUnavailable报错并带上各来源的错误;使用覆盖来源时,失败则直接是该 URL 的探测错误。 - 文件下载/命中:每个 depot 的文件按
fetch_entry_if_stale处理,sha256 一致则计为缓存命中,不一致才重新下载;输出形如<depot>/<文件名> (<字节数> B)。 - 收尾汇总:最后一行为
done: <fetched> fetched, <cache_hits> cache-hit, <MB> MB total under <out>,其中<out>应与你指定(或默认)的--out一致。 - 磁盘落盘:输出目录下应有
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(取值automatic、openlogi、cloudflare、fastly,默认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),仅供参考