{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "氓氓小栈",
  "home_page_url": "https://www.mangmang.fun/",
  "feed_url": "https://www.mangmang.fun/feed.json",
  "description": "氓氓小栈",
  "items": [
    {
      "title": "自建服务公网链路复盘：DSH 断连、带宽优化与 RustDesk 端口收敛",
      "url": "https://www.mangmang.fun/apps/dsh-frp-caddy-network-troubleshooting.html",
      "id": "https://www.mangmang.fun/apps/dsh-frp-caddy-network-troubleshooting.html",
      "summary": "本次排查从 DSH 公网页面反复显示“连接成功 / 立即重连”开始，逐步检查了腾讯云 Caddy、frps、本机 frpc 和软路由上的其他隧道，并完成心跳容忍度调整、HTTP 压缩优化、RustDesk API 端口收敛及失效站点清理。本文记录实际改动、验证结果和仍未证实的部分，避免把临时缓解误写成已经定位底层根因。",
      "content_html": "<p>本次排查从 DSH 公网页面反复显示“连接成功 / 立即重连”开始，逐步检查了腾讯云 Caddy、frps、本机 frpc 和软路由上的其他隧道，并完成心跳容忍度调整、HTTP 压缩优化、RustDesk API 端口收敛及失效站点清理。本文记录实际改动、验证结果和仍未证实的部分，避免把临时缓解误写成已经定位底层根因。</p>\n<!-- more -->\n<h2>1. 环境与链路</h2>\n<p>诊断时间为 2026 年 9 月 19 日。以下配置只代表当时部署，不代表后续版本的默认行为。示例以 <code>example.com</code> 替代真实域名，不包含认证口令、令牌、私钥或用户会话数据。</p>\n<p>DSH 的隧道已从软路由移到 DSH 主机，frpc 使用 host 网络连接本机回环地址。DSH 保持监听 <code>127.0.0.1:3080</code>，通过 <code>trustedHosts</code> 接受公网域名。旧的 <code>13080 → 3080</code> Node 转发方案不再承载访问。</p>\n<p>RustDesk 原生客户端使用独立的 ID、打洞和中继端口，不经过上图中的 frp HTTP 隧道；Web Client 另有 Caddy 代理的 WebSocket 入口。</p>\n<h2>2. DSH 反复断连：证据与边界</h2>\n<h3>2.1 现象</h3>\n<ul>\n<li>本地地址访问稳定，多台电脑通过公网域名访问都会反复重连。</li>\n<li>问题出现时 DSH 主进程并非持续崩溃重启。</li>\n<li>公网链路能够建立 WebSocket，并非完全不支持 Upgrade。</li>\n<li>Caddy 和 frps 日志出现过 <code>unexpected EOF</code>、<code>context canceled</code> 和 <code>EOF</code>。</li>\n</ul>\n<p>日志里的 SSE <code>/plugins/events</code> 与 WebSocket <code>/api/remote.mux</code> 是不同连接。不能把所有 EOF 都算作 WebSocket 故障，刷新页面和服务重启也会关闭请求。</p>\n<h3>2.2 当时实现的心跳机制</h3>\n<p>检查已安装的 <code>@deepseek-ai/dsh-api-gateway</code> 运行代码，发现：</p>\n<div class=\"language-text line-numbers-mode\" data-highlighter=\"shiki\" data-ext=\"text\" style=\"--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34\"><pre class=\"shiki shiki-themes one-light one-dark-pro vp-code\"><code class=\"language-text\"><span class=\"line\"><span>默认 websocketHeartbeatIntervalMs = 2000</span></span>\n<span class=\"line\"><span>MAX_MISSED_HEARTBEATS = 2</span></span>\n<span class=\"line\"><span>收到 Pong 后将未应答计数清零</span></span>\n<span class=\"line\"><span>达到阈值后执行 socket.terminate()</span></span></code></pre>\n<div class=\"line-numbers\" aria-hidden=\"true\" style=\"counter-reset:line-number 0\"><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div></div></div><p>在定时器正常运行的情况下，短暂的几秒停顿就可能触发关闭。不能只用连接寿命是否接近 2 秒的整数倍来判定原因。</p>\n<h3>2.3 已观察到什么</h3>\n<p>| 证据 | 可以得出的结论 | 不能得出的结论 |<br>\n|</p>\n",
      "date_published": "2026-09-19T00:00:00.000Z",
      "authors": [],
      "tags": [
        "应用"
      ]
    },
    {
      "title": "Go 三服务在线优先、离线回退编译与发布流程",
      "url": "https://www.mangmang.fun/programming/backend/go/Go%E5%B7%A5%E7%A8%8B%E5%8C%96/go-online-offline-build.html",
      "id": "https://www.mangmang.fun/programming/backend/go/Go%E5%B7%A5%E7%A8%8B%E5%8C%96/go-online-offline-build.html",
      "summary": "本文记录一套面向定制 Linux 环境的 Go 构建方案：仓库内固定 Go 工具链，有网时优先从模块代理解析依赖，无网或在线编译失败时自动切换到仓库内的共享 vendor，最终生成三个可直接部署的 Linux x86_64 静态可执行文件。",
      "content_html": "<p>本文记录一套面向定制 Linux 环境的 Go 构建方案：仓库内固定 Go 工具链，有网时优先从模块代理解析依赖，无网或在线编译失败时自动切换到仓库内的共享 <code>vendor</code>，最终生成三个可直接部署的 Linux x86_64 静态可执行文件。</p>\n<!-- more -->\n<h2>一、背景与目标</h2>\n<p>定制系统上的软件版本、动态库和运行环境通常经过整体验证。为了编译一个 Go 项目去更换 <code>yum</code>/<code>apt</code> 软件源，或者升级系统已有组件，风险往往大于收益。另一方面，构建服务器的网络条件也不一定稳定，完全依赖公网会让发布流程失去可预期性。</p>\n<p>这套方案遵循以下原则：</p>\n<ol>\n<li>不安装或升级系统软件，不修改系统软件源。</li>\n<li>Go 版本和工具链校验值由仓库固定。</li>\n<li>有网时使用模块代理，但不自动修改 <code>go.mod</code> 和 <code>go.sum</code>。</li>\n<li>无网或在线编译失败时，整体回退到共享 <code>vendor</code>。</li>\n<li>只构建指定的三个服务，不扫描和发布其他模块。</li>\n<li>在临时目录完成全部编译，成功后再替换正式产物。</li>\n</ol>\n<h2>二、整体流程</h2>\n<p>这里的“在线”仅指 Go 模块依赖解析。脚本不会执行 <code>git pull</code>、<code>go get</code> 或 <code>go mod tidy</code>，也不会动态更新业务代码。</p>\n<h2>三、构建目录设计</h2>\n<p>项目的 Go 构建入口位于：</p>\n<div class=\"language-text line-numbers-mode\" data-highlighter=\"shiki\" data-ext=\"text\" style=\"--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34\"><pre class=\"shiki shiki-themes one-light one-dark-pro vp-code\"><code class=\"language-text\"><span class=\"line\"><span>src_go/build/</span></span>\n<span class=\"line\"><span>├── build.sh</span></span>\n<span class=\"line\"><span>├── README.md</span></span>\n<span class=\"line\"><span>├── go.work</span></span>\n<span class=\"line\"><span>├── go.work.sum</span></span>\n<span class=\"line\"><span>├── go_list.txt</span></span>\n<span class=\"line\"><span>├── toolchain.env</span></span>\n<span class=\"line\"><span>├── runtime/</span></span>\n<span class=\"line\"><span>│   ├── gocontrol.sh</span></span>\n<span class=\"line\"><span>│   ├── cygfileweb.sh</span></span>\n<span class=\"line\"><span>│   ├── cygauditweb.sh</span></span>\n<span class=\"line\"><span>│   └── cygimagealgoweb.sh</span></span>\n<span class=\"line\"><span>├── toolchains/</span></span>\n<span class=\"line\"><span>│   └── go1.25.12.linux-amd64.tar.gz</span></span>\n<span class=\"line\"><span>└── vendor/</span></span>\n<span class=\"line\"><span>    ├── modules.txt</span></span>\n<span class=\"line\"><span>    └── ...</span></span></code></pre>\n<div class=\"line-numbers\" aria-hidden=\"true\" style=\"counter-reset:line-number 0\"><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div></div></div><p>首次执行后会在本地生成缓存：</p>\n<div class=\"language-text line-numbers-mode\" data-highlighter=\"shiki\" data-ext=\"text\" style=\"--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34\"><pre class=\"shiki shiki-themes one-light one-dark-pro vp-code\"><code class=\"language-text\"><span class=\"line\"><span>src_go/build/.cache/</span></span>\n<span class=\"line\"><span>├── toolchains/</span></span>\n<span class=\"line\"><span>│   └── go-1.25.12/</span></span>\n<span class=\"line\"><span>├── go-build/</span></span>\n<span class=\"line\"><span>├── gopath/</span></span>\n<span class=\"line\"><span>└── work/</span></span></code></pre>\n<div class=\"line-numbers\" aria-hidden=\"true\" style=\"counter-reset:line-number 0\"><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div></div></div><p><code>.cache/</code> 只是当前工作区的解压和编译缓存，不应提交到版本管理。删除它不会丢失源码，下次构建只会重新解压工具链并生成缓存。</p>\n<h2>四、固定 Go 工具链</h2>\n<p><code>toolchain.env</code> 锁定构建工具版本、归档文件名和 SHA256：</p>\n<div class=\"language-bash line-numbers-mode\" data-highlighter=\"shiki\" data-ext=\"bash\" style=\"--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34\"><pre class=\"shiki shiki-themes one-light one-dark-pro vp-code\"><code class=\"language-bash\"><span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">GO_VERSION</span><span style=\"--shiki-light:#383A42;--shiki-dark:#56B6C2\">=</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"1.25.12\"</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">GO_ARCHIVE</span><span style=\"--shiki-light:#383A42;--shiki-dark:#56B6C2\">=</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"go1.25.12.linux-amd64.tar.gz\"</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">GO_ARCHIVE_SHA256</span><span style=\"--shiki-light:#383A42;--shiki-dark:#56B6C2\">=</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"234828b7a89e0e303d2556310ee549fbcf253d28de937bac3da13d6294262ac1\"</span></span></code></pre>\n<div class=\"line-numbers\" aria-hidden=\"true\" style=\"counter-reset:line-number 0\"><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div></div></div><p>构建前可以先做轻量检查：</p>\n<div class=\"language-bash line-numbers-mode\" data-highlighter=\"shiki\" data-ext=\"bash\" style=\"--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34\"><pre class=\"shiki shiki-themes one-light one-dark-pro vp-code\"><code class=\"language-bash\"><span class=\"line\"><span style=\"--shiki-light:#0184BC;--shiki-dark:#56B6C2\">cd</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> src_go/build</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#4078F2;--shiki-dark:#61AFEF\">./build.sh</span><span style=\"--shiki-light:#986801;--shiki-dark:#D19A66\"> --check</span></span></code></pre>\n<div class=\"line-numbers\" aria-hidden=\"true\" style=\"counter-reset:line-number 0\"><div class=\"line-number\"></div><div class=\"line-number\"></div></div></div><p>检查项包括：</p>\n<ul>\n<li>当前主机必须是 Linux x86_64。</li>\n<li>内置 Go 归档必须存在，SHA256 必须一致。</li>\n<li>共享 <code>vendor/modules.txt</code> 必须存在。</li>\n<li>三个目标模块都必须包含 <code>go.mod</code> 和 <code>main.go</code>。</li>\n<li>四个运行脚本必须完整。</li>\n</ul>\n<p>通过校验后，工具链被解压到项目缓存目录，而不是 <code>/usr/local/go</code> 或其他系统目录。脚本还会设置：</p>\n<div class=\"language-bash line-numbers-mode\" data-highlighter=\"shiki\" data-ext=\"bash\" style=\"--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34\"><pre class=\"shiki shiki-themes one-light one-dark-pro vp-code\"><code class=\"language-bash\"><span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">GOTOOLCHAIN</span><span style=\"--shiki-light:#383A42;--shiki-dark:#56B6C2\">=</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">local</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">GOENV</span><span style=\"--shiki-light:#383A42;--shiki-dark:#56B6C2\">=</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">off</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">CGO_ENABLED</span><span style=\"--shiki-light:#383A42;--shiki-dark:#56B6C2\">=</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">0</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">GOOS</span><span style=\"--shiki-light:#383A42;--shiki-dark:#56B6C2\">=</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">linux</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">GOARCH</span><span style=\"--shiki-light:#383A42;--shiki-dark:#56B6C2\">=</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">amd64</span></span></code></pre>\n<div class=\"line-numbers\" aria-hidden=\"true\" style=\"counter-reset:line-number 0\"><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div></div></div><p><code>GOTOOLCHAIN=local</code> 防止 Go 根据模块声明自动下载另一套工具链，<code>GOENV=off</code> 避免用户全局 Go 配置干扰本次构建。</p>\n<h2>五、管理三个目标服务</h2>\n<p><code>go_list.txt</code> 是唯一的目标清单：</p>\n<div class=\"language-text line-numbers-mode\" data-highlighter=\"shiki\" data-ext=\"text\" style=\"--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34\"><pre class=\"shiki shiki-themes one-light one-dark-pro vp-code\"><code class=\"language-text\"><span class=\"line\"><span>sunri-cygfileweb</span></span>\n<span class=\"line\"><span>sunri-cygauditweb</span></span>\n<span class=\"line\"><span>sunri-cygimagealgoweb</span></span></code></pre>\n<div class=\"line-numbers\" aria-hidden=\"true\" style=\"counter-reset:line-number 0\"><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div></div></div><p>脚本会将模块名前缀 <code>sunri-</code> 去掉，生成下列产物：</p>\n<p>| 源码模块 | 可执行文件 |<br>\n|</p>\n",
      "date_published": "2026-07-21T00:00:00.000Z",
      "authors": [],
      "tags": [
        "Go"
      ]
    },
    {
      "title": "Java 双服务离线编译、依赖加密与发布流程",
      "url": "https://www.mangmang.fun/programming/backend/java/%E5%8A%9F%E8%83%BD%E6%95%B4%E7%90%86/Java-%E5%8F%8C%E6%9C%8D%E5%8A%A1%E7%A6%BB%E7%BA%BF%E7%BC%96%E8%AF%91-%E4%BE%9D%E8%B5%96%E5%8A%A0%E5%AF%86%E4%B8%8E%E5%8F%91%E5%B8%83%E6%B5%81%E7%A8%8B.html",
      "id": "https://www.mangmang.fun/programming/backend/java/%E5%8A%9F%E8%83%BD%E6%95%B4%E7%90%86/Java-%E5%8F%8C%E6%9C%8D%E5%8A%A1%E7%A6%BB%E7%BA%BF%E7%BC%96%E8%AF%91-%E4%BE%9D%E8%B5%96%E5%8A%A0%E5%AF%86%E4%B8%8E%E5%8F%91%E5%B8%83%E6%B5%81%E7%A8%8B.html",
      "summary": "本文记录一套适用于定制 Linux 环境的 Java 构建与发布方案：不安装系统软件、不修改系统软件源、不污染用户 Maven 仓库，在仓库内固定 JDK、Maven 和加密工具版本，只构建指定的两个 Spring Boot 服务，并将共享依赖加密后原子发布。",
      "content_html": "<p>本文记录一套适用于定制 Linux 环境的 Java 构建与发布方案：不安装系统软件、不修改系统软件源、不污染用户 Maven 仓库，在仓库内固定 JDK、Maven 和加密工具版本，只构建指定的两个 Spring Boot 服务，并将共享依赖加密后原子发布。</p>\n<!-- more -->\n<h2>一、背景与目标</h2>\n<p>目标服务器通常不能稳定访问公网，也不适合通过 <code>yum</code>、<code>apt</code> 或替换软件源来升级 Java、Maven、Git 等基础工具。对于已经交付的定制系统，修改系统环境还可能影响同机运行的其他程序。</p>\n<p>因此，这套方案遵循以下原则：</p>\n<ol>\n<li>构建工具随项目固定，不依赖服务器预装版本。</li>\n<li>工具链解压到项目缓存，不写 <code>/usr</code>、<code>/opt</code> 等系统目录。</li>\n<li>Maven 使用项目独立的本地仓库，不修改或污染 <code>~/.m2</code>。</li>\n<li>加密工具优先使用仓库内置源码归档，不要求构建机安装 Git，也不在脚本中保存凭据。</li>\n<li>只构建 <code>cygcenterweb</code> 和 <code>cygsignsrvweb</code>，避免产生无关服务。</li>\n<li>先在临时目录完成编译、收集、加密和校验，全部成功后再替换正式产物。</li>\n</ol>\n<p>这里的“离线”需要分成两层理解：</p>\n<ul>\n<li><strong>工具链离线</strong>：JDK、Maven 和加密工具源码都由仓库提供，不访问公网。</li>\n<li><strong>业务依赖解析</strong>：如果项目独立 Maven 仓库还是空的，第一次构建仍需要访问可用的内网 Maven 制品库。缓存完整后才可以在断网环境重复构建。</li>\n</ul>\n<h2>二、整体流程</h2>\n<p>构建脚本位于：</p>\n<div class=\"language-text line-numbers-mode\" data-highlighter=\"shiki\" data-ext=\"text\" style=\"--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34\"><pre class=\"shiki shiki-themes one-light one-dark-pro vp-code\"><code class=\"language-text\"><span class=\"line\"><span>src_java/package/build.sh</span></span></code></pre>\n<div class=\"line-numbers\" aria-hidden=\"true\" style=\"counter-reset:line-number 0\"><div class=\"line-number\"></div></div></div><p>最终产物位于：</p>\n<div class=\"language-text line-numbers-mode\" data-highlighter=\"shiki\" data-ext=\"text\" style=\"--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34\"><pre class=\"shiki shiki-themes one-light one-dark-pro vp-code\"><code class=\"language-text\"><span class=\"line\"><span>binary/java/</span></span>\n<span class=\"line\"><span>├── bin/</span></span>\n<span class=\"line\"><span>│   ├── javacontrol.sh</span></span>\n<span class=\"line\"><span>│   ├── cygcenterweb.sh</span></span>\n<span class=\"line\"><span>│   └── cygsignsrvweb.sh</span></span>\n<span class=\"line\"><span>└── jar/x64/</span></span>\n<span class=\"line\"><span>    ├── cygcenterweb.jar</span></span>\n<span class=\"line\"><span>    ├── cygsignsrvweb.jar</span></span>\n<span class=\"line\"><span>    └── libs/</span></span>\n<span class=\"line\"><span>        ├── cygcenterweb-requirements.txt</span></span>\n<span class=\"line\"><span>        ├── cygsignsrvweb-requirements.txt</span></span>\n<span class=\"line\"><span>        └── *.jar</span></span></code></pre>\n<div class=\"line-numbers\" aria-hidden=\"true\" style=\"counter-reset:line-number 0\"><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div></div></div><h2>三、构建目录设计</h2>\n<p>构建相关目录如下：</p>\n<div class=\"language-text line-numbers-mode\" data-highlighter=\"shiki\" data-ext=\"text\" style=\"--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34\"><pre class=\"shiki shiki-themes one-light one-dark-pro vp-code\"><code class=\"language-text\"><span class=\"line\"><span>src_java/package/</span></span>\n<span class=\"line\"><span>├── build.sh</span></span>\n<span class=\"line\"><span>├── README.md</span></span>\n<span class=\"line\"><span>├── settings.xml</span></span>\n<span class=\"line\"><span>├── toolchain.env</span></span>\n<span class=\"line\"><span>├── runtime/</span></span>\n<span class=\"line\"><span>│   ├── javacontrol.sh</span></span>\n<span class=\"line\"><span>│   ├── cygcenterweb.sh</span></span>\n<span class=\"line\"><span>│   └── cygsignsrvweb.sh</span></span>\n<span class=\"line\"><span>└── toolchains/</span></span>\n<span class=\"line\"><span>    ├── openjdk-8u171-linux-x64.tar.gz</span></span>\n<span class=\"line\"><span>    ├── apache-maven-3.6.3-bin.tar.gz</span></span>\n<span class=\"line\"><span>    └── sunri-jar-encrypt-fe837986.tar.gz</span></span></code></pre>\n<div class=\"line-numbers\" aria-hidden=\"true\" style=\"counter-reset:line-number 0\"><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div></div></div><p>执行后还会出现本地缓存：</p>\n<div class=\"language-text line-numbers-mode\" data-highlighter=\"shiki\" data-ext=\"text\" style=\"--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34\"><pre class=\"shiki shiki-themes one-light one-dark-pro vp-code\"><code class=\"language-text\"><span class=\"line\"><span>src_java/package/.cache/</span></span>\n<span class=\"line\"><span>├── downloads/</span></span>\n<span class=\"line\"><span>├── toolchains/</span></span>\n<span class=\"line\"><span>├── m2-repository/</span></span>\n<span class=\"line\"><span>└── work/</span></span></code></pre>\n<div class=\"line-numbers\" aria-hidden=\"true\" style=\"counter-reset:line-number 0\"><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div></div></div><p><code>.cache/</code> 只服务于当前工作区，不应提交版本管理。它包含解压后的工具链、独立 Maven 仓库和单次构建临时目录。</p>\n<p>把 JDK 和 Maven 归档提交到项目会增大仓库体积，但对于无法访问公网、又不能调整系统环境的构建服务器，这是更可控的选择。后续如果有稳定的内网制品库，也可以把归档迁移到制品库，但必须继续保留版本锁定和 SHA256 校验。</p>\n<h2>四、固定构建输入</h2>\n<p>所有关键版本集中在 <code>toolchain.env</code> 中，不由构建机当前环境决定：</p>\n<p>| 组件 | 固定版本 | SHA256 |<br>\n|</p>\n",
      "date_published": "2026-07-21T00:00:00.000Z",
      "authors": [],
      "tags": [
        "Java"
      ]
    },
    {
      "title": "平台认证与鉴权流程",
      "url": "https://www.mangmang.fun/work/project-summary/%E7%AE%97%E6%B3%95%E7%AE%A1%E7%90%86%E5%B9%B3%E5%8F%B0/%E5%B9%B3%E5%8F%B0%E8%AE%A4%E8%AF%81%E4%B8%8E%E9%89%B4%E6%9D%83%E6%B5%81%E7%A8%8B.html",
      "id": "https://www.mangmang.fun/work/project-summary/%E7%AE%97%E6%B3%95%E7%AE%A1%E7%90%86%E5%B9%B3%E5%8F%B0/%E5%B9%B3%E5%8F%B0%E8%AE%A4%E8%AF%81%E4%B8%8E%E9%89%B4%E6%9D%83%E6%B5%81%E7%A8%8B.html",
      "summary": "本文依据当前工程中的实际实现整理，重点覆盖： sunri-service-auth-spi：认证、Token、权限和资源的 Service Bus 接口定义。 sunri-service-auth：账号校验、JWT 签发、实时库会话、角色权限位和资源关系实现。 sunri-web-center：HTTP 登录入口、请求拦截器、@ApiRight 接口鉴...",
      "content_html": "<p>本文依据当前工程中的实际实现整理，重点覆盖：</p>\n<ul>\n<li><code>sunri-service-auth-spi</code>：认证、Token、权限和资源的 Service Bus 接口定义。</li>\n<li><code>sunri-service-auth</code>：账号校验、JWT 签发、实时库会话、角色权限位和资源关系实现。</li>\n<li><code>sunri-web-center</code>：HTTP 登录入口、请求拦截器、<code>@ApiRight</code> 接口鉴权和菜单过滤。</li>\n</ul>\n<p>本文描述的是平台现状，不把它替换成 Spring Security/RBAC 的标准实现。</p>\n<!-- more -->\n<h2>1. 先看结论</h2>\n<p>平台的核心授权链不是“用户 -&gt; 角色 -&gt; 权限记录 -&gt; 接口”这种普通关联表模型，而是：</p>\n<div class=\"language-text line-numbers-mode\" data-highlighter=\"shiki\" data-ext=\"text\" style=\"--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34\"><pre class=\"shiki shiki-themes one-light one-dark-pro vp-code\"><code class=\"language-text\"><span class=\"line\"><span>用户 -> 单个角色 -> 角色的 64 位权限位图 -> 权限位集合</span></span>\n<span class=\"line\"><span>                                         |</span></span>\n<span class=\"line\"><span>                                         +-> 菜单所需权限位</span></span>\n<span class=\"line\"><span>                                         +-> API 所需权限位</span></span></code></pre>\n<div class=\"line-numbers\" aria-hidden=\"true\" style=\"counter-reset:line-number 0\"><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div></div></div><p>登录成功后，角色的 <code>ROLEAUTHORITY</code> 位图会被拆成 <code>Set&lt;Integer&gt;</code>。这个权限集合会同时：</p>\n<ol>\n<li>返回给 Web Center；</li>\n<li>写入实时库的登录会话；</li>\n<li>首次校验受保护请求时缓存在 Web Center 本地；</li>\n<li>用于过滤菜单；</li>\n<li>用于 API 请求鉴权。</li>\n</ol>\n<h2>2. 核心关系图</h2>\n<h3>2.1 主干关系</h3>\n<p>| 起点 | 终点 | 实际字段/规则 | 说明 |<br>\n|</p>\n",
      "date_published": "2026-07-14T00:00:00.000Z",
      "authors": [],
      "tags": [
        "工作",
        "项目总结"
      ]
    },
    {
      "title": "PR7050 全景监控（主辅监控）数据加载流程深度解析",
      "url": "https://www.mangmang.fun/work/project-summary/%E6%99%BA%E8%83%BD%E5%B7%A1%E8%A7%86/pr7050-panoramic-monitoring-data-flow.html",
      "id": "https://www.mangmang.fun/work/project-summary/%E6%99%BA%E8%83%BD%E5%B7%A1%E8%A7%86/pr7050-panoramic-monitoring-data-flow.html",
      "summary": "本文基于 PR7050 项目中全景监控模块（/panoramicMonitoring/main-auxiliaryMonitoring）的实际代码，深入分析组态画面数据加载的完整流程、核心接口、缓存机制及关键注意事项。",
      "content_html": "\n<p>本文基于 PR7050 项目中全景监控模块（<code>/panoramicMonitoring/main-auxiliaryMonitoring</code>）的实际代码，深入分析组态画面数据加载的完整流程、核心接口、缓存机制及关键注意事项。</p>\n<!-- more -->\n<h2>1. 项目概述</h2>\n<p>全景监控模块是 PR7050 系统中用于实时展示变电站设备状态的核心功能模块。它通过组态画面的形式，将设备的遥测、遥信、遥控、遥设等实时数据以图形化方式呈现给用户，支持设备状态监控、遥控操作、告警展示等功能。</p>\n<p><strong>核心特点</strong>：</p>\n<ul>\n<li><strong>图形化展示</strong>：通过组态画面直观展示设备状态</li>\n<li><strong>实时数据刷新</strong>：支持定时轮询和 MQ 推送两种刷新机制</li>\n<li><strong>多级导航</strong>：顶部Tab菜单 + 左侧树提供设备分类导航</li>\n<li><strong>缓存优化</strong>：文件缓存和内存缓存双重优化加载性能</li>\n</ul>\n<h2>2. 整体数据加载流程</h2>\n<p>组态画面的数据加载分为五个主要阶段，形成完整的数据闭环：</p>\n<div class=\"language- line-numbers-mode\" data-highlighter=\"shiki\" data-ext style=\"--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34\"><pre class=\"shiki shiki-themes one-light one-dark-pro vp-code\"><code class=\"language-\"><span class=\"line\"><span>阶段1：获取顶部Tab菜单 → 阶段2：加载左侧导航树 → 阶段3：获取画面属性 → 阶段4：获取实时数据 → 阶段5：定时刷新/MQ推送</span></span></code></pre>\n<div class=\"line-numbers\" aria-hidden=\"true\" style=\"counter-reset:line-number 0\"><div class=\"line-number\"></div></div></div><h3>2.1 阶段一：获取顶部Tab菜单</h3>\n<p><strong>目的</strong>：获取全站总览图列表，作为一级导航菜单</p>\n<p><strong>涉及接口</strong>：</p>\n<p>| 接口路径 | 请求方式 | 作用 |<br>\n| :</p>\n",
      "date_published": "2026-06-17T00:00:00.000Z",
      "authors": [],
      "tags": [
        "工作",
        "项目总结"
      ]
    },
    {
      "title": "tmux + Codex 终端会话管理实战",
      "url": "https://www.mangmang.fun/ai/tmux-codex-workflow.html",
      "id": "https://www.mangmang.fun/ai/tmux-codex-workflow.html",
      "summary": "Codex 很适合在终端里处理长任务，但如果直接跑在普通 shell 里， 终端关闭、SSH 断开、临时切换任务都会影响体验。tmux 的价值就是把 终端会话托管起来：任务可以留在后台，回来以后继续接着看。",
      "content_html": "\n<p>Codex 很适合在终端里处理长任务，但如果直接跑在普通 shell 里，<br>\n终端关闭、SSH 断开、临时切换任务都会影响体验。tmux 的价值就是把<br>\n终端会话托管起来：任务可以留在后台，回来以后继续接着看。</p>\n<!-- more -->\n",
      "date_published": "2026-05-13T00:00:00.000Z",
      "authors": [],
      "tags": [
        "AI"
      ]
    },
    {
      "title": "PR7050 打包启动流程说明",
      "url": "https://www.mangmang.fun/work/project-summary/%E6%99%BA%E8%83%BD%E5%B7%A1%E8%A7%86/pr7050-package-startup-flow.html",
      "id": "https://www.mangmang.fun/work/project-summary/%E6%99%BA%E8%83%BD%E5%B7%A1%E8%A7%86/pr7050-package-startup-flow.html",
      "summary": "本文档基于当前仓库脚本重新整理。所有路径、密码、服务清单均以 PR7050 当前文件为准，不沿用 PR7950 目录。",
      "content_html": "\n<p>本文档基于当前仓库脚本重新整理。所有路径、密码、服务清单均以 PR7050 当前文件为准，不沿用 PR7950 目录。</p>\n<!-- more -->\n<h2>1. 文档范围</h2>\n<p>涉及的当前 PR7050 文件：</p>\n<ul>\n<li><code>src_java/package/build.sh</code>：Java 平台、应用、压缩加密工具的主打包入口。</li>\n<li><code>src_java/package/jar_list.txt</code>：打包后需要收集并加密的 Spring Boot 服务 Jar 清单。</li>\n<li><code>binary/java/bin/encrypt/*.xml</code>：每个服务压缩时需要保留在服务 Jar 内的依赖清单。</li>\n<li><code>src_java/tool/sunri-package-compress-xjar/src/main/java/com/sunri/Main.java</code>：XJar 加密密码、加密 include 规则和配置读取逻辑。</li>\n<li><code>src_java/tool/sunri-package-compress-xjar/src/main/java/com/sunri/JarUtil.java</code>：服务 Jar 压缩、公共依赖抽取和 <code>*-requirements.txt</code> 生成逻辑。</li>\n<li><code>binary/java/bin/javacontrol.sh</code>：Java 服务 start、stop、restart 控制脚本。</li>\n</ul>\n<h2>2. Java 打包流程</h2>\n<p>在 PR7050 根目录下，Java 打包入口位于 <code>src_java/package/build.sh</code>。脚本通过自身路径计算 <code>PROJECT_ROOT</code>，实际 Java 工程根为 <code>/home/liumangmang/IdeaProjects/PR7050/V1.00/src_java</code>。</p>\n<h3>总体流程步骤</h3>\n<ol>\n<li><strong>清理旧产物</strong>：执行 <code>clean_stale_java_outputs</code>，先删除旧 Jar、XJar 中间文件和旧 requirements。</li>\n<li><strong>架构检测</strong>：通过 <code>uname -m</code> 选择 <code>jdk-x64</code> 或 <code>jdk-arm</code>，并设置 Maven 路径。</li>\n<li><strong>同步加密 XML</strong>：从 <code>binary/java/bin/encrypt</code> 同步到 <code>src_java/package/java/bin/encrypt</code>。</li>\n<li><strong>编译 Platform</strong>：进入 <code>src_java/platform</code> 执行 <code>mvn clean install -DskipTests -T 1C</code>。</li>\n<li><strong>编译 Platapp</strong>：进入 <code>src_java/platapp</code> 执行 <code>mvn clean package -DskipTests -T 1C</code>。</li>\n<li><strong>收集服务 Jar</strong>：按 <code>jar_list.txt</code> 在 platform 和 platapp 的 <code>target</code> 目录查找并复制。</li>\n<li><strong>压缩加密</strong>：构建并执行 <code>sunri-package-compress-xjar</code>，生成加密后的服务 Jar。</li>\n<li><strong>同步到 binary</strong>：将加密 Jar 和 common 依赖复制到 <code>binary/java</code> 运行目录。</li>\n</ol>\n<h3>2.1 清理旧 Java 输出</h3>\n<p><code>build.sh</code> 开头调用 <code>clean_stale_java_outputs</code>。它会先创建必要目录，再删除下列旧文件，避免上一次构建残留影响本次打包：</p>\n<ul>\n<li><code>src_java/package/java/jar/x64_raw/*.jar</code></li>\n<li><code>src_java/package/java/jar/x64_compress/*.jar</code></li>\n<li><code>src_java/package/java/jar/x64/*.jar</code>、<code>*.xjar</code>、<code>xjar.go</code>、<code>compress-xjar.config</code></li>\n<li><code>binary/java/jar/x64/*.jar</code></li>\n<li><code>src_java/package/java/lib/common/*.jar</code> 与 <code>*-requirements.txt</code></li>\n<li><code>binary/java/lib/common/*.jar</code> 与 <code>*-requirements.txt</code></li>\n</ul>\n<h3>2.2 关键打包命令</h3>\n<div class=\"language-bash line-numbers-mode\" data-highlighter=\"shiki\" data-ext=\"bash\" style=\"--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34\"><pre class=\"shiki shiki-themes one-light one-dark-pro vp-code\"><code class=\"language-bash\"><span class=\"line\"><span style=\"--shiki-light:#0184BC;--shiki-dark:#56B6C2\">cd</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> /home/liumangmang/IdeaProjects/PR7050/V1.00/src_java/package</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#4078F2;--shiki-dark:#61AFEF\">./build.sh</span></span></code></pre>\n<div class=\"line-numbers\" aria-hidden=\"true\" style=\"counter-reset:line-number 0\"><div class=\"line-number\"></div><div class=\"line-number\"></div></div></div><p>脚本内部执行的 Maven 命令：</p>\n<div class=\"language-bash line-numbers-mode\" data-highlighter=\"shiki\" data-ext=\"bash\" style=\"--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34\"><pre class=\"shiki shiki-themes one-light one-dark-pro vp-code\"><code class=\"language-bash\"><span class=\"line\"><span style=\"--shiki-light:#0184BC;--shiki-dark:#56B6C2\">cd</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> /home/liumangmang/IdeaProjects/PR7050/V1.00/src_java/platform</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#4078F2;--shiki-dark:#61AFEF\">mvn</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> clean</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> install</span><span style=\"--shiki-light:#986801;--shiki-dark:#D19A66\"> -DskipTests</span><span style=\"--shiki-light:#986801;--shiki-dark:#D19A66\"> -T</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> 1C</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#0184BC;--shiki-dark:#56B6C2\">cd</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> /home/liumangmang/IdeaProjects/PR7050/V1.00/src_java/platapp</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#4078F2;--shiki-dark:#61AFEF\">mvn</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> clean</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> package</span><span style=\"--shiki-light:#986801;--shiki-dark:#D19A66\"> -DskipTests</span><span style=\"--shiki-light:#986801;--shiki-dark:#D19A66\"> -T</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> 1C</span></span></code></pre>\n<div class=\"line-numbers\" aria-hidden=\"true\" style=\"counter-reset:line-number 0\"><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div></div></div><blockquote>\n<p><strong>⚠ 注意：</strong> <code>build.sh</code> 当前跳过测试，适合打包流程。若改动源码，应按受影响模块另行执行最小测试命令。</p>\n</blockquote>\n<h2>3. 压缩与 XJar 加密</h2>\n<p>压缩加密工具位于 <code>src_java/tool/sunri-package-compress-xjar</code>。打包脚本会编译该工具，将 <code>sunri-package-compress-xjar-1.0-jar-with-dependencies.jar</code> 复制到 <code>src_java/package/java/tools</code>，再由模板生成 <code>compress-xjar.config</code>。</p>\n<h3>3.1 配置文件生成</h3>\n<p>模板 <code>src_java/package/java/tools/model_compress-xjar.config</code> 中的 <code>{项目全路径}</code> 会被替换为 <code>/home/liumangmang/IdeaProjects/PR7050/V1.00/src_java</code>。生成后的主要目录如下：</p>\n<p>| 配置项 | 当前 PR7050 路径 | 作用 |<br>\n| :</p>\n",
      "date_published": "2026-05-11T00:00:00.000Z",
      "authors": [],
      "tags": [
        "工作",
        "项目总结"
      ]
    },
    {
      "title": "PR7950 Java 打包启动流程说明",
      "url": "https://www.mangmang.fun/work/project-summary/%E6%99%BA%E8%83%BD%E5%B7%A1%E8%A7%86/pr7950-java-package-startup-flow.html",
      "id": "https://www.mangmang.fun/work/project-summary/%E6%99%BA%E8%83%BD%E5%B7%A1%E8%A7%86/pr7950-java-package-startup-flow.html",
      "summary": "整个流程从 build.sh 开始，先构建 Java 模块，再按清单提取业务 fat jar，随后用压缩工具拆分公共依赖，再使用 XJar 加密，最后把产物同步到 binary/java 运行目录。启动时不是直接执行 java -jar，而是通过 xjar java ... -jar 服务.jar 解密运行。",
      "content_html": "\n<p>整个流程从 <code>build.sh</code> 开始，先构建 Java 模块，再按清单提取业务 fat jar，随后用压缩工具拆分公共依赖，再使用 XJar 加密，最后把产物同步到 <code>binary/java</code> 运行目录。启动时不是直接执行 <code>java -jar</code>，而是通过 <code>xjar java ... -jar 服务.jar</code> 解密运行。</p>\n<!-- more -->\n<h2>1. 总体流程</h2>\n<p>整个流程从 <code>build.sh</code> 开始，先构建 Java 模块，再按清单提取业务 fat jar，随后用压缩工具拆分公共依赖，再使用 XJar 加密，最后把产物同步到 <code>binary/java</code> 运行目录。启动时不是直接执行 <code>java -jar</code>，而是通过 <code>xjar java ... -jar 服务.jar</code> 解密运行。</p>\n<h3>流程步骤</h3>\n<ol>\n<li><strong><a href=\"http://build.sh\" target=\"_blank\" rel=\"noopener noreferrer\">build.sh</a></strong>: 准备 JDK/Maven，同步 encrypt XML</li>\n<li><strong>Maven Build</strong>: 构建 platform 与 platapp</li>\n<li><strong>x64_raw</strong>: 按 jar_list.txt 提取原始 fat jar</li>\n<li><strong>compress</strong>: 拆分 BOOT-INF/lib 依赖</li>\n<li><strong>lib/common</strong>: 输出公共 jar 与 requirements.txt</li>\n<li><strong>XJar</strong>: 加密压缩后的服务 jar</li>\n<li><strong>binary</strong>: 同步 jar 与公共依赖到运行目录</li>\n<li><strong>startup</strong>: xjar java 启动，动态加载公共依赖</li>\n</ol>\n<blockquote>\n<p><strong>一句话概括：</strong><br>\n打包阶段把业务 jar 变小并加密，启动阶段用 XJar 解密运行，再由 <code>sunri-spring-classload</code> 把拆出去的公共依赖加载回来。</p>\n</blockquote>\n<h2>2. 构建与提取 Jar</h2>\n<p>入口脚本位于：<br>\n<code>/home/liumangmang/IdeaProjects/PR7950/V1.00_2024/src_java/package/build.sh</code></p>\n<h3>执行入口</h3>\n<div class=\"language-bash line-numbers-mode\" data-highlighter=\"shiki\" data-ext=\"bash\" style=\"--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34\"><pre class=\"shiki shiki-themes one-light one-dark-pro vp-code\"><code class=\"language-bash\"><span class=\"line\"><span style=\"--shiki-light:#0184BC;--shiki-dark:#56B6C2\">cd</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> /home/liumangmang/IdeaProjects/PR7950/V1.00_2024/src_java/package</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#4078F2;--shiki-dark:#61AFEF\">bash</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> build.sh</span></span></code></pre>\n<div class=\"line-numbers\" aria-hidden=\"true\" style=\"counter-reset:line-number 0\"><div class=\"line-number\"></div><div class=\"line-number\"></div></div></div><h3>环境准备</h3>\n<p>脚本根据机器架构选择内置 JDK，并使用项目自带 Maven。</p>\n<p>| 项目 | 路径/规则 |<br>\n| :</p>\n",
      "date_published": "2026-05-11T00:00:00.000Z",
      "authors": [],
      "tags": [
        "工作",
        "项目总结"
      ]
    },
    {
      "title": "VSCode 进阶：命令面板工作流与配置治理",
      "url": "https://www.mangmang.fun/programming/frontend/tools/vscode-advanced-command-palette-and-config-management.html",
      "id": "https://www.mangmang.fun/programming/frontend/tools/vscode-advanced-command-palette-and-config-management.html",
      "summary": "这篇是入门篇的下一步，目标是把 VSCode 从“会用”升级到“高效、可维护”。 重点只讲三块： 命令面板的进阶工作流 配置文件分层治理（User / Workspace / Profile） 可复用的进阶 JSON 模板",
      "content_html": "\n<p>这篇是入门篇的下一步，目标是把 VSCode 从“会用”升级到“高效、可维护”。</p>\n<p>重点只讲三块：</p>\n<ol>\n<li>命令面板的进阶工作流</li>\n<li>配置文件分层治理（User / Workspace / Profile）</li>\n<li>可复用的进阶 JSON 模板</li>\n</ol>\n<!-- more -->\n<h2>1. 命令面板进阶：把常用动作变成肌肉记忆</h2>\n<p>命令面板入口不变：<code>Ctrl + Shift + P</code>（Windows / Linux）。</p>\n<p>建议只记住下面这组高频命令：</p>\n<ol>\n<li><code>&gt;Preferences: Open User Settings (JSON)</code></li>\n<li><code>&gt;Preferences: Open Workspace Settings (JSON)</code></li>\n<li><code>&gt;Preferences: Open Keyboard Shortcuts (JSON)</code></li>\n<li><code>&gt;Tasks: Configure Task</code></li>\n<li><code>&gt;Developer: Reload Window</code></li>\n<li><code>&gt;Profiles: Create Profile</code></li>\n<li><code>&gt;Extensions: Show Installed Extensions</code></li>\n</ol>\n<p>实战思路：遇到任何需求，先用命令面板搜“动词 + 目标”，比如 <code>open settings json</code>、<code>create profile</code>。</p>\n<h2>2. 配置治理模型：谁该放在哪里</h2>\n<h3>2.1 User settings（全局）</h3>\n<ul>\n<li>Windows: <code>%APPDATA%\\\\Code\\\\User\\\\settings.json</code></li>\n<li>Linux: <code>~/.config/Code/User/settings.json</code></li>\n</ul>\n<p>放“个人偏好”：字体、自动保存、终端默认 shell、编辑体验。</p>\n<h3>2.2 Workspace settings（项目）</h3>\n<ul>\n<li>项目路径：<code>.vscode/settings.json</code></li>\n</ul>\n<p>放“项目约束”：缩进、格式化策略、特定语言规则、排除目录。</p>\n<h3>2.3 Profile（场景）</h3>\n<p>Profile 适合“多工作模式”用户，例如：</p>\n<ul>\n<li><code>Frontend</code>：前端开发扩展 + 偏好</li>\n<li><code>Backend</code>：后端开发扩展 + 偏好</li>\n<li><code>Minimal</code>：低干扰写作/阅读模式</li>\n</ul>\n<p>建议：</p>\n<ul>\n<li>固定偏好放 User</li>\n<li>项目规范放 Workspace</li>\n<li>场景差异放 Profile</li>\n</ul>\n<h2>3. keybindings.json：给命令面板加速</h2>\n<p>打开方式：</p>\n<ul>\n<li><code>Ctrl + Shift + P</code></li>\n<li>输入 <code>Open Keyboard Shortcuts (JSON)</code></li>\n</ul>\n<p>示例（Windows / Linux 通用）：</p>\n<div class=\"language-json line-numbers-mode\" data-highlighter=\"shiki\" data-ext=\"json\" style=\"--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34\"><pre class=\"shiki shiki-themes one-light one-dark-pro vp-code\"><code class=\"language-json\"><span class=\"line\"><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">[</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">  {</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">    \"key\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"ctrl+alt+r\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">    \"command\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"workbench.action.reloadWindow\"</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">  },</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">  {</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">    \"key\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"ctrl+alt+,\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">    \"command\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"workbench.action.openSettingsJson\"</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">  },</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">  {</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">    \"key\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"ctrl+alt+t\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">    \"command\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"workbench.action.tasks.runTask\"</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">  }</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">]</span></span></code></pre>\n<div class=\"line-numbers\" aria-hidden=\"true\" style=\"counter-reset:line-number 0\"><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div></div></div><p>注意：如果快捷键冲突，VSCode 会以后定义或更具体 <code>when</code> 条件为准。</p>\n<h2>4. 进阶 settings.json 模板（Windows + Linux）</h2>\n<p>下面模板建议放在 User 级，并按你环境微调：</p>\n<div class=\"language-json line-numbers-mode\" data-highlighter=\"shiki\" data-ext=\"json\" style=\"--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34\"><pre class=\"shiki shiki-themes one-light one-dark-pro vp-code\"><code class=\"language-json\"><span class=\"line\"><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">{</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">  \"editor.fontSize\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#986801;--shiki-dark:#D19A66\">14</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">  \"editor.lineHeight\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#986801;--shiki-dark:#D19A66\">1.7</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">  \"editor.tabSize\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#986801;--shiki-dark:#D19A66\">2</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">  \"editor.wordWrap\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"on\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">  \"editor.minimap.enabled\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#0184BC;--shiki-dark:#D19A66\">false</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">  \"editor.bracketPairColorization.enabled\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#0184BC;--shiki-dark:#D19A66\">true</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">  \"files.autoSave\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"onFocusChange\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">  \"files.trimTrailingWhitespace\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#0184BC;--shiki-dark:#D19A66\">true</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">  \"files.insertFinalNewline\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#0184BC;--shiki-dark:#D19A66\">true</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">  \"files.watcherExclude\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: {</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">    \"**/.git/objects/**\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#0184BC;--shiki-dark:#D19A66\">true</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">    \"**/node_modules/**\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#0184BC;--shiki-dark:#D19A66\">true</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">    \"**/dist/**\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#0184BC;--shiki-dark:#D19A66\">true</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">  },</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">  \"editor.formatOnSave\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#0184BC;--shiki-dark:#D19A66\">true</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">  \"editor.defaultFormatter\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"esbenp.prettier-vscode\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">  \"editor.codeActionsOnSave\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: {</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">    \"source.fixAll\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"explicit\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">    \"source.organizeImports\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"explicit\"</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">  },</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">  \"terminal.integrated.defaultProfile.windows\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"PowerShell\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">  \"terminal.integrated.defaultProfile.linux\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"bash\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">  \"workbench.startupEditor\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"none\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">  \"workbench.editor.enablePreview\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#0184BC;--shiki-dark:#D19A66\">false</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">  \"workbench.tree.indent\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#986801;--shiki-dark:#D19A66\">16</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">}</span></span></code></pre>\n<div class=\"line-numbers\" aria-hidden=\"true\" style=\"counter-reset:line-number 0\"><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div></div></div><p>如果你不用 Prettier，把 <code>editor.defaultFormatter</code> 改成你实际使用的扩展 ID。</p>\n<h2>5. Workspace 模板：把项目规范写死</h2>\n<p>建议每个项目都放一个最小 <code>.vscode/settings.json</code>：</p>\n<div class=\"language-json line-numbers-mode\" data-highlighter=\"shiki\" data-ext=\"json\" style=\"--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34\"><pre class=\"shiki shiki-themes one-light one-dark-pro vp-code\"><code class=\"language-json\"><span class=\"line\"><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">{</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">  \"editor.tabSize\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#986801;--shiki-dark:#D19A66\">2</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">  \"editor.insertSpaces\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#0184BC;--shiki-dark:#D19A66\">true</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">  \"editor.detectIndentation\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#0184BC;--shiki-dark:#D19A66\">false</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">  \"files.eol\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"</span><span style=\"--shiki-light:#0184BC;--shiki-dark:#56B6C2\">\\n</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">}</span></span></code></pre>\n<div class=\"line-numbers\" aria-hidden=\"true\" style=\"counter-reset:line-number 0\"><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div></div></div><p>这样团队成员打开项目时，基础编辑行为就能统一。</p>\n<h2>6. 命令面板 + Task：一键执行项目动作</h2>\n<p>进阶建议：把常用命令（如构建、测试）写进 Task，再通过命令面板触发。</p>\n<p><code>.vscode/tasks.json</code> 示例：</p>\n<div class=\"language-json line-numbers-mode\" data-highlighter=\"shiki\" data-ext=\"json\" style=\"--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34\"><pre class=\"shiki shiki-themes one-light one-dark-pro vp-code\"><code class=\"language-json\"><span class=\"line\"><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">{</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">  \"version\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"2.0.0\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">  \"tasks\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: [</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">    {</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">      \"label\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"docs:build\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">      \"type\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"shell\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">      \"command\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"npm run docs:build\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">      \"group\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"build\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">      \"problemMatcher\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: []</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">    }</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">  ]</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">}</span></span></code></pre>\n<div class=\"line-numbers\" aria-hidden=\"true\" style=\"counter-reset:line-number 0\"><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div></div></div><p>触发方式：</p>\n<ol>\n<li><code>Ctrl + Shift + P</code></li>\n<li>输入 <code>Run Task</code></li>\n<li>选择 <code>docs:build</code></li>\n</ol>\n<h2>7. 常见坑与排查</h2>\n<h3>7.1 改了配置却没生效</h3>\n<p>先执行 <code>Developer: Reload Window</code>，再验证。</p>\n<h3>7.2 User 和 Workspace 打架</h3>\n<p>按“项目优先”原则，检查 <code>.vscode/settings.json</code> 是否覆盖了 User。</p>\n<h3>7.3 JSON 报错</h3>\n<p>确保：</p>\n<ul>\n<li>不要尾逗号</li>\n<li>全部键名和字符串使用双引号</li>\n<li>文件是合法 JSON（不是 JSONC 风格时不要写注释）</li>\n</ul>\n<h2>8. 进阶完成标准</h2>\n<ul class=\"task-list-container\">\n<li class=\"task-list-item\"><input type=\"checkbox\" class=\"task-list-item-checkbox\" id=\"task-item-0\" disabled=\"disabled\"><label class=\"task-list-item-label\" for=\"task-item-0\"> 能通过命令面板完成设置、任务、重载</label></li>\n<li class=\"task-list-item\"><input type=\"checkbox\" class=\"task-list-item-checkbox\" id=\"task-item-1\" disabled=\"disabled\"><label class=\"task-list-item-label\" for=\"task-item-1\"> 能区分 User / Workspace / Profile 三层职责</label></li>\n<li class=\"task-list-item\"><input type=\"checkbox\" class=\"task-list-item-checkbox\" id=\"task-item-2\" disabled=\"disabled\"><label class=\"task-list-item-label\" for=\"task-item-2\"> 有自己的 <code>keybindings.json</code> 高频快捷键</label></li>\n<li class=\"task-list-item\"><input type=\"checkbox\" class=\"task-list-item-checkbox\" id=\"task-item-3\" disabled=\"disabled\"><label class=\"task-list-item-label\" for=\"task-item-3\"> 有项目级 <code>.vscode/settings.json</code> 规范</label></li>\n<li class=\"task-list-item\"><input type=\"checkbox\" class=\"task-list-item-checkbox\" id=\"task-item-4\" disabled=\"disabled\"><label class=\"task-list-item-label\" for=\"task-item-4\"> 能用 <code>tasks.json</code> 一键触发常用命令</label></li>\n</ul>\n<p>做到这 5 点，VSCode 就从“编辑器”变成你的“稳定开发操作台”。</p>\n",
      "date_published": "2026-03-30T00:00:00.000Z",
      "authors": [],
      "tags": [
        "编程",
        "前端"
      ]
    },
    {
      "title": "VSCode 使用入门：命令面板与 settings.json",
      "url": "https://www.mangmang.fun/programming/frontend/tools/vscode-quick-start-command-palette-settings-json.html",
      "id": "https://www.mangmang.fun/programming/frontend/tools/vscode-quick-start-command-palette-settings-json.html",
      "summary": "这是一篇极速 15 分钟上手指南，重点只讲三件事： VSCode 的基本概念 命令面板怎么高频使用 不进图形化设置，直接改 settings.json",
      "content_html": "\n<p>这是一篇极速 15 分钟上手指南，重点只讲三件事：</p>\n<ol>\n<li>VSCode 的基本概念</li>\n<li>命令面板怎么高频使用</li>\n<li>不进图形化设置，直接改 <code>settings.json</code></li>\n</ol>\n<!-- more -->\n<h2>1. 先认识 4 个核心概念</h2>\n<h3>1.1 编辑器 vs 工作区</h3>\n<ul>\n<li><strong>编辑器</strong>：你看到和编辑代码的窗口。</li>\n<li><strong>工作区（Workspace）</strong>：当前打开的项目（一个或多个文件夹）。</li>\n</ul>\n<h3>1.2 配置分层（最重要）</h3>\n<p>VSCode 的设置是分层生效的：</p>\n<ol>\n<li><strong>默认设置（Default）</strong>：VSCode 内置。</li>\n<li><strong>用户设置（User）</strong>：你机器上的全局偏好。</li>\n<li><strong>工作区设置（Workspace）</strong>：只对当前项目生效。</li>\n</ol>\n<p>如果同一个键同时存在，通常是 <code>Workspace</code> 覆盖 <code>User</code>。</p>\n<h3>1.3 命令面板（Command Palette）</h3>\n<p>命令面板是 VSCode 的“统一入口”。</p>\n<ul>\n<li>Windows/Linux：<code>Ctrl + Shift + P</code></li>\n<li>也可按 <code>F1</code></li>\n</ul>\n<p>你可以在这里执行几乎所有操作，包括打开 JSON 配置。</p>\n<h3>1.4 扩展不是“额外功能”，而是能力层</h3>\n<p>VSCode 本体很轻，很多语言能力来自扩展。<br>\n但本篇先不讲扩展安装，先把命令面板和配置体系打通。</p>\n<h2>2. 命令面板：先会这 6 条命令</h2>\n<p>按 <code>Ctrl + Shift + P</code> 后直接输入：</p>\n<ol>\n<li><code>&gt;</code> + <code>Reload Window</code>：重载窗口，配置变更后常用。</li>\n<li><code>&gt;Developer: Reload Window</code>：同上，完整命令名。</li>\n<li><code>&gt;Preferences: Open User Settings (JSON)</code>：打开全局配置。</li>\n<li><code>&gt;Preferences: Open Workspace Settings (JSON)</code>：打开项目配置。</li>\n<li><code>&gt;Preferences: Open Default Settings (JSON)</code>：查看默认值（只读参考）。</li>\n<li><code>&gt;Files: Auto Save</code>：快速切自动保存策略。</li>\n</ol>\n<p>技巧：命令面板支持模糊搜索，你记不全命令名也能找到。</p>\n<h2>3. settings.json 到底放哪</h2>\n<h3>3.1 用户配置（全局）</h3>\n<ul>\n<li>Windows: <code>%APPDATA%\\\\Code\\\\User\\\\settings.json</code></li>\n<li>Linux: <code>~/.config/Code/User/settings.json</code></li>\n</ul>\n<p>建议：全局偏好（字体、自动保存、格式化默认行为）放这里。</p>\n<h3>3.2 工作区配置（项目级）</h3>\n<ul>\n<li>项目根目录：<code>.vscode/settings.json</code></li>\n</ul>\n<p>建议：和项目强相关的配置放这里（例如某项目缩进、格式化器、排除目录）。</p>\n<h2>4. 用命令面板打开 JSON 配置（不进图形设置）</h2>\n<h3>4.1 打开用户配置</h3>\n<ol>\n<li><code>Ctrl + Shift + P</code></li>\n<li>输入 <code>Open User Settings (JSON)</code></li>\n<li>回车</li>\n</ol>\n<h3>4.2 打开工作区配置</h3>\n<ol>\n<li><code>Ctrl + Shift + P</code></li>\n<li>输入 <code>Open Workspace Settings (JSON)</code></li>\n<li>回车</li>\n</ol>\n<p>如果项目里没有 <code>.vscode/settings.json</code>，VSCode 会帮你创建。</p>\n<h2>5. 可直接粘贴的入门模板</h2>\n<p>下面这份建议先放在 <strong>User settings.json</strong>，适用于 Windows + Linux。</p>\n<div class=\"language-json line-numbers-mode\" data-highlighter=\"shiki\" data-ext=\"json\" style=\"--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34\"><pre class=\"shiki shiki-themes one-light one-dark-pro vp-code\"><code class=\"language-json\"><span class=\"line\"><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">{</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">  \"editor.fontSize\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#986801;--shiki-dark:#D19A66\">14</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">  \"editor.tabSize\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#986801;--shiki-dark:#D19A66\">2</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">  \"editor.wordWrap\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"on\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">  \"editor.minimap.enabled\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#0184BC;--shiki-dark:#D19A66\">false</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">  \"files.autoSave\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"onFocusChange\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">  \"files.trimTrailingWhitespace\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#0184BC;--shiki-dark:#D19A66\">true</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">  \"files.insertFinalNewline\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#0184BC;--shiki-dark:#D19A66\">true</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">  \"editor.formatOnSave\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#0184BC;--shiki-dark:#D19A66\">true</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">  \"editor.codeActionsOnSave\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: {</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">    \"source.fixAll\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"explicit\"</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">  },</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">  \"terminal.integrated.defaultProfile.windows\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"PowerShell\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">  \"terminal.integrated.defaultProfile.linux\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"bash\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">  \"files.exclude\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: {</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">    \"**/.DS_Store\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#0184BC;--shiki-dark:#D19A66\">true</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">    \"**/node_modules\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#0184BC;--shiki-dark:#D19A66\">true</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">    \"**/.git\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#0184BC;--shiki-dark:#D19A66\">false</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">  }</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">}</span></span></code></pre>\n<div class=\"line-numbers\" aria-hidden=\"true\" style=\"counter-reset:line-number 0\"><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div></div></div><p>说明：</p>\n<ul>\n<li><code>formatOnSave</code> 依赖你安装并启用对应语言的格式化扩展。</li>\n<li><code>source.fixAll</code> 设为 <code>explicit</code> 更稳，避免每次保存都触发过多修复。</li>\n<li><code>terminal.integrated.defaultProfile.*</code> 按你的本机实际 shell 调整。</li>\n</ul>\n<h2>6. User 与 Workspace 怎么分</h2>\n<p>推荐这套规则：</p>\n<ul>\n<li>放 <code>User</code>：你个人习惯，跨项目都想保留。</li>\n<li>放 <code>Workspace</code>：只在当前项目生效的规则。</li>\n</ul>\n<p>示例：某项目要求 4 空格缩进，就写到该项目 <code>.vscode/settings.json</code>：</p>\n<div class=\"language-json line-numbers-mode\" data-highlighter=\"shiki\" data-ext=\"json\" style=\"--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34\"><pre class=\"shiki shiki-themes one-light one-dark-pro vp-code\"><code class=\"language-json\"><span class=\"line\"><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">{</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">  \"editor.tabSize\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#986801;--shiki-dark:#D19A66\">4</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">,</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">  \"editor.insertSpaces\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">: </span><span style=\"--shiki-light:#0184BC;--shiki-dark:#D19A66\">true</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">}</span></span></code></pre>\n<div class=\"line-numbers\" aria-hidden=\"true\" style=\"counter-reset:line-number 0\"><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div></div></div><h2>7. 常见问题（JSON 配置方式）</h2>\n<h3>7.1 配置不生效</h3>\n<p>按 <code>Ctrl + Shift + P</code> 执行 <code>Developer: Reload Window</code>，再验证。</p>\n<h3>7.2 JSON 报错（逗号、引号）</h3>\n<p><code>settings.json</code> 必须是合法 JSON。重点检查：</p>\n<ul>\n<li>最后一项后面不要多逗号</li>\n<li>键名和字符串值要用双引号</li>\n</ul>\n<h3>7.3 不确定某个键该写什么</h3>\n<p>用命令面板打开 <code>Default Settings (JSON)</code> 搜索对应键，按默认文档写。</p>\n<h2>8. 15 分钟上手清单</h2>\n<ul class=\"task-list-container\">\n<li class=\"task-list-item\"><input type=\"checkbox\" class=\"task-list-item-checkbox\" id=\"task-item-0\" disabled=\"disabled\"><label class=\"task-list-item-label\" for=\"task-item-0\"> 会用 <code>Ctrl + Shift + P</code> 打开命令面板</label></li>\n<li class=\"task-list-item\"><input type=\"checkbox\" class=\"task-list-item-checkbox\" id=\"task-item-1\" disabled=\"disabled\"><label class=\"task-list-item-label\" for=\"task-item-1\"> 会打开 <code>User Settings (JSON)</code></label></li>\n<li class=\"task-list-item\"><input type=\"checkbox\" class=\"task-list-item-checkbox\" id=\"task-item-2\" disabled=\"disabled\"><label class=\"task-list-item-label\" for=\"task-item-2\"> 会打开 <code>Workspace Settings (JSON)</code></label></li>\n<li class=\"task-list-item\"><input type=\"checkbox\" class=\"task-list-item-checkbox\" id=\"task-item-3\" disabled=\"disabled\"><label class=\"task-list-item-label\" for=\"task-item-3\"> 能区分 User 与 Workspace 的生效范围</label></li>\n<li class=\"task-list-item\"><input type=\"checkbox\" class=\"task-list-item-checkbox\" id=\"task-item-4\" disabled=\"disabled\"><label class=\"task-list-item-label\" for=\"task-item-4\"> 粘贴并调整一份可用的 <code>settings.json</code></label></li>\n<li class=\"task-list-item\"><input type=\"checkbox\" class=\"task-list-item-checkbox\" id=\"task-item-5\" disabled=\"disabled\"><label class=\"task-list-item-label\" for=\"task-item-5\"> 配置不生效时会执行 <code>Reload Window</code></label></li>\n</ul>\n<p>完成以上 6 项，你已经跨过 VSCode 入门阶段。</p>\n",
      "date_published": "2026-03-30T00:00:00.000Z",
      "authors": [],
      "tags": [
        "编程",
        "前端"
      ]
    },
    {
      "title": "Linux Mint XFCE 终端常用快捷指令完全指南",
      "url": "https://www.mangmang.fun/programming/linux/Linux_Mint/xfce%E7%BB%88%E7%AB%AF%E5%B8%B8%E7%94%A8%E5%BF%AB%E6%8D%B7%E6%8C%87%E4%BB%A4.html",
      "id": "https://www.mangmang.fun/programming/linux/Linux_Mint/xfce%E7%BB%88%E7%AB%AF%E5%B8%B8%E7%94%A8%E5%BF%AB%E6%8D%B7%E6%8C%87%E4%BB%A4.html",
      "summary": "XFCE 终端是 Linux Mint XFCE 桌面环境默认的命令行工具，熟练掌握其快捷键可以极大提升工作效率。本文整理了最实用的 XFCE 终端快捷键，涵盖导航、编辑、显示调整等各个方面，帮助你更高效地使用终端。",
      "content_html": "\n<p>XFCE 终端是 Linux Mint XFCE 桌面环境默认的命令行工具，熟练掌握其快捷键可以极大提升工作效率。本文整理了最实用的 XFCE 终端快捷键，涵盖导航、编辑、显示调整等各个方面，帮助你更高效地使用终端。</p>\n<!-- more -->\n<h2>一、基础导航类快捷键</h2>\n<h3>1.1 标签页管理</h3>\n<p>| 快捷键 | 功能描述 | 使用场景 |<br>\n|</p>\n",
      "date_published": "2026-03-30T00:00:00.000Z",
      "authors": [],
      "tags": [
        "Linux"
      ]
    },
    {
      "title": "内存优化完全指南",
      "url": "https://www.mangmang.fun/programming/linux/Linux_Mint/%E5%86%85%E5%AD%98%E4%BC%98%E5%8C%96%E5%AE%8C%E5%85%A8%E6%8C%87%E5%8D%97.html",
      "id": "https://www.mangmang.fun/programming/linux/Linux_Mint/%E5%86%85%E5%AD%98%E4%BC%98%E5%8C%96%E5%AE%8C%E5%85%A8%E6%8C%87%E5%8D%97.html",
      "summary": "这篇记录一次真实的 Linux Mint 内存优化过程：从内存告急、Swap 打满，到切换纯 zram、调整内核策略、加上 OOM 保护，最终把系统稳定性和响应速度拉回到优秀状态。",
      "content_html": "\n<p>这篇记录一次真实的 Linux Mint 内存优化过程：从内存告急、Swap 打满，到切换纯 zram、调整内核策略、加上 OOM 保护，最终把系统稳定性和响应速度拉回到优秀状态。</p>\n<!-- more -->\n<h2>一 问题背景</h2>\n<h3>1.1 初始状态</h3>\n<p>排查时的核心数据：</p>\n<ul>\n<li><strong>物理内存</strong>: 29GB</li>\n<li><strong>已使用</strong>: 25GB (86%)</li>\n<li><strong>可用内存</strong>: 3.5GB</li>\n<li><strong>Swap</strong>: 15GB，几乎耗尽</li>\n</ul>\n<h3>1.2 主要问题</h3>\n<p>| 问题 | 严重程度 | 影响 |<br>\n|</p>\n",
      "date_published": "2026-03-20T00:00:00.000Z",
      "authors": [],
      "tags": [
        "Linux"
      ]
    },
    {
      "title": "OpenCode Superpowers：编码 + 写博客 skills 使用方案（自用版）",
      "url": "https://www.mangmang.fun/ai/superpowers/opencode-skills-playbook.html",
      "id": "https://www.mangmang.fun/ai/superpowers/opencode-skills-playbook.html",
      "summary": "这篇不解释太多背景，目标是：我在写博客和写代码时，如何用 Superpowers 这套 skills 把工作流“固定下来”，减少跑偏与返工。",
      "content_html": "\n<p>这篇不解释太多背景，目标是：我在写博客和写代码时，如何用 Superpowers<br>\n这套 skills 把工作流“固定下来”，减少跑偏与返工。</p>\n<!-- more -->\n",
      "date_published": "2026-03-16T00:00:00.000Z",
      "authors": [],
      "tags": [
        "AI",
        "工具"
      ]
    },
    {
      "title": "OpenCode Superpowers：框架总览与上手路线",
      "url": "https://www.mangmang.fun/ai/superpowers/opencode-superpowers-overview.html",
      "id": "https://www.mangmang.fun/ai/superpowers/opencode-superpowers-overview.html",
      "summary": "Superpowers 不是“又一套提示词”，而是一套给编码代理用的开发方法： 强制先澄清、先写计划、再执行、最后验证。 这篇以 OpenCode 为主视角，把上游仓库 obra/superpowers 的核心要点整理成一篇 可直接照着用的速查。",
      "content_html": "\n<p>Superpowers 不是“又一套提示词”，而是一套给编码代理用的开发方法：<br>\n强制先澄清、先写计划、再执行、最后验证。</p>\n<p>这篇以 OpenCode 为主视角，把上游仓库 <code>obra/superpowers</code> 的核心要点整理成一篇<br>\n可直接照着用的速查。</p>\n<!-- more -->\n",
      "date_published": "2026-03-16T00:00:00.000Z",
      "authors": [],
      "tags": [
        "AI",
        "工具"
      ]
    },
    {
      "title": "OpenCode + Superpowers：技能插件安装与用法",
      "url": "https://www.mangmang.fun/ai/superpowers/opencode-superpowers.html",
      "id": "https://www.mangmang.fun/ai/superpowers/opencode-superpowers.html",
      "summary": "Superpowers 是一套给 OpenCode 增强“技能（skills）体系”的插件与技能包： 把常用的提示词/工作流封装成可复用技能，并在每次对话时自动注入必要的引导上下文。",
      "content_html": "\n<p>Superpowers 是一套给 OpenCode 增强“技能（skills）体系”的插件与技能包：<br>\n把常用的提示词/工作流封装成可复用技能，并在每次对话时自动注入必要的引导上下文。</p>\n<!-- more -->\n",
      "date_published": "2026-03-16T00:00:00.000Z",
      "authors": [],
      "tags": [
        "AI",
        "工具"
      ]
    },
    {
      "title": "Claude Code 多分支工作流实战总结（2026）",
      "url": "https://www.mangmang.fun/ai/claude-code-branch-workflow-2026.html",
      "id": "https://www.mangmang.fun/ai/claude-code-branch-workflow-2026.html",
      "summary": "这篇是对一篇 Claude Code 工作流文章的中文实战整理版。 核心结论很直接：不要在一个分支里让 AI 连续改代码，要用“任务隔离 + 并行执行 + 人工验收”的方式把效率和可控性同时拉起来。",
      "content_html": "\n<p>这篇是对一篇 Claude Code 工作流文章的中文实战整理版。<br>\n核心结论很直接：不要在一个分支里让 AI 连续改代码，要用“任务隔离 +<br>\n并行执行 + 人工验收”的方式把效率和可控性同时拉起来。</p>\n<!-- more -->\n",
      "date_published": "2026-03-11T00:00:00.000Z",
      "authors": [],
      "tags": [
        "AI"
      ]
    },
    {
      "title": "OpenClaw 个人 24 小时在线部署实战",
      "url": "https://www.mangmang.fun/ai/openclaw.html",
      "id": "https://www.mangmang.fun/ai/openclaw.html",
      "summary": "最近把 OpenClaw 在个人 Linux 机器上完整跑通了。 这篇不是理想教程，而是可复现的真实部署记录：初始化、守护进程常驻、 渠道接入、Web 搜索和安全收紧。",
      "content_html": "\n<p>最近把 OpenClaw 在个人 Linux 机器上完整跑通了。<br>\n这篇不是理想教程，而是可复现的真实部署记录：初始化、守护进程常驻、<br>\n渠道接入、Web 搜索和安全收紧。</p>\n<!-- more -->\n<p>适合人群：</p>\n<ul>\n<li>个人单用户场景</li>\n<li>希望 24 小时在线</li>\n<li>想接 Telegram 或飞书</li>\n<li>想一次把常见坑踩完</li>\n</ul>\n",
      "date_published": "2026-03-10T00:00:00.000Z",
      "authors": [],
      "tags": [
        "AI"
      ]
    },
    {
      "title": "VNC 单脚本管理与批量下发",
      "url": "https://www.mangmang.fun/programming/linux/%E5%9F%BA%E7%A1%80/05-vnc-%E5%8D%95%E8%84%9A%E6%9C%AC%E7%AE%A1%E7%90%86%E4%B8%8E%E6%89%B9%E9%87%8F%E4%B8%8B%E5%8F%91.html",
      "id": "https://www.mangmang.fun/programming/linux/%E5%9F%BA%E7%A1%80/05-vnc-%E5%8D%95%E8%84%9A%E6%9C%AC%E7%AE%A1%E7%90%86%E4%B8%8E%E6%89%B9%E9%87%8F%E4%B8%8B%E5%8F%91.html",
      "summary": "本文记录一次 VNC 运维落地方案：在单机用 vnc_ctl.sh 统一管理服务生命周期，再通过 deploy_to_desktop.sh 按 IP 列表批量下发到多台 Linux 机器。",
      "content_html": "<p>本文记录一次 VNC 运维落地方案：在单机用 <code>vnc_ctl.sh</code> 统一管理服务生命周期，再通过 <code>deploy_to_desktop.sh</code> 按 IP 列表批量下发到多台 Linux 机器。</p>\n<!-- more -->\n<h1>VNC 单脚本管理与批量下发</h1>\n<h2>1. 目标场景</h2>\n<p>示例目标机器：</p>\n<ul>\n<li><code>10.6.223.223</code></li>\n<li><code>10.6.220.165</code></li>\n<li><code>10.6.221.8</code></li>\n<li><code>10.6.223.233</code></li>\n</ul>\n<p>统一目标：</p>\n<ol>\n<li>在远程桌面生成 <code>vnc_ctl.sh</code></li>\n<li>后台运行 <code>x0vncserver</code></li>\n<li>提供开机自启能力</li>\n<li>支持状态检查与一键停止</li>\n<li>支持批量下发，减少重复操作</li>\n</ol>\n<h2>2. 管理脚本设计</h2>\n<p>主脚本：<code>vnc_ctl.sh</code></p>\n<p>支持命令：</p>\n<ul>\n<li><code>start</code>：启动 VNC</li>\n<li><code>stop</code>：停止 VNC</li>\n<li><code>check</code>：检查进程、端口、密码文件与日志</li>\n<li><code>restart</code>：重启服务</li>\n<li><code>install-autostart</code>：安装 <code>@reboot</code> 自启</li>\n<li><code>remove-autostart</code>：移除自启</li>\n</ul>\n<p>核心思路：</p>\n<ul>\n<li>通过 <code>pgrep</code> 精确匹配 <code>x0vncserver</code> 参数定位进程</li>\n<li>使用 <code>nohup</code> 后台运行并记录日志</li>\n<li>通过 <code>crontab</code> 注入 <code>@reboot</code> 行实现开机拉起</li>\n</ul>\n<p>示例（启动命令段）：</p>\n<div class=\"language-bash line-numbers-mode\" data-highlighter=\"shiki\" data-ext=\"bash\" style=\"--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34\"><pre class=\"shiki shiki-themes one-light one-dark-pro vp-code\"><code class=\"language-bash\"><span class=\"line\"><span style=\"--shiki-light:#4078F2;--shiki-dark:#61AFEF\">nohup</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> x0vncserver</span><span style=\"--shiki-light:#0184BC;--shiki-dark:#56B6C2\"> \\</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#986801;--shiki-dark:#D19A66\">  -display</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> \":0\"</span><span style=\"--shiki-light:#0184BC;--shiki-dark:#56B6C2\"> \\</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#986801;--shiki-dark:#D19A66\">  -passwordfile</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> \"</span><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">$HOME</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">/.vnc/passwd\"</span><span style=\"--shiki-light:#0184BC;--shiki-dark:#56B6C2\"> \\</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#986801;--shiki-dark:#D19A66\">  -rfbport</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> \"5900\"</span><span style=\"--shiki-light:#0184BC;--shiki-dark:#56B6C2\"> \\</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#986801;--shiki-dark:#D19A66\">  -nevershared</span><span style=\"--shiki-light:#0184BC;--shiki-dark:#56B6C2\"> \\</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#986801;--shiki-dark:#D19A66\">  -idletimeout</span><span style=\"--shiki-light:#986801;--shiki-dark:#D19A66\"> 0</span><span style=\"--shiki-light:#0184BC;--shiki-dark:#56B6C2\"> \\</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">  >></span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"</span><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">$HOME</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">/.vnc/x0vncserver-5900.log\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\"> 2>&#x26;1 &#x26;</span></span></code></pre>\n<div class=\"line-numbers\" aria-hidden=\"true\" style=\"counter-reset:line-number 0\"><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div></div></div><h2>3. 批量下发脚本</h2>\n<p>下发脚本：<code>deploy_to_desktop.sh</code></p>\n<p>用途：把本地脚本按 IP 列表分发到远程桌面目录，并自动加执行权限。</p>\n<p>示例命令：</p>\n<div class=\"language-bash line-numbers-mode\" data-highlighter=\"shiki\" data-ext=\"bash\" style=\"--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34\"><pre class=\"shiki shiki-themes one-light one-dark-pro vp-code\"><code class=\"language-bash\"><span class=\"line\"><span style=\"--shiki-light:#4078F2;--shiki-dark:#61AFEF\">./deploy_to_desktop.sh</span><span style=\"--shiki-light:#986801;--shiki-dark:#D19A66\"> -f</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> ./vnc_ctl.sh</span><span style=\"--shiki-light:#986801;--shiki-dark:#D19A66\"> -i</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> 10.6.223.233,10.6.220.165</span><span style=\"--shiki-light:#986801;--shiki-dark:#D19A66\"> -u</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> sunri</span></span></code></pre>\n<div class=\"line-numbers\" aria-hidden=\"true\" style=\"counter-reset:line-number 0\"><div class=\"line-number\"></div></div></div><p>脚本默认行为：</p>\n<ul>\n<li>目标目录默认为 <code>/home/&lt;user&gt;/Desktop</code></li>\n<li>使用 SSH/SCP 分发</li>\n<li>分发后自动执行 <code>chmod +x</code></li>\n</ul>\n<h2>4. 推荐使用流程</h2>\n<div class=\"language-bash line-numbers-mode\" data-highlighter=\"shiki\" data-ext=\"bash\" style=\"--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34\"><pre class=\"shiki shiki-themes one-light one-dark-pro vp-code\"><code class=\"language-bash\"><span class=\"line\"><span style=\"--shiki-light:#4078F2;--shiki-dark:#61AFEF\">chmod</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> +x</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> ./vnc_ctl.sh</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> ./deploy_to_desktop.sh</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#4078F2;--shiki-dark:#61AFEF\">./deploy_to_desktop.sh</span><span style=\"--shiki-light:#986801;--shiki-dark:#D19A66\"> -f</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> ./vnc_ctl.sh</span><span style=\"--shiki-light:#986801;--shiki-dark:#D19A66\"> -i</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> 10.6.223.233,10.6.220.165</span><span style=\"--shiki-light:#986801;--shiki-dark:#D19A66\"> -u</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> sunri</span></span></code></pre>\n<div class=\"line-numbers\" aria-hidden=\"true\" style=\"counter-reset:line-number 0\"><div class=\"line-number\"></div><div class=\"line-number\"></div></div></div><p>远程执行示例：</p>\n<div class=\"language-bash line-numbers-mode\" data-highlighter=\"shiki\" data-ext=\"bash\" style=\"--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34\"><pre class=\"shiki shiki-themes one-light one-dark-pro vp-code\"><code class=\"language-bash\"><span class=\"line\"><span style=\"--shiki-light:#4078F2;--shiki-dark:#61AFEF\">ssh</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> sunri@10.6.220.165</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> \"/home/sunri/Desktop/vnc_ctl.sh install-autostart &#x26;&#x26; /home/sunri/Desktop/vnc_ctl.sh start &#x26;&#x26; /home/sunri/Desktop/vnc_ctl.sh check\"</span></span></code></pre>\n<div class=\"line-numbers\" aria-hidden=\"true\" style=\"counter-reset:line-number 0\"><div class=\"line-number\"></div></div></div><h2>5. 测试结论</h2>\n<ul>\n<li><code>10.6.220.165</code>：下发成功，脚本存在且可执行</li>\n<li><code>10.6.223.233</code>：下发失败，原因为 SSH 认证失败（<code>Permission denied</code>）</li>\n</ul>\n<h2>6. 常见问题排查</h2>\n<ul>\n<li>缺少密码文件：在目标机执行 <code>vncpasswd</code></li>\n<li>端口未监听：检查 <code>~/.vnc/x0vncserver-5900.log</code></li>\n<li>开机自启未生效：检查 <code>crontab -l</code> 中 <code>@reboot ... vnc_ctl.sh start ...</code></li>\n<li>无法下发：先手动验证 <code>ssh &lt;user&gt;@&lt;ip&gt;</code></li>\n</ul>\n<h2>7. 小结</h2>\n<p>该方案把 VNC 运维拆成两个可复用脚本：</p>\n<ul>\n<li>单机统一管理生命周期</li>\n<li>多机统一批量下发</li>\n</ul>\n<p>适合内网多台 Linux 机器的日常维护与快速复制部署。</p>\n",
      "date_published": "2026-03-09T00:00:00.000Z",
      "authors": [],
      "tags": [
        "Linux"
      ]
    },
    {
      "title": "远程 C++ 项目一键全量构建",
      "url": "https://www.mangmang.fun/programming/backend/c__/01-%E8%BF%9C%E7%A8%8B-cpp-%E9%A1%B9%E7%9B%AE%E4%B8%80%E9%94%AE%E5%85%A8%E9%87%8F%E6%9E%84%E5%BB%BA.html",
      "id": "https://www.mangmang.fun/programming/backend/c__/01-%E8%BF%9C%E7%A8%8B-cpp-%E9%A1%B9%E7%9B%AE%E4%B8%80%E9%94%AE%E5%85%A8%E9%87%8F%E6%9E%84%E5%BB%BA.html",
      "summary": "这篇文章整理一次远程 C++ 项目编译流程：从 SSH 连接、路径核对，到将全量构建固化为 build.sh，把重复手工操作改成一条可复用命令。",
      "content_html": "<p>这篇文章整理一次远程 C++ 项目编译流程：从 SSH 连接、路径核对，到将全量构建固化为 <code>build.sh</code>，把重复手工操作改成一条可复用命令。</p>\n<!-- more -->\n<h1>远程 C++ 项目一键全量构建</h1>\n<h2>1. 场景信息</h2>\n<ul>\n<li>目标主机：<code>10.6.223.0</code></li>\n<li>项目根目录：<code>/home/sunri/PRS-7950/V1.00_2024</code></li>\n<li>C++ 源码目录：<code>/home/sunri/PRS-7950/V1.00_2024/src_cxx</code></li>\n</ul>\n<h2>2. 先确认连接与路径</h2>\n<p>先验证 SSH 连通性：</p>\n<div class=\"language-bash line-numbers-mode\" data-highlighter=\"shiki\" data-ext=\"bash\" style=\"--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34\"><pre class=\"shiki shiki-themes one-light one-dark-pro vp-code\"><code class=\"language-bash\"><span class=\"line\"><span style=\"--shiki-light:#4078F2;--shiki-dark:#61AFEF\">ssh</span><span style=\"--shiki-light:#986801;--shiki-dark:#D19A66\"> 10.6.223.0</span></span></code></pre>\n<div class=\"line-numbers\" aria-hidden=\"true\" style=\"counter-reset:line-number 0\"><div class=\"line-number\"></div></div></div><p>连接后可用 <code>hostname</code> 确认机器身份。</p>\n<p>这次排查中，一个关键点是目录名确认：</p>\n<ul>\n<li>错误路径：<code>/home/sunri/PRS-7950/V1.00_2024/src_cx</code></li>\n<li>正确路径：<code>/home/sunri/PRS-7950/V1.00_2024/src_cxx</code></li>\n</ul>\n<p>编译前先核对路径，通常比盲目调整编译参数更有效。</p>\n<h2>3. 执行增量编译</h2>\n<p>在源码目录执行：</p>\n<div class=\"language-bash line-numbers-mode\" data-highlighter=\"shiki\" data-ext=\"bash\" style=\"--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34\"><pre class=\"shiki shiki-themes one-light one-dark-pro vp-code\"><code class=\"language-bash\"><span class=\"line\"><span style=\"--shiki-light:#4078F2;--shiki-dark:#61AFEF\">make</span><span style=\"--shiki-light:#986801;--shiki-dark:#D19A66\"> -j</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"$(</span><span style=\"--shiki-light:#4078F2;--shiki-dark:#61AFEF\">nproc</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">)\"</span></span></code></pre>\n<div class=\"line-numbers\" aria-hidden=\"true\" style=\"counter-reset:line-number 0\"><div class=\"line-number\"></div></div></div><p>说明：</p>\n<ul>\n<li><code>-j&quot;$(nproc)&quot;</code> 表示按 CPU 核心数并行编译</li>\n<li>若出现 <code>Nothing to be done for 'first'</code>，通常表示该目标已是最新状态（增量构建正常现象）</li>\n</ul>\n<h2>4. 固化为一键全量构建脚本</h2>\n<p>在 <code>src_cxx</code> 下创建 <code>build.sh</code>：</p>\n<div class=\"language-bash line-numbers-mode\" data-highlighter=\"shiki\" data-ext=\"bash\" style=\"--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34\"><pre class=\"shiki shiki-themes one-light one-dark-pro vp-code\"><code class=\"language-bash\"><span class=\"line\"><span style=\"--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic\">#!/usr/bin/env bash</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#0184BC;--shiki-dark:#56B6C2\">set</span><span style=\"--shiki-light:#986801;--shiki-dark:#D19A66\"> -euo</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> pipefail</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">SCRIPT_DIR</span><span style=\"--shiki-light:#383A42;--shiki-dark:#56B6C2\">=</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"$(</span><span style=\"--shiki-light:#0184BC;--shiki-dark:#56B6C2\">cd</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> \"$(</span><span style=\"--shiki-light:#4078F2;--shiki-dark:#61AFEF\">dirname</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> \"</span><span style=\"--shiki-light:#E45649;--shiki-dark:#98C379\">${</span><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">BASH_SOURCE</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">[0]</span><span style=\"--shiki-light:#E45649;--shiki-dark:#98C379\">}</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\")\" &#x26;&#x26; </span><span style=\"--shiki-light:#0184BC;--shiki-dark:#56B6C2\">pwd</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">)\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#0184BC;--shiki-dark:#56B6C2\">cd</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> \"</span><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">$SCRIPT_DIR</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#0184BC;--shiki-dark:#56B6C2\">echo</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> \"[build] Cleaning project...\"</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#4078F2;--shiki-dark:#61AFEF\">make</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> clean</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#0184BC;--shiki-dark:#56B6C2\">echo</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> \"[build] Building project (full rebuild)...\"</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#4078F2;--shiki-dark:#61AFEF\">make</span><span style=\"--shiki-light:#986801;--shiki-dark:#D19A66\"> -j</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"$(</span><span style=\"--shiki-light:#4078F2;--shiki-dark:#61AFEF\">nproc</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">)\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#0184BC;--shiki-dark:#56B6C2\">echo</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> \"[build] Done.\"</span></span></code></pre>\n<div class=\"line-numbers\" aria-hidden=\"true\" style=\"counter-reset:line-number 0\"><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div></div></div><p>赋予执行权限：</p>\n<div class=\"language-bash line-numbers-mode\" data-highlighter=\"shiki\" data-ext=\"bash\" style=\"--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34\"><pre class=\"shiki shiki-themes one-light one-dark-pro vp-code\"><code class=\"language-bash\"><span class=\"line\"><span style=\"--shiki-light:#4078F2;--shiki-dark:#61AFEF\">chmod</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> +x</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> build.sh</span></span></code></pre>\n<div class=\"line-numbers\" aria-hidden=\"true\" style=\"counter-reset:line-number 0\"><div class=\"line-number\"></div></div></div><h2>5. 日常使用方式</h2>\n<div class=\"language-bash line-numbers-mode\" data-highlighter=\"shiki\" data-ext=\"bash\" style=\"--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34\"><pre class=\"shiki shiki-themes one-light one-dark-pro vp-code\"><code class=\"language-bash\"><span class=\"line\"><span style=\"--shiki-light:#0184BC;--shiki-dark:#56B6C2\">cd</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> /home/sunri/PRS-7950/V1.00_2024/src_cxx</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#4078F2;--shiki-dark:#61AFEF\">./build.sh</span></span></code></pre>\n<div class=\"line-numbers\" aria-hidden=\"true\" style=\"counter-reset:line-number 0\"><div class=\"line-number\"></div><div class=\"line-number\"></div></div></div><p>脚本固定执行两步：</p>\n<ol>\n<li><code>make clean</code></li>\n<li><code>make -j&quot;$(nproc)&quot;</code></li>\n</ol>\n<h2>6. 小结</h2>\n<p>这套流程的核心不是命令复杂度，而是标准化：</p>\n<ul>\n<li>先确认路径和环境</li>\n<li>再把全量构建流程脚本化</li>\n</ul>\n<p>后续交付或排障时，只需要统一执行 <code>./build.sh</code> 即可降低沟通与操作成本。</p>\n",
      "date_published": "2026-03-09T00:00:00.000Z",
      "authors": [],
      "tags": [
        "编程",
        "C++"
      ]
    },
    {
      "title": "AlgoSimulation 打包与交付记录",
      "url": "https://www.mangmang.fun/work/project-summary/%E6%99%BA%E8%83%BD%E5%B7%A1%E8%A7%86/algosimulation-%E6%89%93%E5%8C%85%E4%B8%8E%E4%BA%A4%E4%BB%98%E8%AE%B0%E5%BD%95.html",
      "id": "https://www.mangmang.fun/work/project-summary/%E6%99%BA%E8%83%BD%E5%B7%A1%E8%A7%86/algosimulation-%E6%89%93%E5%8C%85%E4%B8%8E%E4%BA%A4%E4%BB%98%E8%AE%B0%E5%BD%95.html",
      "summary": "本文记录 AlgoSimulation 在目标机器上的编译、依赖修正与独立目录打包过程，重点是 OpenSSL 符号版本冲突的定位与处理。",
      "content_html": "<p>本文记录 AlgoSimulation 在目标机器上的编译、依赖修正与独立目录打包过程，重点是 OpenSSL 符号版本冲突的定位与处理。</p>\n<!-- more -->\n<h1>AlgoSimulation 打包与交付记录</h1>\n<h2>1. 目标与环境</h2>\n<ul>\n<li>编译目标：<code>/home/sunri/IdeaProjects/V2.00/src_cxx/99_TestTool/AlgoSimulation</code></li>\n<li>编译机：<code>10.6.221.8</code></li>\n<li>参考机：<code>10.6.220.186</code></li>\n<li>约束：<code>08_Preview</code> 已同步完成，本次仅处理编译、链接与打包</li>\n</ul>\n<h2>2. 基础编译流程</h2>\n<div class=\"language-bash line-numbers-mode\" data-highlighter=\"shiki\" data-ext=\"bash\" style=\"--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34\"><pre class=\"shiki shiki-themes one-light one-dark-pro vp-code\"><code class=\"language-bash\"><span class=\"line\"><span style=\"--shiki-light:#A626A4;--shiki-dark:#C678DD\">export</span><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\"> PRJHOME</span><span style=\"--shiki-light:#383A42;--shiki-dark:#56B6C2\">=</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">/</span><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">home</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">/</span><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">sunri</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">/</span><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">IdeaProjects</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">/</span><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">V2</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">.</span><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">00</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#A626A4;--shiki-dark:#C678DD\">export</span><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\"> CYGHOME</span><span style=\"--shiki-light:#383A42;--shiki-dark:#56B6C2\">=</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">/</span><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">home</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">/</span><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">sunri</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">/</span><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">08_Preview</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">/</span><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">linx80</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#0184BC;--shiki-dark:#56B6C2\">cd</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> /home/sunri/IdeaProjects/V2.00/src_cxx/99_TestTool/AlgoSimulation</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#4078F2;--shiki-dark:#61AFEF\">qmake</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> AlgoSimulation.pro</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#4078F2;--shiki-dark:#61AFEF\">make</span><span style=\"--shiki-light:#986801;--shiki-dark:#D19A66\"> -j4</span></span></code></pre>\n<div class=\"line-numbers\" aria-hidden=\"true\" style=\"counter-reset:line-number 0\"><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div></div></div><h2>3. 链接问题与修正</h2>\n<p>链接阶段出现 OpenSSL 相关符号版本不匹配（<code>OPENSSL_1_1_0d</code>）。</p>\n<p>原因是 <code>libmosquitto</code>、<code>libcurl</code>、<code>libssh2</code> 依赖的 OpenSSL 版本，与系统默认搜索到的 <code>libssl/libcrypto</code> 不一致。</p>\n<p>修正方式：通过 <code>qmake</code> 注入链接参数，显式指定 <code>gmssl</code> 库并关闭 <code>as-needed</code> 提前裁剪。</p>\n<div class=\"language-bash line-numbers-mode\" data-highlighter=\"shiki\" data-ext=\"bash\" style=\"--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34\"><pre class=\"shiki shiki-themes one-light one-dark-pro vp-code\"><code class=\"language-bash\"><span class=\"line\"><span style=\"--shiki-light:#A626A4;--shiki-dark:#C678DD\">export</span><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\"> PRJHOME</span><span style=\"--shiki-light:#383A42;--shiki-dark:#56B6C2\">=</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">/</span><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">home</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">/</span><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">sunri</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">/</span><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">IdeaProjects</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">/</span><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">V2</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">.</span><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">00</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#A626A4;--shiki-dark:#C678DD\">export</span><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\"> CYGHOME</span><span style=\"--shiki-light:#383A42;--shiki-dark:#56B6C2\">=</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">/</span><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">home</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">/</span><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">sunri</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">/</span><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">08_Preview</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">/</span><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">linx80</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#0184BC;--shiki-dark:#56B6C2\">cd</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> /home/sunri/IdeaProjects/V2.00/src_cxx/99_TestTool/AlgoSimulation</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#4078F2;--shiki-dark:#61AFEF\">make</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> clean</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#4078F2;--shiki-dark:#61AFEF\">qmake</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> \"QMAKE_LFLAGS+=-Wl,--no-as-needed\"</span><span style=\"--shiki-light:#0184BC;--shiki-dark:#56B6C2\"> \\</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">      \"LIBS+=/usr/local/gmssl/lib/libssl.so.1.1 /usr/local/gmssl/lib/libcrypto.so.1.1\"</span><span style=\"--shiki-light:#0184BC;--shiki-dark:#56B6C2\"> \\</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">      AlgoSimulation.pro</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#4078F2;--shiki-dark:#61AFEF\">make</span><span style=\"--shiki-light:#986801;--shiki-dark:#D19A66\"> -j4</span></span></code></pre>\n<div class=\"line-numbers\" aria-hidden=\"true\" style=\"counter-reset:line-number 0\"><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div></div></div><p>编译产物：<code>/home/sunri/IdeaProjects/V2.00/binary/linx80/bin/AlgoSimulation</code></p>\n<h2>4. 独立目录打包</h2>\n<p>目标目录：<code>/home/sunri/Desktop/AlgoSimulation_tool</code></p>\n<div class=\"language-bash line-numbers-mode\" data-highlighter=\"shiki\" data-ext=\"bash\" style=\"--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34\"><pre class=\"shiki shiki-themes one-light one-dark-pro vp-code\"><code class=\"language-bash\"><span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">TOOL</span><span style=\"--shiki-light:#383A42;--shiki-dark:#56B6C2\">=</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">/home/sunri/Desktop/AlgoSimulation_tool</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">BIN</span><span style=\"--shiki-light:#383A42;--shiki-dark:#56B6C2\">=</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">/home/sunri/IdeaProjects/V2.00/binary/linx80/bin/AlgoSimulation</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#4078F2;--shiki-dark:#61AFEF\">rm</span><span style=\"--shiki-light:#986801;--shiki-dark:#D19A66\"> -rf</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> \"</span><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">$TOOL</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#4078F2;--shiki-dark:#61AFEF\">mkdir</span><span style=\"--shiki-light:#986801;--shiki-dark:#D19A66\"> -p</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> \"</span><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">$TOOL</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">/bin\"</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> \"</span><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">$TOOL</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">/lib\"</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#4078F2;--shiki-dark:#61AFEF\">cp</span><span style=\"--shiki-light:#986801;--shiki-dark:#D19A66\"> -f</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> \"</span><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">$BIN</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> \"</span><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">$TOOL</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">/bin/\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#4078F2;--shiki-dark:#61AFEF\">ldd</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> \"</span><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">$BIN</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\"> | </span><span style=\"--shiki-light:#4078F2;--shiki-dark:#61AFEF\">awk</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> '/=> \\/home\\/sunri\\// {print $3} /=> \\/usr\\/local\\/gmssl\\// {print $3}'</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\"> | </span><span style=\"--shiki-light:#4078F2;--shiki-dark:#61AFEF\">sort</span><span style=\"--shiki-light:#986801;--shiki-dark:#D19A66\"> -u</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\"> | </span><span style=\"--shiki-light:#A626A4;--shiki-dark:#C678DD\">while</span><span style=\"--shiki-light:#0184BC;--shiki-dark:#56B6C2\"> read</span><span style=\"--shiki-light:#986801;--shiki-dark:#D19A66\"> -r</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> so</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">; </span><span style=\"--shiki-light:#A626A4;--shiki-dark:#C678DD\">do</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#4078F2;--shiki-dark:#61AFEF\">  cp</span><span style=\"--shiki-light:#986801;--shiki-dark:#D19A66\"> -f</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> \"</span><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">$so</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> \"</span><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">$TOOL</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">/lib/\"</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#A626A4;--shiki-dark:#C678DD\">done</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#4078F2;--shiki-dark:#61AFEF\">cp</span><span style=\"--shiki-light:#986801;--shiki-dark:#D19A66\"> -f</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> /usr/local/gmssl/lib/libssl.so.1.1</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> \"</span><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">$TOOL</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">/lib/\"</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#4078F2;--shiki-dark:#61AFEF\">cp</span><span style=\"--shiki-light:#986801;--shiki-dark:#D19A66\"> -f</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> /usr/local/gmssl/lib/libcrypto.so.1.1</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> \"</span><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">$TOOL</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">/lib/\"</span></span></code></pre>\n<div class=\"line-numbers\" aria-hidden=\"true\" style=\"counter-reset:line-number 0\"><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div></div></div><p>启动脚本 <code>run_AlgoSimulation.sh</code>：</p>\n<div class=\"language-bash line-numbers-mode\" data-highlighter=\"shiki\" data-ext=\"bash\" style=\"--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34\"><pre class=\"shiki shiki-themes one-light one-dark-pro vp-code\"><code class=\"language-bash\"><span class=\"line\"><span style=\"--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic\">#!/usr/bin/env bash</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#0184BC;--shiki-dark:#56B6C2\">set</span><span style=\"--shiki-light:#986801;--shiki-dark:#D19A66\"> -e</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">SCRIPT_DIR</span><span style=\"--shiki-light:#383A42;--shiki-dark:#56B6C2\">=</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"$(</span><span style=\"--shiki-light:#0184BC;--shiki-dark:#56B6C2\">cd</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> \"$(</span><span style=\"--shiki-light:#4078F2;--shiki-dark:#61AFEF\">dirname</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> \"</span><span style=\"--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic\">$0</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\")\" &#x26;&#x26; </span><span style=\"--shiki-light:#0184BC;--shiki-dark:#56B6C2\">pwd</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">)\"</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#A626A4;--shiki-dark:#C678DD\">export</span><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\"> LD_LIBRARY_PATH</span><span style=\"--shiki-light:#383A42;--shiki-dark:#56B6C2\">=</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"</span><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">$SCRIPT_DIR</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">/lib:</span><span style=\"--shiki-light:#E45649;--shiki-dark:#98C379\">${</span><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">LD_LIBRARY_PATH</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">:-</span><span style=\"--shiki-light:#E45649;--shiki-dark:#98C379\">}</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#0184BC;--shiki-dark:#56B6C2\">exec</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> \"</span><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">$SCRIPT_DIR</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">/bin/AlgoSimulation\"</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> \"</span><span style=\"--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic\">$@</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">\"</span></span></code></pre>\n<div class=\"line-numbers\" aria-hidden=\"true\" style=\"counter-reset:line-number 0\"><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div><div class=\"line-number\"></div></div></div><h2>5. 验证结果</h2>\n<p>缺库检查：</p>\n<div class=\"language-bash line-numbers-mode\" data-highlighter=\"shiki\" data-ext=\"bash\" style=\"--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34\"><pre class=\"shiki shiki-themes one-light one-dark-pro vp-code\"><code class=\"language-bash\"><span class=\"line\"><span style=\"--shiki-light:#E45649;--shiki-dark:#E06C75\">LD_LIBRARY_PATH</span><span style=\"--shiki-light:#383A42;--shiki-dark:#56B6C2\">=</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">/home/sunri/Desktop/AlgoSimulation_tool/lib</span><span style=\"--shiki-light:#4078F2;--shiki-dark:#61AFEF\"> \\</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\">ldd </span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\">/home/sunri/Desktop/AlgoSimulation_tool/bin/AlgoSimulation</span><span style=\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\"> | </span><span style=\"--shiki-light:#4078F2;--shiki-dark:#61AFEF\">grep</span><span style=\"--shiki-light:#50A14F;--shiki-dark:#98C379\"> \"not found\"</span></span></code></pre>\n<div class=\"line-numbers\" aria-hidden=\"true\" style=\"counter-reset:line-number 0\"><div class=\"line-number\"></div><div class=\"line-number\"></div></div></div><ul>\n<li>结果：无输出（未发现缺失依赖）</li>\n</ul>\n<p>启动冒烟：</p>\n<ul>\n<li>在无图形会话环境下提示 <code>cannot connect to X server</code></li>\n<li>结论：当前阻塞点是图形环境，不是依赖缺失</li>\n</ul>\n<h2>6. 交付清单</h2>\n<ul>\n<li><code>/home/sunri/Desktop/AlgoSimulation_tool/bin/AlgoSimulation</code></li>\n<li><code>/home/sunri/Desktop/AlgoSimulation_tool/lib/</code></li>\n<li><code>/home/sunri/Desktop/AlgoSimulation_tool/run_AlgoSimulation.sh</code></li>\n</ul>\n<h2>7. 后续建议</h2>\n<p>若后续仍出现符号版本或缺库问题，优先按缺失项从 <code>10.6.220.186</code> 精准补齐，避免全量同步带来的不可控差异。</p>\n",
      "date_published": "2026-03-09T00:00:00.000Z",
      "authors": [],
      "tags": [
        "工作",
        "项目总结"
      ]
    }
  ]
}