移动/游戏
在 Limrun 远程构建执行上构建 Bazel…
当项目是 Bazel 工作区(MODULE.bazel/WORKSPACE)构建 rules_apple/rules_swift 目标,且希望无需本地 Mac 就能 bazel build 或在模拟器上运行时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
在 Limrun 远程构建执行上构建 B特定
解决思路
- 安装 CLI:`npm install --global lim`;认证用 `lim login` 或 `LIM_API_KEY`(可能已在项目外设置,不要仅因缺失就索要)。CLI 是权威来源:若某 flag 报错或需要未列出的 flag,查 `lim xcode rbe --help`,不要猜测。
- 从 Bazel 工作区根目录(含 `MODULE.bazel` / `WORKSPACE`)运行 `lim xcode rbe`。它会创建实例 + `.limrun/` 配置,并打印确切的构建命令。隧道在后台运行(打印 PID);`--no-daemon` 保持前台。
- 运行打印出的命令,例如 `bazelisk --digest_function=sha256 build --config=limrun //App`。不要手写 `.limrun/` 或 flags——CLI 会根据沙箱的 Xcode 和你的操作系统生成它们。
- 用 `lim xcode version set 27`(或一次性 `lim xcode rbe --xcode-version 27`)以另一个已安装的主版本构建。在机群 Xcode 升级或切换 Xcode 后,先 `--stop` 再重新运行 `lim xcode rbe` 以刷新。
- 要在不编辑生成配置的情况下向 limrun 路径添加自己的 Bazel flags,把它们放在工作区根目录的 `user.limrun.bazelrc`。生成的配置最后 try-import 它,所以你的 `build:limrun --…` 行会生效,且它在 `lim xcode rbe` 重新生成后仍保留(`.limrun/` 不会)。
- `lim xcode rbe` 仅构建;当用户想查看或运行应用时附加模拟器。检查或附加(它会立即安装上次构建,无需重新构建):`lim xcode get`(是否已附加模拟器?)、`lim ios create --attach`(附加一个)。
- 在没有浏览器展示给用户时加 `--no-open`;它会跳过本地打开流 URL,但仍打印出来供分享。
- 如果附加输出包含签名的流 URL,以 Markdown 链接分享给用户,例如 `[Live simulator](<signed-stream-url>)`。
- 附加模拟器后,每次成功的 `--config=limrun` 构建会自动重新安装并重启应用,无需单独的安装步骤:`bazelisk --digest_function=sha256 build --config=limrun //App`。
- 如果已知需要模拟器,提前附加:`lim xcode rbe --ios`(启动时附加,`--stop` 时移除)。
- 自动安装发生在服务端,基于构建事件;没有 `lim xcode rbe install` 子命令或 `--target` flag。要强制重新安装,重新构建(缓存命中的重新构建只需几秒)。
- 自动安装仅在成功调用产生单个应用时触发,所以在多应用工作区中每次调用构建一个应用目标(`//App`,而非 `//...`);多应用构建会成功但不安装任何东西。
- 要点击、输入、读取元素树、截图或录制运行中的应用,切换到 `limrun-ios-simulator` 技能。
- 要将构建发布为 Limrun 资产(预览链接、在其他模拟器上安装、CI 产物),在隧道启动时启用上传或事后上传一次构建:`lim xcode rbe --auto-upload preview/my-app --upload-ttl 24h`(每次成功构建刷新资产)、`lim xcode rbe upload preview/my-app --ttl 24h`(一次性:最新的成功构建)。
- `--auto-upload` 在隧道生命周期内有效:每次成功的 `--config=limrun` 构建都会以该资产名重新上传应用,无需构建后步骤。上传结果落在 `.limrun/rbe.log`。
- `rbe upload` 从工作区根目录运行,需要后台隧道加至少一次成功构建;否则报错。
- TTL 是 Go duration(`24h`、`30m`;`1d` 无效)且可选;每次不带 TTL 的上传会把资产过期时间推到该次上传后 14 天。
- 要更改运行中隧道的 `--auto-upload` 配置,`--stop` 后重新运行;CLI 会拒绝不匹配的重新启用,而不是静默忽略。
- 在浏览器中预览已上传的应用:`https://console.limrun.com/preview?asset=<name>&platform=ios`。
- 用 `lim xcode rbe --stop` 停止(约 20 秒拆除远程栈),并用 `lim xcode delete <id>` 删除实例。
- 始终在 `build` 前传 `--digest_function=sha256`(逐字使用 CLI 打印的命令)。Limrun 缓存仅支持 SHA256;Bazel 9 默认 BLAKE3。它是启动 flag,不能放在 `--config=limrun` 中。症状:构建 → `Cannot use hash function BLAKE3 with remote cache`;安装 → `non-SHA256 digest … rebuild with --digest_function=sha256`。
- 从工作区根目录运行 `lim xcode rbe`,而非子目录——它在那里写 `.limrun/`,否则快速失败。
- 绿色构建不能证明远程执行——缓存命中(`action cache hit` / `remote cache hit`)会让构建在隧道消失时也通过。要强制并验证真实远程执行,见 `references/verify-remote.md`。
- 打印的 `.ipa` 路径不会存在于你的机器上——构建命令带有 `--remote_download_outputs=minimal`,它把产物留在实例缓存中,不下载任何东西。Bazel 仍会打印通常的 `Target //App:App up-to-date: …/App.ipa` 行,但该文件不在磁盘上。这是预期行为,不是构建失败。附加模拟器时,构建从产物的缓存摘要自动安装(从构建事件日志读取,而非本地文件)。只有确实需要本地 `.ipa` 时,才从构建命令去掉 `--remote_download_outputs=minimal`,Bazel 会下载顶层输出;自动安装两种方式都继续工作。
- 新实例首次构建可能失败并报 `Lost inputs no longer available remotely`(例如 `… Assets.car`)。这是实例间的瞬态缓存驱逐,不是代码错误;Bazel 会打印 `Found transient remote cache error, retrying the build...` 且重试成功。为避免在演示中途遇到,在 `lim xcode rbe` 后立即用完整构建预热。
- `You don't have permission to save … in "CoreSimulator"`(actool/ibtool)是机群侧设备缺口,不是你的配置问题。重试;若持续存在,向 Limrun 报告。
- 项目自身的 Bazel 设置可能与 RBE 冲突(通过 Starlark transition 固定 Xcode、自定义 `remote_default_exec_properties`、对沙箱不友好的 genrules)。这些是项目特有的,不是 Limrun bug——在断定 RBE 损坏前先走查 `references/project-compatibility.md`。
适用边界 · 注意事项
- 非 Bazel(纯 xcodebuild)项目应使用 limrun-xcode 技能,而非本技能。
- 若只想点击、输入、截图或与运行中的应用交互,应切换到 limrun-ios-simulator 技能。
- 若项目自身的 Bazel 设置(Xcode transition、自定义 remote_default_exec_properties、沙箱不友好的 genrules)与 RBE 冲突,需先走查 references/project-compatibility.md,不要直接断定 RBE 损坏。