<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>东方星痕</title>
  
  <subtitle>请你给我力量，给我方向， 用风一样的翅膀，更用力的飞翔.</subtitle>
  <link href="/atom.xml" rel="self"/>
  
  <link href="http://ystyle.top/"/>
  <updated>2026-04-03T16:16:50.664Z</updated>
  <id>http://ystyle.top/</id>
  
  <author>
    <name>YSTYLE</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>仓颉语言 Neovim 开发环境配置指南</title>
    <link href="http://ystyle.top/2026/04/03/cangjie-neovim-dev-setup/"/>
    <id>http://ystyle.top/2026/04/03/cangjie-neovim-dev-setup/</id>
    <published>2026-04-03T15:30:00.000Z</published>
    <updated>2026-04-03T16:16:50.664Z</updated>
    
    <content type="html"><![CDATA[<p>本文档介绍如何在 openEuler (aarch64) 系统上配置 Neovim (AstroNvim) 开发环境，用于仓颉语言开发。</p><h2 id="目录"><a href="#目录" class="headerlink" title="目录"></a>目录</h2><ul><li><a href="#系统要求">系统要求</a></li><li><a href="#安装仓颉-sdk">安装仓颉 SDK</a></li><li><a href="#安装-cangjie-stdx">安装 Cangjie STDX</a></li><li><a href="#环境变量配置">环境变量配置</a></li><li><a href="#neovim-配置">Neovim 配置</a></li><li><a href="#常见问题">常见问题</a></li></ul><h2 id="系统要求"><a href="#系统要求" class="headerlink" title="系统要求"></a>系统要求</h2><ul><li>操作系统：openEuler 2403 SP1 (aarch64)</li><li>GCC 版本：12.3.1 或更高</li><li>Neovim 版本：0.9.0 或更高</li></ul><h2 id="安装仓颉-SDK"><a href="#安装仓颉-SDK" class="headerlink" title="安装仓颉 SDK"></a>安装仓颉 SDK</h2><ol><li>从官方渠道下载仓颉 SDK (aarch64 版本)</li><li>解压到 <code>~/.config/cjvs/store/</code> 目录</li></ol><p>目录结构示例：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">~/.config/cjvs/</span><br><span class="line">└── store/</span><br><span class="line">    └── 1.1.0-beta.25/</span><br><span class="line">        ├── envsetup.sh</span><br><span class="line">        ├── lib/</span><br><span class="line">        ├── runtime/</span><br><span class="line">        └── ...</span><br></pre></td></tr></table></figure></p><h2 id="安装-Cangjie-STDX"><a href="#安装-Cangjie-STDX" class="headerlink" title="安装 Cangjie STDX"></a>安装 Cangjie STDX</h2><p>STDX 是仓颉的标准扩展库，需要单独安装：</p><ol><li>从发布页面下载：<a href="https://gitcode.com/Cangjie/cangjie_stdx/releases/v1.1.0-beta.24.1" target="_blank" rel="noopener">https://gitcode.com/Cangjie/cangjie_stdx/releases/v1.1.0-beta.24.1</a></li><li>选择 <code>linux_aarch64_cjnative</code> 版本</li><li>解压到 <code>~/.config/cjvs/stdx/</code> 目录</li></ol><p>目录结构示例：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">~/.config/cjvs/</span><br><span class="line">└── stdx/</span><br><span class="line">    └── 1.1.0-beta.24/</span><br><span class="line">        └── linux_aarch64_cjnative/</span><br><span class="line">            └── static/</span><br><span class="line">                └── stdx/</span><br><span class="line">                    ├── stdx.cjo</span><br><span class="line">                    └── ...</span><br></pre></td></tr></table></figure></p><h2 id="环境变量配置"><a href="#环境变量配置" class="headerlink" title="环境变量配置"></a>环境变量配置</h2><p>编辑 <code>~/.zshrc</code>，添加以下配置：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 仓颉 SDK 环境配置</span></span><br><span class="line"><span class="built_in">source</span> <span class="variable">$HOME</span>/.config/cjvs/store/1.1.0-beta.25/envsetup.sh</span><br><span class="line"></span><br><span class="line"><span class="comment"># STDX 路径配置</span></span><br><span class="line"><span class="built_in">export</span> CANGJIE_STDX_PATH=<span class="string">"<span class="variable">$HOME</span>/.config/cjvs/stdx/1.1.0-beta.24/linux_aarch64_cjnative/static/stdx"</span></span><br></pre></td></tr></table></figure><p>配置完成后执行：<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">source</span> ~/.zshrc</span><br></pre></td></tr></table></figure></p><p><strong>说明</strong>：</p><ul><li><code>envsetup.sh</code>：设置仓颉编译器所需的环境变量</li><li><code>CANGJIE_STDX_PATH</code>：指定 STDX 库的路径</li></ul><h3 id="创建-GCC-运行时库符号链接"><a href="#创建-GCC-运行时库符号链接" class="headerlink" title="创建 GCC 运行时库符号链接"></a>创建 GCC 运行时库符号链接</h3><p>由于仓颉链接器脚本默认搜索 <code>/lib64</code> 目录，需要创建符号链接：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">sudo ln -sf /usr/lib/gcc/aarch64-openEuler-linux/12/crtbeginS.o /lib64/crtbeginS.o</span><br><span class="line">sudo ln -sf /usr/lib/gcc/aarch64-openEuler-linux/12/crtendS.o /lib64/crtendS.o</span><br><span class="line">sudo ln -sf /usr/lib/gcc/aarch64-openEuler-linux/12/crtbegin.o /lib64/crtbegin.o</span><br><span class="line">sudo ln -sf /usr/lib/gcc/aarch64-openEuler-linux/12/crtend.o /lib64/crtend.o</span><br></pre></td></tr></table></figure><p><strong>说明</strong>：解决链接时找不到 <code>crtbeginS.o</code> 等运行时库的问题</p><h2 id="Neovim-配置"><a href="#Neovim-配置" class="headerlink" title="Neovim 配置"></a>Neovim 配置</h2><h3 id="1-安装-AstroNvim"><a href="#1-安装-AstroNvim" class="headerlink" title="1. 安装 AstroNvim"></a>1. 安装 AstroNvim</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> --depth 1 https://github.com/AstroNvim/AstroNvim ~/.config/nvim</span><br></pre></td></tr></table></figure><h3 id="2-配置仓颉-LSP-插件"><a href="#2-配置仓颉-LSP-插件" class="headerlink" title="2. 配置仓颉 LSP 插件"></a>2. 配置仓颉 LSP 插件</h3><p>创建文件 <code>~/.config/nvim/lua/plugins/cangjie-lsp.lua</code>：</p><figure class="highlight lua"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">return</span> &#123;</span><br><span class="line">  <span class="string">"https://gitcode.com/ystyle/cangjie-nvim"</span>,</span><br><span class="line">  dependencies = &#123; <span class="string">"neovim/nvim-lspconfig"</span> &#125;,</span><br><span class="line">  opts = &#123; auto_install = <span class="literal">true</span> &#125;,</span><br><span class="line">  <span class="built_in">config</span> = <span class="function"><span class="keyword">function</span><span class="params">(plugin)</span></span></span><br><span class="line">    <span class="built_in">require</span>(<span class="string">"cangjie-nvim"</span>).setup(plugin.opts)</span><br><span class="line"></span><br><span class="line">    vim.api.nvim_create_autocmd(<span class="string">"LspAttach"</span>, &#123;</span><br><span class="line">      callback = <span class="function"><span class="keyword">function</span><span class="params">(args)</span></span></span><br><span class="line">        <span class="keyword">if</span> vim.bo[args.buf].filetype ~= <span class="string">"Cangjie"</span> <span class="keyword">then</span> <span class="keyword">return</span> <span class="keyword">end</span></span><br><span class="line">        </span><br><span class="line">        <span class="keyword">local</span> <span class="function"><span class="keyword">function</span> <span class="title">map</span><span class="params">(mode, lhs, rhs, desc)</span></span></span><br><span class="line">          vim.keymap.set(mode, lhs, rhs, &#123; buffer = args.buf, desc = desc &#125;)</span><br><span class="line">        <span class="keyword">end</span></span><br><span class="line"></span><br><span class="line">        map(<span class="string">"n"</span>, <span class="string">"&lt;leader&gt;li"</span>, <span class="string">"&lt;cmd&gt;LspInfo&lt;cr&gt;"</span>, <span class="string">"LSP Info"</span>)</span><br><span class="line">        map(<span class="string">"n"</span>, <span class="string">"K"</span>, vim.lsp.buf.hover, <span class="string">"Hover Document"</span>)</span><br><span class="line">        map(<span class="string">"n"</span>, <span class="string">"&lt;leader&gt;lf"</span>, <span class="function"><span class="keyword">function</span><span class="params">()</span></span> vim.lsp.buf.<span class="built_in">format</span> &#123; async = <span class="literal">true</span> &#125; <span class="keyword">end</span>, <span class="string">"Format Document"</span>)</span><br><span class="line">        map(<span class="string">"n"</span>, <span class="string">"gl"</span>, vim.diagnostic.open_float, <span class="string">"Line Diagnostics"</span>)</span><br><span class="line">        map(<span class="string">"n"</span>, <span class="string">"&lt;leader&gt;ld"</span>, vim.diagnostic.open_float, <span class="string">"Line Diagnostics"</span>)</span><br><span class="line">        map(<span class="string">"n"</span>, <span class="string">"&lt;leader&gt;lD"</span>, vim.diagnostic.setqflist, <span class="string">"All Diagnostics"</span>)</span><br><span class="line">        map(<span class="string">"n"</span>, <span class="string">"gra"</span>, vim.lsp.buf.code_action, <span class="string">"Code Actions"</span>)</span><br><span class="line">        map(<span class="string">"n"</span>, <span class="string">"&lt;leader&gt;la"</span>, vim.lsp.buf.code_action, <span class="string">"Code Actions"</span>)</span><br><span class="line">        map(<span class="string">"n"</span>, <span class="string">"&lt;leader&gt;lh"</span>, vim.lsp.buf.signature_help, <span class="string">"Signature Help"</span>)</span><br><span class="line">        map(<span class="string">"n"</span>, <span class="string">"grn"</span>, vim.lsp.buf.<span class="built_in">rename</span>, <span class="string">"Rename"</span>)</span><br><span class="line">        map(<span class="string">"n"</span>, <span class="string">"&lt;leader&gt;lr"</span>, vim.lsp.buf.<span class="built_in">rename</span>, <span class="string">"Rename"</span>)</span><br><span class="line">        map(<span class="string">"n"</span>, <span class="string">"&lt;leader&gt;ls"</span>, vim.lsp.buf.document_symbol, <span class="string">"Document Symbols"</span>)</span><br><span class="line">        map(<span class="string">"n"</span>, <span class="string">"&lt;leader&gt;lG"</span>, vim.lsp.buf.workspace_symbol, <span class="string">"Workspace Symbols"</span>)</span><br><span class="line">        map(<span class="string">"n"</span>, <span class="string">"]d"</span>, vim.diagnostic.goto_next, <span class="string">"Diagnostic Next"</span>)</span><br><span class="line">        map(<span class="string">"n"</span>, <span class="string">"[d"</span>, vim.diagnostic.goto_prev, <span class="string">"Diagnostics Previous"</span>)</span><br><span class="line">        map(<span class="string">"n"</span>, <span class="string">"]e"</span>, <span class="function"><span class="keyword">function</span><span class="params">()</span></span> vim.diagnostic.goto_next &#123; severity = vim.diagnostic.severity.ERROR &#125; <span class="keyword">end</span>, <span class="string">"Error Next"</span>)</span><br><span class="line">        map(<span class="string">"n"</span>, <span class="string">"[e"</span>, <span class="function"><span class="keyword">function</span><span class="params">()</span></span> vim.diagnostic.goto_prev &#123; severity = vim.diagnostic.severity.ERROR &#125; <span class="keyword">end</span>, <span class="string">"Error Previous"</span>)</span><br><span class="line">        map(<span class="string">"n"</span>, <span class="string">"]w"</span>, <span class="function"><span class="keyword">function</span><span class="params">()</span></span> vim.diagnostic.goto_next &#123; severity = vim.diagnostic.severity.WARN &#125; <span class="keyword">end</span>, <span class="string">"Warning Next"</span>)</span><br><span class="line">        map(<span class="string">"n"</span>, <span class="string">"[w"</span>, <span class="function"><span class="keyword">function</span><span class="params">()</span></span> vim.diagnostic.goto_prev &#123; severity = vim.diagnostic.severity.WARN &#125; <span class="keyword">end</span>, <span class="string">"Warning Previous"</span>)</span><br><span class="line">        map(<span class="string">"n"</span>, <span class="string">"gD"</span>, vim.lsp.buf.declaration, <span class="string">"Declaration"</span>)</span><br><span class="line">        map(<span class="string">"n"</span>, <span class="string">"gy"</span>, vim.lsp.buf.type_definition, <span class="string">"Type Definition"</span>)</span><br><span class="line">        map(<span class="string">"n"</span>, <span class="string">"gd"</span>, vim.lsp.buf.definition, <span class="string">"Definition"</span>)</span><br><span class="line">        map(<span class="string">"n"</span>, <span class="string">"gri"</span>, vim.lsp.buf.implementation, <span class="string">"Implementation"</span>)</span><br><span class="line">        map(<span class="string">"n"</span>, <span class="string">"grr"</span>, vim.lsp.buf.references, <span class="string">"References"</span>)</span><br><span class="line">      <span class="keyword">end</span>,</span><br><span class="line">    &#125;)</span><br><span class="line">  <span class="keyword">end</span>,</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="3-启动-Neovim-并安装插件"><a href="#3-启动-Neovim-并安装插件" class="headerlink" title="3. 启动 Neovim 并安装插件"></a>3. 启动 Neovim 并安装插件</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">nvim</span><br></pre></td></tr></table></figure><p>AstroNvim 会自动检测并安装 <code>cangjie-nvim</code> 插件。首次打开 <code>.cj</code> 文件时，插件会自动下载 LSP wrapper 二进制文件。</p><p><strong>LSP Wrapper 地址</strong>：</p><ul><li>项目地址：<a href="https://gitcode.com/ystyle/cangjie-lsp-wrapper" target="_blank" rel="noopener">https://gitcode.com/ystyle/cangjie-lsp-wrapper</a></li><li>自动下载位置：<code>~/.local/share/nvim/data/cangjie-nvim/bin/</code></li></ul><h2 id="常见问题"><a href="#常见问题" class="headerlink" title="常见问题"></a>常见问题</h2><h3 id="1-链接错误：cannot-find-crtbeginS-o"><a href="#1-链接错误：cannot-find-crtbeginS-o" class="headerlink" title="1. 链接错误：cannot find crtbeginS.o"></a>1. 链接错误：cannot find crtbeginS.o</h3><p><strong>错误信息</strong>：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/usr/bin/ld: cannot find crtbeginS.o: No such file or directory</span><br></pre></td></tr></table></figure></p><p><strong>解决方案</strong>：<br>创建 GCC 运行时库符号链接：<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">sudo ln -sf /usr/lib/gcc/aarch64-openEuler-linux/12/crtbeginS.o /lib64/crtbeginS.o</span><br><span class="line">sudo ln -sf /usr/lib/gcc/aarch64-openEuler-linux/12/crtendS.o /lib64/crtendS.o</span><br><span class="line">sudo ln -sf /usr/lib/gcc/aarch64-openEuler-linux/12/crtbegin.o /lib64/crtbegin.o</span><br><span class="line">sudo ln -sf /usr/lib/gcc/aarch64-openEuler-linux/12/crtend.o /lib64/crtend.o</span><br></pre></td></tr></table></figure></p><h3 id="2-LSP-不工作"><a href="#2-LSP-不工作" class="headerlink" title="2. LSP 不工作"></a>2. LSP 不工作</h3><p><strong>检查步骤</strong>：</p><ol><li>确认仓颉 SDK 环境变量已加载：<code>echo $CANGJIE_HOME</code></li><li>确认 LSP wrapper 已下载：<code>ls ~/.local/share/nvim/data/cangjie-nvim/bin/</code></li><li>手动安装 LSP wrapper：<figure class="highlight lua"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">:lua <span class="built_in">require</span>(<span class="string">"cangjie-nvim"</span>).install()</span><br></pre></td></tr></table></figure></li></ol><h3 id="3-找不到-STDX"><a href="#3-找不到-STDX" class="headerlink" title="3. 找不到 STDX"></a>3. 找不到 STDX</h3><p><strong>错误信息</strong>：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">error: cannot find stdx module</span><br></pre></td></tr></table></figure></p><p><strong>解决方案</strong>：<br>确认 <code>CANGJIE_STDX_PATH</code> 环境变量指向正确的目录：<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">ls <span class="variable">$CANGJIE_STDX_PATH</span></span><br><span class="line"><span class="comment"># 应该能看到 stdx.cjo 文件</span></span><br></pre></td></tr></table></figure></p><h3 id="4-快速事件上下文错误"><a href="#4-快速事件上下文错误" class="headerlink" title="4. 快速事件上下文错误"></a>4. 快速事件上下文错误</h3><p><strong>错误信息</strong>：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">E5560: nvim_create_namespace must not be called in a fast event context</span><br></pre></td></tr></table></figure></p><p><strong>解决方案</strong>：<br>此问题已在 <code>cangjie-nvim</code> 插件中修复，请确保使用最新版本。</p><h2 id="键位映射"><a href="#键位映射" class="headerlink" title="键位映射"></a>键位映射</h2><table><thead><tr><th>快捷键</th><th>功能</th></tr></thead><tbody><tr><td><code>K</code></td><td>显示悬停文档</td></tr><tr><td><code>gd</code></td><td>跳转到定义</td></tr><tr><td><code>gD</code></td><td>跳转到声明</td></tr><tr><td><code>gy</code></td><td>跳转到类型定义</td></tr><tr><td><code>gri</code></td><td>跳转到实现</td></tr><tr><td><code>grr</code></td><td>查找引用</td></tr><tr><td><code>grn</code></td><td>重命名</td></tr><tr><td><code>&lt;leader&gt;lf</code></td><td>格式化文档</td></tr><tr><td><code>&lt;leader&gt;la</code></td><td>代码操作</td></tr><tr><td><code>&lt;leader&gt;li</code></td><td>LSP 信息</td></tr><tr><td><code>]d</code> / <code>[d</code></td><td>下一个/上一个诊断</td></tr><tr><td><code>]e</code> / <code>[e</code></td><td>下一个/上一个错误</td></tr><tr><td><code>]w</code> / <code>[w</code></td><td>下一个/上一个警告</td></tr></tbody></table><h2 id="参考链接"><a href="#参考链接" class="headerlink" title="参考链接"></a>参考链接</h2><ul><li><a href="https://cangjie.org/" target="_blank" rel="noopener">仓颉语言官网</a></li><li><a href="https://astronvim.github.io/" target="_blank" rel="noopener">AstroNvim 文档</a></li><li><a href="https://gitcode.com/ystyle/cangjie-nvim" target="_blank" rel="noopener">cangjie-nvim 插件</a></li><li><a href="https://gitcode.com/ystyle/cangjie-lsp-wrapper" target="_blank" rel="noopener">cangjie-lsp-wrapper</a></li><li><a href="https://gitcode.com/Cangjie/cangjie_stdx/releases" target="_blank" rel="noopener">Cangjie STDX 发布</a></li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;本文档介绍如何在 openEuler (aarch64) 系统上配置 Neovim (AstroNvim) 开发环境，用于仓颉语言开发。&lt;/p&gt;
&lt;h2 id=&quot;目录&quot;&gt;&lt;a href=&quot;#目录&quot; class=&quot;headerlink&quot; title=&quot;目录&quot;&gt;&lt;/a&gt;目录&lt;/
      
    
    </summary>
    
      <category term="编程" scheme="http://ystyle.top/categories/%E7%BC%96%E7%A8%8B/"/>
    
    
      <category term="Cangjie" scheme="http://ystyle.top/tags/Cangjie/"/>
    
      <category term="Neovim" scheme="http://ystyle.top/tags/Neovim/"/>
    
      <category term="AstroNvim" scheme="http://ystyle.top/tags/AstroNvim/"/>
    
      <category term="openEuler" scheme="http://ystyle.top/tags/openEuler/"/>
    
  </entry>
  
  <entry>
    <title>鸿蒙PC融合开发引擎中编译安装Neovim与AstroNvim配置指南</title>
    <link href="http://ystyle.top/2026/04/03/matebookpro-container-build-neovim/"/>
    <id>http://ystyle.top/2026/04/03/matebookpro-container-build-neovim/</id>
    <published>2026-04-03T13:35:00.000Z</published>
    <updated>2026-04-03T13:35:00.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="鸿蒙PC融合开发引擎中编译安装Neovim与AstroNvim配置指南"><a href="#鸿蒙PC融合开发引擎中编译安装Neovim与AstroNvim配置指南" class="headerlink" title="鸿蒙PC融合开发引擎中编译安装Neovim与AstroNvim配置指南"></a>鸿蒙PC融合开发引擎中编译安装Neovim与AstroNvim配置指南</h1><blockquote><p>本文记录在鸿蒙PC融合开发引擎的容器环境中，因glibc版本限制从源码编译Neovim和tree-sitter的完整过程，并配置AstroNvim作为开发环境。</p></blockquote><h2 id="问题背景"><a href="#问题背景" class="headerlink" title="问题背景"></a>问题背景</h2><h3 id="glibc版本冲突"><a href="#glibc版本冲突" class="headerlink" title="glibc版本冲突"></a>glibc版本冲突</h3><p>在鸿蒙PC融合开发引擎的openEuler容器中，尝试安装nvim-treesitter插件时遇到错误：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[nvim-treesitter/install/c] error: Error during &quot;tree-sitter build&quot;: </span><br><span class="line">tree-sitter: /usr/lib64/libc.so.6: version `GLIBC_2.39&apos; not found (required by tree-sitter)</span><br></pre></td></tr></table></figure><h3 id="版本检查"><a href="#版本检查" class="headerlink" title="版本检查"></a>版本检查</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">ldd --version</span><br><span class="line"><span class="comment"># 输出：ldd (GNU libc) 2.38</span></span><br><span class="line"></span><br><span class="line">cat /etc/os-release</span><br><span class="line"><span class="comment"># NAME="openEuler"</span></span><br><span class="line"><span class="comment"># VERSION="24.03 (LTS-SP1)"</span></span><br></pre></td></tr></table></figure><p>openEuler 24.03 SP1的glibc是2.38，而nvim-treesitter下载的预编译tree-sitter CLI需要glibc 2.39。</p><h3 id="根本原因"><a href="#根本原因" class="headerlink" title="根本原因"></a>根本原因</h3><p>容器环境共享虚拟机内核，无法升级glibc。解决方案是<strong>从源码编译所有组件</strong>，使用当前系统的glibc版本。</p><h2 id="解决方案总览"><a href="#解决方案总览" class="headerlink" title="解决方案总览"></a>解决方案总览</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">1. 安装编译依赖</span><br><span class="line">2. 安装Rust工具链（编译tree-sitter CLI需要）</span><br><span class="line">3. 从源码编译tree-sitter CLI</span><br><span class="line">4. 从源码编译Neovim</span><br><span class="line">5. 配置AstroNvim</span><br></pre></td></tr></table></figure><h2 id="一、安装编译依赖"><a href="#一、安装编译依赖" class="headerlink" title="一、安装编译依赖"></a>一、安装编译依赖</h2><h3 id="基础工具"><a href="#基础工具" class="headerlink" title="基础工具"></a>基础工具</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装cmake和ninja</span></span><br><span class="line">sudo dnf install -y cmake ninja-build</span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证安装</span></span><br><span class="line">cmake --version</span><br><span class="line">ninja --version</span><br></pre></td></tr></table></figure><h3 id="其他依赖"><a href="#其他依赖" class="headerlink" title="其他依赖"></a>其他依赖</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># gcc、make等已预装</span></span><br><span class="line">gcc --version</span><br><span class="line">make --version</span><br></pre></td></tr></table></figure><h2 id="二、安装Rust工具链"><a href="#二、安装Rust工具链" class="headerlink" title="二、安装Rust工具链"></a>二、安装Rust工具链</h2><p>tree-sitter CLI使用Rust编写，需要先安装Rust：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 设置代理（可选）</span></span><br><span class="line"><span class="built_in">export</span> https_proxy=http://192.168.3.6:1080</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装Rust</span></span><br><span class="line">curl --proto <span class="string">'=https'</span> -sSf https://sh.rustup.rs | sh -s -- -y</span><br><span class="line"></span><br><span class="line"><span class="comment"># 加载环境</span></span><br><span class="line"><span class="built_in">source</span> ~/.cargo/env</span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证</span></span><br><span class="line">cargo --version</span><br><span class="line">rustc --version</span><br></pre></td></tr></table></figure><h2 id="三、编译tree-sitter-CLI"><a href="#三、编译tree-sitter-CLI" class="headerlink" title="三、编译tree-sitter CLI"></a>三、编译tree-sitter CLI</h2><h3 id="获取源码"><a href="#获取源码" class="headerlink" title="获取源码"></a>获取源码</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">export</span> https_proxy=http://192.168.3.6:1080</span><br><span class="line"></span><br><span class="line"><span class="comment"># 克隆tree-sitter CLI（使用稳定版本v0.24.1）</span></span><br><span class="line">git <span class="built_in">clone</span> --depth 1 --branch v0.24.1 \</span><br><span class="line">    https://github.com/tree-sitter/tree-sitter.git \</span><br><span class="line">    ~/tree-sitter-cli</span><br></pre></td></tr></table></figure><h3 id="编译"><a href="#编译" class="headerlink" title="编译"></a>编译</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> ~/tree-sitter-cli</span><br><span class="line">cargo build --release</span><br></pre></td></tr></table></figure><p>编译过程约需1-2分钟。</p><h3 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 系统安装</span></span><br><span class="line">sudo cp ~/tree-sitter-cli/target/release/tree-sitter /usr/<span class="built_in">local</span>/bin/</span><br><span class="line"></span><br><span class="line"><span class="comment"># 或替换mason的预编译版本</span></span><br><span class="line">cp ~/tree-sitter-cli/target/release/tree-sitter \</span><br><span class="line">    ~/.<span class="built_in">local</span>/share/nvim/mason/packages/tree-sitter-cli/tree-sitter-linux-arm64</span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证</span></span><br><span class="line">tree-sitter --version</span><br><span class="line"><span class="comment"># 输出：tree-sitter 0.24.1</span></span><br></pre></td></tr></table></figure><h2 id="四、编译Neovim"><a href="#四、编译Neovim" class="headerlink" title="四、编译Neovim"></a>四、编译Neovim</h2><h3 id="获取源码-1"><a href="#获取源码-1" class="headerlink" title="获取源码"></a>获取源码</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">export</span> https_proxy=http://192.168.3.6:1080</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看最新版本</span></span><br><span class="line">git ls-remote --tags https://github.com/neovim/neovim.git | \</span><br><span class="line">    grep -v <span class="string">'\^&#123;&#125;'</span> | grep <span class="string">'v0\.1[0-2]'</span> | tail -5</span><br><span class="line"></span><br><span class="line"><span class="comment"># 克隆最新稳定版v0.12.0</span></span><br><span class="line">git <span class="built_in">clone</span> --depth 1 --branch v0.12.0 \</span><br><span class="line">    https://github.com/neovim/neovim.git \</span><br><span class="line">    ~/neovim</span><br></pre></td></tr></table></figure><h3 id="编译-1"><a href="#编译-1" class="headerlink" title="编译"></a>编译</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> ~/neovim</span><br><span class="line">make CMAKE_BUILD_TYPE=Release</span><br></pre></td></tr></table></figure><p>编译过程约需3-5分钟，会自动下载并编译所有依赖。</p><h3 id="安装-1"><a href="#安装-1" class="headerlink" title="安装"></a>安装</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">sudo make install</span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证</span></span><br><span class="line">nvim --version</span><br><span class="line"><span class="comment"># 输出：</span></span><br><span class="line"><span class="comment"># NVIM v0.12.0</span></span><br><span class="line"><span class="comment"># Build type: Release</span></span><br><span class="line"><span class="comment"># LuaJIT 2.1.1774638290</span></span><br></pre></td></tr></table></figure><h3 id="编译输出位置"><a href="#编译输出位置" class="headerlink" title="编译输出位置"></a>编译输出位置</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">ls ~/neovim/build/bin/nvim</span><br><span class="line"><span class="comment"># -rwxr-xr-x 1 user user 10346568 ... nvim</span></span><br></pre></td></tr></table></figure><h2 id="五、配置AstroNvim"><a href="#五、配置AstroNvim" class="headerlink" title="五、配置AstroNvim"></a>五、配置AstroNvim</h2><p>AstroNvim是一个预配置的Neovim发行版，提供完整的IDE体验。</p><h3 id="备份现有配置"><a href="#备份现有配置" class="headerlink" title="备份现有配置"></a>备份现有配置</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 备份旧配置</span></span><br><span class="line">mv ~/.config/nvim ~/.config/nvim.bak</span><br><span class="line">mv ~/.<span class="built_in">local</span>/share/nvim ~/.<span class="built_in">local</span>/share/nvim.bak</span><br><span class="line">mv ~/.<span class="built_in">local</span>/state/nvim ~/.<span class="built_in">local</span>/state/nvim.bak</span><br></pre></td></tr></table></figure><h3 id="安装AstroNvim"><a href="#安装AstroNvim" class="headerlink" title="安装AstroNvim"></a>安装AstroNvim</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 克隆AstroNvim配置</span></span><br><span class="line">git <span class="built_in">clone</span> --depth 1 https://github.com/AstroNvim/AstroNvim \</span><br><span class="line">    ~/.config/nvim</span><br><span class="line"></span><br><span class="line"><span class="comment"># 复制默认用户配置模板</span></span><br><span class="line">cp ~/.config/nvim/lua/user_template.lua ~/.config/nvim/lua/user.lua</span><br></pre></td></tr></table></figure><h3 id="首次启动"><a href="#首次启动" class="headerlink" title="首次启动"></a>首次启动</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">nvim</span><br></pre></td></tr></table></figure><p>首次启动会自动安装所有插件和tree-sitter解析器。由于我们已编译了tree-sitter CLI，treesitter安装不会出现glibc错误。</p><h3 id="自定义配置"><a href="#自定义配置" class="headerlink" title="自定义配置"></a>自定义配置</h3><p>编辑 <code>~/.config/nvim/lua/user.lua</code>：</p><figure class="highlight lua"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">return</span> &#123;</span><br><span class="line">  <span class="comment">-- 自定义颜色方案</span></span><br><span class="line">  colorscheme = <span class="string">"catppuccin-mocha"</span>,</span><br><span class="line">  </span><br><span class="line">  <span class="comment">-- 自定义选项</span></span><br><span class="line">  options = &#123;</span><br><span class="line">    opt = &#123;</span><br><span class="line">      relativenumber = <span class="literal">true</span>, <span class="comment">-- 相对行号</span></span><br><span class="line">    &#125;,</span><br><span class="line">  &#125;,</span><br><span class="line">  </span><br><span class="line">  <span class="comment">-- 自定义插件</span></span><br><span class="line">  plugins = &#123;</span><br><span class="line">    <span class="string">"rebelot/kanagawa.nvim"</span>,</span><br><span class="line">    <span class="comment">-- 添加更多插件...</span></span><br><span class="line">  &#125;,</span><br><span class="line">  </span><br><span class="line">  <span class="comment">-- LSP配置</span></span><br><span class="line">  lsp = &#123;</span><br><span class="line">    formatting = &#123;</span><br><span class="line">      format_on_save = <span class="literal">true</span>,</span><br><span class="line">    &#125;,</span><br><span class="line">    servers = &#123;</span><br><span class="line">      <span class="comment">-- 添加LSP服务器...</span></span><br><span class="line">    &#125;,</span><br><span class="line">  &#125;,</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="安装LSP和工具"><a href="#安装LSP和工具" class="headerlink" title="安装LSP和工具"></a>安装LSP和工具</h3><p>在Neovim中运行：</p><figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">:LspInstall <span class="keyword">python</span></span><br><span class="line">:LspInstall lua_ls</span><br><span class="line">:TSInstall <span class="keyword">python</span></span><br><span class="line">:TSInstall <span class="keyword">lua</span></span><br><span class="line">:MasonInstall prettier</span><br></pre></td></tr></table></figure><h2 id="六、验证tree-sitter工作"><a href="#六、验证tree-sitter工作" class="headerlink" title="六、验证tree-sitter工作"></a>六、验证tree-sitter工作</h2><h3 id="安装解析器"><a href="#安装解析器" class="headerlink" title="安装解析器"></a>安装解析器</h3><figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">:TSInstallInfo</span><br></pre></td></tr></table></figure><p>查看可用的解析器，选择需要的安装：</p><figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">:TSInstall vimdoc</span><br><span class="line">:TSInstall <span class="keyword">lua</span></span><br><span class="line">:TSInstall <span class="keyword">python</span></span><br><span class="line">:TSInstall javascript</span><br><span class="line">:TSInstall html</span><br><span class="line">:TSInstall css</span><br><span class="line">:TSInstall json</span><br><span class="line">:TSInstall markdown</span><br></pre></td></tr></table></figure><h3 id="检查状态"><a href="#检查状态" class="headerlink" title="检查状态"></a>检查状态</h3><figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">:TSInstallInfo</span><br></pre></td></tr></table></figure><p>所有解析器应显示为 <code>✓ installed</code>。</p><h2 id="七、总结"><a href="#七、总结" class="headerlink" title="七、总结"></a>七、总结</h2><h3 id="编译清单"><a href="#编译清单" class="headerlink" title="编译清单"></a>编译清单</h3><table><thead><tr><th>组件</th><th>版本</th><th>状态</th></tr></thead><tbody><tr><td>cmake</td><td>3.27.9</td><td>✓ 已安装</td></tr><tr><td>ninja</td><td>1.11.1</td><td>✓ 已安装</td></tr><tr><td>Rust</td><td>1.94.1</td><td>✓ 已安装</td></tr><tr><td>tree-sitter CLI</td><td>0.24.1</td><td>✓ 已编译</td></tr><tr><td>Neovim</td><td>0.12.0</td><td>✓ 已编译</td></tr><tr><td>AstroNvim</td><td>latest</td><td>✓ 已配置</td></tr></tbody></table><h3 id="关键点"><a href="#关键点" class="headerlink" title="关键点"></a>关键点</h3><ol><li><strong>glibc兼容</strong>：从源码编译确保使用当前glibc</li><li><strong>Rust依赖</strong>：tree-sitter CLI需要Rust编译</li><li><strong>完整流程</strong>：依赖 → Rust → tree-sitter → Neovim → AstroNvim</li></ol><h3 id="性能表现"><a href="#性能表现" class="headerlink" title="性能表现"></a>性能表现</h3><p>编译的Neovim在openEuler容器中运行流畅：</p><ul><li>启动速度：&lt; 100ms</li><li>LSP响应：快速</li><li>Treesitter高亮：正常</li><li>插件生态：完整支持</li></ul><h3 id="避坑指南"><a href="#避坑指南" class="headerlink" title="避坑指南"></a>避坑指南</h3><ol><li><strong>不要使用预编译tree-sitter</strong>：mason下载的预编译版本glibc不兼容</li><li><strong>记得替换mason的tree-sitter</strong>：否则nvim-treesitter仍会使用预编译版本</li><li><strong>使用稳定版本</strong>：避免main分支的不稳定性</li></ol><h2 id="八、清理构建文件"><a href="#八、清理构建文件" class="headerlink" title="八、清理构建文件"></a>八、清理构建文件</h2><p>编译完成后可以清理源码：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 可选：保留源码用于后续升级</span></span><br><span class="line"><span class="comment"># 或删除以节省空间</span></span><br><span class="line">rm -rf ~/tree-sitter-cli</span><br><span class="line">rm -rf ~/neovim</span><br></pre></td></tr></table></figure><p>建议保留源码目录，方便后续版本升级。</p><h2 id="九、后续升级"><a href="#九、后续升级" class="headerlink" title="九、后续升级"></a>九、后续升级</h2><p>升级Neovim：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> ~/neovim</span><br><span class="line">git fetch --tags</span><br><span class="line">git checkout v0.13.0  <span class="comment"># 假设新版本</span></span><br><span class="line">make CMAKE_BUILD_TYPE=Release</span><br><span class="line">sudo make install</span><br></pre></td></tr></table></figure><p>升级tree-sitter：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> ~/tree-sitter-cli</span><br><span class="line">git fetch --tags</span><br><span class="line">git checkout v0.25.0  <span class="comment"># 假设新版本</span></span><br><span class="line">cargo build --release</span><br><span class="line">sudo cp target/release/tree-sitter /usr/<span class="built_in">local</span>/bin/</span><br></pre></td></tr></table></figure><hr><p><strong>参考资源</strong>：</p><ul><li>Neovim官网：<a href="https://neovim.io" target="_blank" rel="noopener">https://neovim.io</a></li><li>tree-sitter项目：<a href="https://tree-sitter.github.io" target="_blank" rel="noopener">https://tree-sitter.github.io</a></li><li>AstroNvim文档：<a href="https://astronvim.com" target="_blank" rel="noopener">https://astronvim.com</a></li><li>AstroNvim仓库：<a href="https://github.com/AstroNvim/AstroNvim" target="_blank" rel="noopener">https://github.com/AstroNvim/AstroNvim</a></li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;鸿蒙PC融合开发引擎中编译安装Neovim与AstroNvim配置指南&quot;&gt;&lt;a href=&quot;#鸿蒙PC融合开发引擎中编译安装Neovim与AstroNvim配置指南&quot; class=&quot;headerlink&quot; title=&quot;鸿蒙PC融合开发引擎中编译安装Neovim与
      
    
    </summary>
    
      <category term="软件" scheme="http://ystyle.top/categories/%E8%BD%AF%E4%BB%B6/"/>
    
    
      <category term="AstroNvim" scheme="http://ystyle.top/tags/AstroNvim/"/>
    
      <category term="鸿蒙" scheme="http://ystyle.top/tags/%E9%B8%BF%E8%92%99/"/>
    
      <category term="鸿蒙PC" scheme="http://ystyle.top/tags/%E9%B8%BF%E8%92%99PC/"/>
    
      <category term="neovim" scheme="http://ystyle.top/tags/neovim/"/>
    
      <category term="tree-sitter" scheme="http://ystyle.top/tags/tree-sitter/"/>
    
      <category term="编译安装" scheme="http://ystyle.top/tags/%E7%BC%96%E8%AF%91%E5%AE%89%E8%A3%85/"/>
    
      <category term="Matebook Pro" scheme="http://ystyle.top/tags/Matebook-Pro/"/>
    
  </entry>
  
  <entry>
    <title>鸿蒙PC融合开发引擎架构解析：虚拟机与容器双模式</title>
    <link href="http://ystyle.top/2026/04/03/matebookpro-fusion-dev-engine-architecture/"/>
    <id>http://ystyle.top/2026/04/03/matebookpro-fusion-dev-engine-architecture/</id>
    <published>2026-04-03T13:30:00.000Z</published>
    <updated>2026-04-03T13:30:00.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="鸿蒙PC融合开发引擎架构解析：虚拟机与容器双模式"><a href="#鸿蒙PC融合开发引擎架构解析：虚拟机与容器双模式" class="headerlink" title="鸿蒙PC融合开发引擎架构解析：虚拟机与容器双模式"></a>鸿蒙PC融合开发引擎架构解析：虚拟机与容器双模式</h1><blockquote><p>本文深入解析鸿蒙PC融合开发引擎的技术架构，揭示其如何通过StratoVirt虚拟化和OzoneC容器技术实现Linux应用兼容。</p></blockquote><h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>鸿蒙PC（HarmonyOS PC）采用了独特的架构设计来实现Linux应用兼容。作为用户，我在使用过程中发现系统提供了一个”融合开发引擎”功能，可以在其中运行openEuler环境。本文将解析这个融合开发引擎的技术架构。</p><h2 id="架构探秘"><a href="#架构探秘" class="headerlink" title="架构探秘"></a>架构探秘</h2><h3 id="初次接触"><a href="#初次接触" class="headerlink" title="初次接触"></a>初次接触</h3><p>在鸿蒙PC的融合开发引擎环境中，我尝试运行各种Linux工具时发现：</p><ol><li><strong>文件系统特征</strong>：使用overlay文件系统，路径包含<code>/var/lib/OzoneC/overlay2/</code></li><li><strong>进程信息</strong>：cgroup显示典型的容器特征</li><li><strong>内核版本</strong>：Linux 6.6.0，带有特殊的init进程</li></ol><p>通过一系列探测，我逐渐揭示了其架构。</p><h3 id="架构层次"><a href="#架构层次" class="headerlink" title="架构层次"></a>架构层次</h3><p>经过分析，鸿蒙PC融合开发引擎采用的是<strong>三层架构</strong>：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">鸿蒙PC（HarmonyOS 微内核）</span><br><span class="line">    ↓</span><br><span class="line">StratoVirt 虚拟机（运行Linux）</span><br><span class="line">    ↓</span><br><span class="line">OzoneC 容器（隔离Linux应用环境）</span><br><span class="line">    ↓</span><br><span class="line">用户环境（openEuler容器）</span><br></pre></td></tr></table></figure><h3 id="关键证据"><a href="#关键证据" class="headerlink" title="关键证据"></a>关键证据</h3><h4 id="1-虚拟机特征"><a href="#1-虚拟机特征" class="headerlink" title="1. 虚拟机特征"></a>1. 虚拟机特征</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 查看固件信息</span></span><br><span class="line">ls -la /sys/firmware/</span><br><span class="line"><span class="comment"># 输出包含：qemu_fw_cfg - 这是QEMU/StratoVirt虚拟机的特征</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看内核启动参数</span></span><br><span class="line">cat /proc/cmdline</span><br><span class="line"><span class="comment"># 输出：console=hvc0 root=/dev/vda ro reboot=k panic=1 init=/usr/sbin/HSLd</span></span><br><span class="line"><span class="comment"># - hvc0是virtio虚拟机控制台</span></span><br><span class="line"><span class="comment"># - /dev/vda是虚拟块设备</span></span><br><span class="line"><span class="comment"># - init=/usr/sbin/HSLd是HarmonyOS Linux兼容层的初始化程序</span></span><br></pre></td></tr></table></figure><h4 id="2-容器特征"><a href="#2-容器特征" class="headerlink" title="2. 容器特征"></a>2. 容器特征</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 查看挂载信息</span></span><br><span class="line">cat /proc/mounts</span><br><span class="line"><span class="comment"># 输出：</span></span><br><span class="line">overlay / overlay rw,dirsync,nodev,relatime,</span><br><span class="line">lowerdir=/var/lib/OzoneC/overlay2/rgm_openEuler/lower,</span><br><span class="line">upperdir=/var/lib/ozonec/bundle/openeuler2203fgjM0CXQxp5yLHfFZOK/diff,</span><br><span class="line">workdir=/var/lib/ozonec/bundle/openeuler2203fgjM0CXQxp5yLHfFZOK/work</span><br><span class="line"></span><br><span class="line"><span class="comment"># 这表明：</span></span><br><span class="line"><span class="comment"># - 使用overlay2存储驱动</span></span><br><span class="line"><span class="comment"># - OzoneC是容器运行时</span></span><br><span class="line"><span class="comment"># - openEuler是容器镜像</span></span><br></pre></td></tr></table></figure><h4 id="3-内核分析"><a href="#3-内核分析" class="headerlink" title="3. 内核分析"></a>3. 内核分析</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 查看内核版本</span></span><br><span class="line">uname -a</span><br><span class="line"><span class="comment"># Linux localhost 6.6.0 aarch64</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看CPU信息</span></span><br><span class="line">cat /proc/cpuinfo</span><br><span class="line"><span class="comment"># CPU implementer: 0x41 (ARM)</span></span><br><span class="line"><span class="comment"># CPU architecture: 8</span></span><br><span class="line"><span class="comment"># 没有hypervisor标志，因为运行在虚拟机中</span></span><br></pre></td></tr></table></figure><h2 id="StratoVirt：企业级虚拟化平台"><a href="#StratoVirt：企业级虚拟化平台" class="headerlink" title="StratoVirt：企业级虚拟化平台"></a>StratoVirt：企业级虚拟化平台</h2><h3 id="项目介绍"><a href="#项目介绍" class="headerlink" title="项目介绍"></a>项目介绍</h3><p>StratoVirt是计算产业中面向云数据中心的企业级虚拟化平台，实现了一套架构统一支持虚拟机、容器、Serverless三种场景。在鸿蒙PC上，它作为Linux兼容的基础设施。</p><h3 id="关键特性"><a href="#关键特性" class="headerlink" title="关键特性"></a>关键特性</h3><ol><li><strong>轻量低噪</strong>：高效的虚拟化实现</li><li><strong>软硬协同</strong>：充分利用硬件特性</li><li><strong>Rust语言级安全</strong>：内存安全的实现</li><li><strong>架构统一</strong>：支持多种场景</li></ol><h3 id="运行模式"><a href="#运行模式" class="headerlink" title="运行模式"></a>运行模式</h3><p>StratoVirt支持两种机型：</p><p><strong>microvm机型</strong>（轻量级）：<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">./stratovirt \</span><br><span class="line">    -machine microvm \</span><br><span class="line">    -kernel /path/to/kernel \</span><br><span class="line">    -append <span class="string">"console=ttyAMA0 root=/dev/vda"</span> \</span><br><span class="line">    -drive file=/path/to/rootfs,id=rootfs \</span><br><span class="line">    -device virtio-blk-device,drive=rootfs \</span><br><span class="line">    -serial stdio</span><br></pre></td></tr></table></figure></p><p><strong>标准机型</strong>（完整功能）：<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">./stratovirt \</span><br><span class="line">    -machine virt \</span><br><span class="line">    -kernel /path/to/kernel \</span><br><span class="line">    -drive file=/path/to/firmware,<span class="keyword">if</span>=pflash \</span><br><span class="line">    -device virtio-blk-pci,drive=rootfs \</span><br><span class="line">    -serial stdio</span><br></pre></td></tr></table></figure></p><h2 id="OzoneC：容器运行时"><a href="#OzoneC：容器运行时" class="headerlink" title="OzoneC：容器运行时"></a>OzoneC：容器运行时</h2><h3 id="项目定位"><a href="#项目定位" class="headerlink" title="项目定位"></a>项目定位</h3><p>OzoneC是StratoVirt项目内置的OCI容器运行时，使用Rust语言实现。从源码和挂载路径<code>/var/lib/OzoneC/overlay2/</code>可以确认其使用。</p><h3 id="技术特点"><a href="#技术特点" class="headerlink" title="技术特点"></a>技术特点</h3><p>OzoneC是一个完整的OCI runtime实现：</p><ul><li><strong>开发团队</strong>：Huawei StratoVirt Team</li><li><strong>实现语言</strong>：Rust（内存安全）</li><li><strong>标准兼容</strong>：完全符合OCI runtime-spec</li><li><strong>支持命令</strong>：create, start, state, kill, delete, exec</li></ul><h3 id="核心功能"><a href="#核心功能" class="headerlink" title="核心功能"></a>核心功能</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># OCI标准命令</span></span><br><span class="line">ozonec create  &lt;container-id&gt;  <span class="comment"># 创建容器</span></span><br><span class="line">ozonec start   &lt;container-id&gt;  <span class="comment"># 启动容器</span></span><br><span class="line">ozonec state   &lt;container-id&gt;  <span class="comment"># 查询状态</span></span><br><span class="line">ozonec <span class="built_in">kill</span>    &lt;container-id&gt;  <span class="comment"># 终止容器</span></span><br><span class="line">ozonec delete  &lt;container-id&gt;  <span class="comment"># 删除容器</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 扩展命令</span></span><br><span class="line">ozonec <span class="built_in">exec</span>    &lt;container-id&gt;  <span class="comment"># 在容器中执行命令</span></span><br></pre></td></tr></table></figure><h3 id="架构优势"><a href="#架构优势" class="headerlink" title="架构优势"></a>架构优势</h3><ol><li><strong>Rust实现</strong>：内存安全、无数据竞争</li><li><strong>轻量级</strong>：专为虚拟机场景优化</li><li><strong>原生集成</strong>：与StratoVirt紧密配合</li><li><strong>OCI兼容</strong>：支持标准容器镜像</li></ol><h3 id="与StratoVirt的协作"><a href="#与StratoVirt的协作" class="headerlink" title="与StratoVirt的协作"></a>与StratoVirt的协作</h3><p>OzoneC在StratoVirt虚拟机内部运行，形成双重隔离：</p><ol><li><strong>虚拟机级隔离</strong>：StratoVirt提供硬件级隔离</li><li><strong>容器级隔离</strong>：OzoneC提供应用级隔离</li></ol><p>这种设计兼顾了安全性和性能，且OzoneC作为StratoVirt的子项目，实现了无缝集成。</p><h2 id="融合开发引擎的工作原理"><a href="#融合开发引擎的工作原理" class="headerlink" title="融合开发引擎的工作原理"></a>融合开发引擎的工作原理</h2><h3 id="启动流程"><a href="#启动流程" class="headerlink" title="启动流程"></a>启动流程</h3><ol><li><strong>鸿蒙PC启动</strong>：微内核系统初始化</li><li><strong>StratoVirt启动</strong>：创建Linux虚拟机</li><li><strong>HSLd初始化</strong>：HarmonyOS Linux Layer daemon启动</li><li><strong>OzoneC运行</strong>：创建openEuler容器</li><li><strong>用户环境</strong>：提供Shell和开发工具</li></ol><h3 id="Linux兼容层（HSLd）"><a href="#Linux兼容层（HSLd）" class="headerlink" title="Linux兼容层（HSLd）"></a>Linux兼容层（HSLd）</h3><p><code>init=/usr/sbin/HSLd</code>参数表明使用了HarmonyOS Linux Layer daemon：</p><ul><li>负责Linux系统服务的初始化</li><li>提供鸿蒙与Linux的交互接口</li><li>管理Linux应用的生命周期</li></ul><h3 id="容器环境"><a href="#容器环境" class="headerlink" title="容器环境"></a>容器环境</h3><p>openEuler容器提供：</p><ul><li>完整的Linux用户空间</li><li>RPM包管理（dnf/yum）</li><li>开发工具链（gcc、make等）</li><li>运行时环境（Python、Node.js等）</li></ul><h2 id="技术优势"><a href="#技术优势" class="headerlink" title="技术优势"></a>技术优势</h2><h3 id="1-安全隔离"><a href="#1-安全隔离" class="headerlink" title="1. 安全隔离"></a>1. 安全隔离</h3><ul><li>虚拟机隔离防止Linux应用影响鸿蒙系统</li><li>容器隔离防止不同Linux应用相互影响</li><li>多层防御，安全可靠</li></ul><h3 id="2-性能优化"><a href="#2-性能优化" class="headerlink" title="2. 性能优化"></a>2. 性能优化</h3><ul><li>StratoVirt使用Rust实现，内存安全且高效</li><li>virtio设备提供高性能I/O</li><li>overlay文件系统减少存储开销</li></ul><h3 id="3-灵活部署"><a href="#3-灵活部署" class="headerlink" title="3. 灵活部署"></a>3. 灵活部署</h3><ul><li>支持不同Linux发行版容器</li><li>可以定制开发环境</li><li>快速部署和销毁</li></ul><h2 id="实际应用"><a href="#实际应用" class="headerlink" title="实际应用"></a>实际应用</h2><h3 id="开发环境"><a href="#开发环境" class="headerlink" title="开发环境"></a>开发环境</h3><p>在融合开发引擎中，开发者可以：</p><ul><li>使用完整的Linux开发工具链</li><li>运行服务器软件（nginx、redis等）</li><li>编译Linux应用程序</li><li>使用容器技术部署应用</li></ul><h3 id="使用限制"><a href="#使用限制" class="headerlink" title="使用限制"></a>使用限制</h3><p>由于容器共享宿主机内核：</p><ul><li><strong>无法更换内核版本</strong>：虚拟机内核固定</li><li><strong>glibc版本受限</strong>：容器使用虚拟机的glibc</li><li><strong>内核模块不可加载</strong>：无内核权限</li></ul><h3 id="解决方案"><a href="#解决方案" class="headerlink" title="解决方案"></a>解决方案</h3><p>对于glibc版本问题，可以：</p><ol><li><strong>从源码编译</strong>：使用当前glibc编译应用</li><li><strong>使用静态链接</strong>：避免依赖系统库</li><li><strong>使用隔离环境</strong>：conda、nix等提供独立环境</li></ol><h2 id="与传统方案的对比"><a href="#与传统方案的对比" class="headerlink" title="与传统方案的对比"></a>与传统方案的对比</h2><h3 id="对比WSL"><a href="#对比WSL" class="headerlink" title="对比WSL"></a>对比WSL</h3><table><thead><tr><th>特性</th><th>鸿蒙融合开发引擎</th><th>WSL2</th></tr></thead><tbody><tr><td>架构</td><td>虚拟机+容器</td><td>虻拟机</td></tr><tr><td>内核</td><td>Linux 6.6</td><td>Linux 5.x</td></tr><tr><td>容器支持</td><td>OzoneC</td><td>Docker</td></tr><tr><td>镜像管理</td><td>鸿蒙生态</td><td>Docker生态</td></tr><tr><td>安全隔离</td><td>双层隔离</td><td>单层隔离</td></tr></tbody></table><h3 id="对比传统虚拟机"><a href="#对比传统虚拟机" class="headerlink" title="对比传统虚拟机"></a>对比传统虚拟机</h3><table><thead><tr><th>特性</th><th>StratoVirt</th><th>QEMU/KVM</th></tr></thead><tbody><tr><td>实现语言</td><td>Rust</td><td>C</td></tr><tr><td>内存安全</td><td>语言级</td><td>需要编码规范</td></tr><tr><td>启动速度</td><td>快速</td><td>传统</td></tr><tr><td>容器集成</td><td>OzoneC</td><td>需额外配置</td></tr></tbody></table><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>鸿蒙PC融合开发引擎通过StratoVirt虚拟化和OzoneC容器技术，巧妙地实现了Linux应用兼容：</p><ol><li><strong>微内核架构</strong>：鸿蒙保持自身特性</li><li><strong>虚拟化隔离</strong>：StratoVirt运行Linux</li><li><strong>容器管理</strong>：OzoneC提供应用环境</li><li><strong>双层隔离</strong>：安全性和性能兼顾</li></ol><p>这种架构设计体现了鸿蒙生态的创新思路，既保持了鸿蒙的微内核优势，又通过虚拟化和容器技术实现了Linux兼容，为开发者提供了熟悉的工作环境。</p><hr><p><strong>参考资料</strong>：</p><ul><li>StratoVirt项目：<a href="https://gitcode.com/openeuler/stratovirt" target="_blank" rel="noopener">https://gitcode.com/openeuler/stratovirt</a></li><li>OzoneC源码：StratoVirt项目的<code>ozonec/</code>目录</li><li>openEuler官网：<a href="https://openeuler.org" target="_blank" rel="noopener">https://openeuler.org</a></li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;鸿蒙PC融合开发引擎架构解析：虚拟机与容器双模式&quot;&gt;&lt;a href=&quot;#鸿蒙PC融合开发引擎架构解析：虚拟机与容器双模式&quot; class=&quot;headerlink&quot; title=&quot;鸿蒙PC融合开发引擎架构解析：虚拟机与容器双模式&quot;&gt;&lt;/a&gt;鸿蒙PC融合开发引擎架构解析
      
    
    </summary>
    
      <category term="软件" scheme="http://ystyle.top/categories/%E8%BD%AF%E4%BB%B6/"/>
    
    
      <category term="鸿蒙" scheme="http://ystyle.top/tags/%E9%B8%BF%E8%92%99/"/>
    
      <category term="鸿蒙PC" scheme="http://ystyle.top/tags/%E9%B8%BF%E8%92%99PC/"/>
    
      <category term="Matebook Pro" scheme="http://ystyle.top/tags/Matebook-Pro/"/>
    
      <category term="StratoVirt" scheme="http://ystyle.top/tags/StratoVirt/"/>
    
      <category term="OzoneC" scheme="http://ystyle.top/tags/OzoneC/"/>
    
      <category term="融合开发引擎" scheme="http://ystyle.top/tags/%E8%9E%8D%E5%90%88%E5%BC%80%E5%8F%91%E5%BC%95%E6%93%8E/"/>
    
  </entry>
  
  <entry>
    <title>MCP-Term：一个未出生即夭折的想法</title>
    <link href="http://ystyle.top/2026/03/19/mcp-term-abandoned/"/>
    <id>http://ystyle.top/2026/03/19/mcp-term-abandoned/</id>
    <published>2026-03-19T12:00:00.000Z</published>
    <updated>2026-03-19T12:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p><strong>⚠️ 已弃坑</strong></p><p>此项目在讨论阶段即放弃，无任何代码实现。<br>放弃原因：市场风向转变，目标场景已被钉钉、Obsidian CLI, anything CLI 等原生工具覆盖。<br>记录此文仅为保存思考过程。</p></blockquote><hr><h2 id="起因：MCP-协议的-Token-困境"><a href="#起因：MCP-协议的-Token-困境" class="headerlink" title="起因：MCP 协议的 Token 困境"></a>起因：MCP 协议的 Token 困境</h2><p>一切始于一个问题：<strong>MCP 和 Function Call 有什么区别？</strong></p><p>讨论后得出结论：</p><ul><li>Function Call 是模型的底层能力</li><li>MCP 是应用层协议，解决生态碎片化</li><li>但 MCP 的 JSON Schema 在 LLM 上下文中<strong>极度费 tokens</strong></li></ul><p>一个复杂工具的 JSON Schema 定义可能消耗 500-1000 tokens，而模型能理解更紧凑的格式——比如 TypeScript 的 <code>.d.ts</code>。</p><h2 id="核心想法：用-S-Expr-替代-JSON"><a href="#核心想法：用-S-Expr-替代-JSON" class="headerlink" title="核心想法：用 S-Expr 替代 JSON"></a>核心想法：用 S-Expr 替代 JSON</h2><h3 id="方案演进"><a href="#方案演进" class="headerlink" title="方案演进"></a>方案演进</h3><p><strong>最初设想</strong>：修改 MCP 协议</p><ul><li>Schema 用 <code>.d.ts</code> 定义（省 50% tokens）</li><li>传输用 CBOR（省带宽）</li></ul><p><strong>第一次收缩</strong>：不改协议，做转换层</p><ul><li>客户端转换：JSON Schema → S-Expr → LLM</li><li>调用时：LLM 生成 S-Expr → 转回 JSON-RPC</li><li>兼容现有 MCP Server，零改动</li></ul><p><strong>最终定位</strong>：CLI 工具</p><ul><li>不是协议扩展，而是命令行包装器</li><li>解决复杂嵌套参数在 CLI 中的表示问题</li></ul><h3 id="MCP-Term-协议设计"><a href="#MCP-Term-协议设计" class="headerlink" title="MCP-Term 协议设计"></a>MCP-Term 协议设计</h3><p>设计了名为 <strong>MCP-Term</strong>（原名 MCP-Symbol）的 S-Expr 格式。</p><h4 id="基础语法"><a href="#基础语法" class="headerlink" title="基础语法"></a>基础语法</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">; 原子类型</span><br><span class="line">number     := [0-9]+(\.[0-9]+)?          ; 整数或浮点</span><br><span class="line">string     := &quot;([^&quot;\\]|\\.)*&quot;            ; 双引号字符串</span><br><span class="line">symbol     := [a-zA-Z_][a-zA-Z0-9_]*     ; 标识符</span><br><span class="line">keyword    := :[a-zA-Z_][a-zA-Z0-9_]*    ; 冒号前缀，如 :utf8</span><br><span class="line">list       := &apos;(&apos; expr* &apos;)&apos;              ; S-表达式列表</span><br></pre></td></tr></table></figure><h4 id="工具声明"><a href="#工具声明" class="headerlink" title="工具声明"></a>工具声明</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">(declare</span><br><span class="line">  (symbol long-name params return-type doc-string?)</span><br><span class="line">  ...</span><br><span class="line">)</span><br><span class="line"></span><br><span class="line">; symbol      : 短码，1-4 字符，调用时用</span><br><span class="line">; long-name   : 人类可读全称</span><br><span class="line">; params      : (param-name type default? option*)*</span><br><span class="line">; return-type : 返回类型</span><br><span class="line">; doc-string  : 可选描述</span><br></pre></td></tr></table></figure><p>示例：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">(declare</span><br><span class="line">  ;; 文件操作</span><br><span class="line">  (fr file_read </span><br><span class="line">    (path string) </span><br><span class="line">    (opt (enc (or :utf8 :base64) :utf8)</span><br><span class="line">         (off (opt number) nil)</span><br><span class="line">         (lim (opt number) nil))</span><br><span class="line">    string</span><br><span class="line">    &quot;Read file content&quot;)</span><br><span class="line">  </span><br><span class="line">  ;; 笔记操作</span><br><span class="line">  (nu note_update</span><br><span class="line">    (doc string)</span><br><span class="line">    (ops (list Op))</span><br><span class="line">    (tuple (ver number) (blocks (list Block)))</span><br><span class="line">    &quot;Update document with operations&quot;)</span><br><span class="line">)</span><br></pre></td></tr></table></figure><h4 id="类型系统"><a href="#类型系统" class="headerlink" title="类型系统"></a>类型系统</h4><p><strong>基础类型</strong>：<code>string</code> <code>number</code> <code>bool</code> <code>bytes</code> <code>any</code></p><p><strong>复合类型</strong>：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">(list type)           ; 同质列表 =&gt; string</span><br><span class="line">(map key-type val-type)  ; 映射 =&gt; int</span><br><span class="line">(tuple type*)         ; 异构元组 =&gt; int)  ; 联合类型 =&gt; :utf8 :base64)  ; 可选，等价 =&gt; nil</span><br></pre></td></tr></table></figure><p><strong>自定义类型</strong>：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">(deftype Op</span><br><span class="line">  (i insert (pos number) (blocks (list Block)))</span><br><span class="line">  (d delete (pos number) (len number))</span><br><span class="line">  (r retain (pos number)))</span><br><span class="line"></span><br><span class="line">(deftype Block</span><br><span class="line">  (p paragraph (id string) (props (map keyword any)) (content (list Inline)))</span><br><span class="line">  (h heading (level (or 1 2 3 4 5 6)) (content (list Inline)))</span><br><span class="line">  (c code (lang (opt string)) (content string))</span><br><span class="line">  (i image (src string) (alt string) (props (map keyword any))))</span><br></pre></td></tr></table></figure><h4 id="调用格式"><a href="#调用格式" class="headerlink" title="调用格式"></a>调用格式</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">; 简单调用</span><br><span class="line">(fr &quot;/etc/hosts&quot; :utf8)</span><br><span class="line"></span><br><span class="line">; 嵌套调用（笔记编辑）</span><br><span class="line">(nu &quot;doc.md&quot;</span><br><span class="line">  (i 0 ((p &quot;intro&quot; () (&quot;Hello world&quot;))))</span><br><span class="line">  (d 20 5))</span><br><span class="line"></span><br><span class="line">; 批量调用</span><br><span class="line">(batch</span><br><span class="line">  (1 (fr &quot;/etc/passwd&quot;))</span><br><span class="line">  (2 (fr &quot;/etc/hosts&quot;))</span><br><span class="line">  (3 (ex &quot;whoami&quot;)))</span><br></pre></td></tr></table></figure><h4 id="返回格式"><a href="#返回格式" class="headerlink" title="返回格式"></a>返回格式</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">; 成功</span><br><span class="line">(ok &quot;file content here&quot;)</span><br><span class="line">(ok (out &quot;root&quot; code 0))</span><br><span class="line"></span><br><span class="line">; 错误</span><br><span class="line">(err 404 &quot;file not found&quot;)</span><br><span class="line">(err 1 &quot;command failed&quot; (stderr &quot;permission denied&quot;))</span><br></pre></td></tr></table></figure><h4 id="JSON-Schema-映射"><a href="#JSON-Schema-映射" class="headerlink" title="JSON Schema 映射"></a>JSON Schema 映射</h4><table><thead><tr><th>JSON Schema</th><th>MCP-Term</th></tr></thead><tbody><tr><td><code>{&quot;type&quot;: &quot;string&quot;}</code></td><td><code>string</code></td></tr><tr><td><code>{&quot;type&quot;: &quot;number&quot;}</code></td><td><code>number</code></td></tr><tr><td><code>{&quot;type&quot;: &quot;boolean&quot;}</code></td><td><code>bool</code></td></tr><tr><td><code>{&quot;type&quot;: &quot;array&quot;}</code></td><td><code>(list any)</code></td></tr><tr><td><code>{&quot;type&quot;: &quot;object&quot;}</code></td><td><code>(map keyword any)</code></td></tr><tr><td><code>{&quot;enum&quot;: [&quot;a&quot;,&quot;b&quot;]}</code></td><td><code>(or :a :b)</code></td></tr><tr><td><code>{&quot;type&quot;: [&quot;string&quot;,&quot;null&quot;]}</code></td><td><code>(opt string)</code></td></tr><tr><td><code>{&quot;properties&quot;: {...}}</code></td><td><code>map</code> 或 <code>tuple</code></td></tr></tbody></table><h4 id="复杂示例：企业数据查询"><a href="#复杂示例：企业数据查询" class="headerlink" title="复杂示例：企业数据查询"></a>复杂示例：企业数据查询</h4><p>JSON Schema（约 3500 字符，1000+ tokens）：</p><figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  <span class="attr">"name"</span>: <span class="string">"data_platform_query"</span>,</span><br><span class="line">  <span class="attr">"inputSchema"</span>: &#123;</span><br><span class="line">    <span class="attr">"type"</span>: <span class="string">"object"</span>,</span><br><span class="line">    <span class="attr">"properties"</span>: &#123;</span><br><span class="line">      <span class="attr">"sources"</span>: &#123;</span><br><span class="line">        <span class="attr">"type"</span>: <span class="string">"array"</span>,</span><br><span class="line">        <span class="attr">"items"</span>: &#123;</span><br><span class="line">          <span class="attr">"oneOf"</span>: [</span><br><span class="line">            &#123;"type": "object", "properties": &#123;"type": &#123;"const": "sql"&#125;, ...&#125;&#125;,</span><br><span class="line">            &#123;"type": "object", "properties": &#123;"type": &#123;"const": "mongodb"&#125;, ...&#125;&#125;,</span><br><span class="line">            &#123;"type": "object", "properties": &#123;"type": &#123;"const": "api"&#125;, ...&#125;&#125;</span><br><span class="line">          ]</span><br><span class="line">        &#125;</span><br><span class="line">      &#125;,</span><br><span class="line">      "joins": &#123;...&#125;,</span><br><span class="line">      "transformations": &#123;...&#125;,</span><br><span class="line">      "output": &#123;...&#125;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>MCP-Term（约 600 字符，170 tokens）：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">(dp data_platform_query</span><br><span class="line">  (qid string)</span><br><span class="line">  (srcs (list Source 1 10))</span><br><span class="line">  (joins (opt (list Join)))</span><br><span class="line">  (trans (opt (list Xform)))</span><br><span class="line">  (out Output)</span><br><span class="line">  -&gt; QueryResult)</span><br><span class="line"></span><br><span class="line">(deftype Source (or SQL Mongo API))</span><br><span class="line">(deftype SQL (sql (driver :pg|:my|:ch) (host string) (db string) (q (sql string))))</span><br><span class="line">(deftype Join (join (left string) (right string) (type :inner|:left|:right) (on (list Cond))))</span><br><span class="line">(deftype Xform (or (filter (cond string)) (agg (group (list string)) (aggs map))))</span><br></pre></td></tr></table></figure><p><strong>Token 节省对比</strong>：</p><table><thead><tr><th>场景</th><th>JSON Schema</th><th>MCP-Term</th><th>节省</th></tr></thead><tbody><tr><td>简单工具（3参数）</td><td>180</td><td>60</td><td>67%</td></tr><tr><td>复杂工具（10参数）</td><td>600</td><td>150</td><td>75%</td></tr><tr><td>超复杂（嵌套查询）</td><td>3500</td><td>600</td><td>83%</td></tr><tr><td>实际调用（嵌套操作）</td><td>200</td><td>50</td><td>75%</td></tr></tbody></table><h2 id="市场验证：风向已变"><a href="#市场验证：风向已变" class="headerlink" title="市场验证：风向已变"></a>市场验证：风向已变</h2><h3 id="现有方案调研"><a href="#现有方案调研" class="headerlink" title="现有方案调研"></a>现有方案调研</h3><p>调研了几个 MCP-CLI 项目：</p><ol><li><strong>mcp-cli</strong>：直接传 JSON 字符串，绕开参数问题</li><li><strong>FastMCP</strong>：简单 key=value 参数</li><li><strong>cyclopts</strong>：自动生成 <code>--flag</code>，嵌套时参数爆炸</li></ol><p><strong>关键发现</strong>：都没解决深层嵌套，但用户似乎不在意——因为有更简单的方案。</p><h3 id="场景消失"><a href="#场景消失" class="headerlink" title="场景消失"></a>场景消失</h3><p>原计划的目标场景：</p><p><strong>场景1：CLI 工具嵌套参数</strong></p><ul><li>但市场风向已变：钉钉 CLI、Obsidian CLI、香港大学的 anything CLI 等纷纷涌现</li><li><strong>CLI + Skills</strong> 模式成为大趋势：用户通过 skills 模板封装复杂操作，而非手写嵌套参数</li><li>管道 + base64 等简单方案已覆盖大部分场景</li><li>结论：无需 S-Expr，市场已给出更简单的答案</li></ul><p><strong>场景2：数据复杂查询</strong></p><ul><li>现有方案：BI 工具（可视化）、JSON 配置</li><li>结论：市场 niche，且竞品成熟</li></ul><p><strong>市场变化</strong>：</p><ul><li>原生 CLI 工具链成熟，各家都在做自己的 CLI</li><li>Skills 模板封装成为主流，复杂操作被预定义</li><li>大模型直接操作文件/API，中间层价值稀释</li></ul><h2 id="放弃决策"><a href="#放弃决策" class="headerlink" title="放弃决策"></a>放弃决策</h2><h3 id="直接原因"><a href="#直接原因" class="headerlink" title="直接原因"></a>直接原因</h3><ol><li><strong>场景消失</strong>：复杂嵌套参数需求被简化方案覆盖</li><li><strong>竞争出现</strong>：原生 CLI 生态成熟，无差异化空间</li><li><strong>时间成本</strong>：继续验证已无意义，市场已给出答案</li></ol><h3 id="根本原因"><a href="#根本原因" class="headerlink" title="根本原因"></a>根本原因</h3><ul><li>从”协议扩展”退到”CLI 工具”时，价值已打折</li><li>CLI 层无技术壁垒，易被复制/绕过</li><li>大模型进化快，中间层易被端到端替代</li></ul><h2 id="收获"><a href="#收获" class="headerlink" title="收获"></a>收获</h2><p>虽无代码产出，但获得：</p><ol><li><strong>快速验证方法论</strong>：市场调研 → 场景分析 → 放弃决策</li><li><strong>止损判断标准</strong>：当目标场景被简化方案覆盖时，放弃</li><li><strong>MCP 生态理解</strong>：协议设计、现有工具链格局</li></ol><h2 id="未来信号"><a href="#未来信号" class="headerlink" title="未来信号"></a>未来信号</h2><p>若出现以下情况，可重新评估：</p><ol><li>新协议需要紧凑嵌套表示</li><li>LLM 上下文窗口瓶颈重现（&lt;4K）</li><li>特定领域出现复杂结构 CLI 痛点</li></ol><p><strong>当前：无。</strong></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ 已弃坑&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;此项目在讨论阶段即放弃，无任何代码实现。&lt;br&gt;放弃原因：市场风向转变，目标场景已被钉钉、Obsidian CLI, anything CLI 等原生工具覆盖。&lt;br&gt;记录此文仅为保存思
      
    
    </summary>
    
      <category term="思考" scheme="http://ystyle.top/categories/%E6%80%9D%E8%80%83/"/>
    
    
      <category term="MCP" scheme="http://ystyle.top/tags/MCP/"/>
    
      <category term="AI" scheme="http://ystyle.top/tags/AI/"/>
    
      <category term="Protocol" scheme="http://ystyle.top/tags/Protocol/"/>
    
      <category term="Abandoned" scheme="http://ystyle.top/tags/Abandoned/"/>
    
  </entry>
  
  <entry>
    <title>鸿蒙PC Matebook Pro上全局安装GIT</title>
    <link href="http://ystyle.top/2025/12/28/matebookpro-install-git/"/>
    <id>http://ystyle.top/2025/12/28/matebookpro-install-git/</id>
    <published>2025-12-28T02:30:00.000Z</published>
    <updated>2025-12-28T02:30:00.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h2><ul><li>在鸿蒙应用商店安装 CodeArts IDE</li></ul><h2 id="从CodeArts-IDE提取签名工具"><a href="#从CodeArts-IDE提取签名工具" class="headerlink" title="从CodeArts IDE提取签名工具"></a>从CodeArts IDE提取签名工具</h2><p>打开IDE, 随便创建一个项目打开，在终端执行以下命令<br><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 复制签名工具</span></span><br><span class="line">cp /data/app/toolchains.org/toolchains_1.0/lib//binary-sign-tool .</span><br><span class="line"><span class="meta">#</span><span class="bash"> 对签名工具签名</span></span><br><span class="line">binary-sign-tool sign -inFile "./binary-sign-tool" -outFile "./binary-sign-tool-signed" -selfSign 1</span><br><span class="line"><span class="meta">#</span><span class="bash"> 添加可执行权限</span></span><br><span class="line">chmod +x binary-sign-tool-signed</span><br><span class="line"><span class="meta">#</span><span class="bash"> 测试，如果没弹授权弹窗和帮忙输出，需要重新签名和添加可执行权限</span></span><br><span class="line">./binary-sign-tool-signed</span><br><span class="line"></span><br><span class="line"><span class="meta">#</span><span class="bash"> 复制到用户安装目录</span></span><br><span class="line">mkdir -p ~/.local/bin</span><br><span class="line">cp ./binary-sign-tool-signed ~/.local/bin/binary-sign-tool</span><br></pre></td></tr></table></figure></p><p>最后在<code>~/.zshrc</code>添加<code>export PATH=$HOME/.local/bin:$PATH</code></p><h2 id="保存签名脚本"><a href="#保存签名脚本" class="headerlink" title="保存签名脚本"></a>保存签名脚本</h2><p>把以下保存为<code>~/.local/bin/hm-sign-all.sh</code>， 并执行<code>chmod +x ~/.local/bin/hm-sign-all.sh</code><br><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash">!/bin/sh</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#</span><span class="bash"> 递归查询当前目录及其子目录下的所有文件</span></span><br><span class="line">find . -type f | while read -r file; do</span><br><span class="line">    # 使用 file 命令检查文件类型</span><br><span class="line">    if file "$file" | grep "shared object"; then</span><br><span class="line">        echo "Found executable or shared object: $file"</span><br><span class="line">        </span><br><span class="line">        # 确保文件具有可执行权限</span><br><span class="line">        chmod +x "$file"</span><br><span class="line">        </span><br><span class="line">        # 签名文件</span><br><span class="line">        echo "Signing file: $file"</span><br><span class="line">        binary-sign-tool sign -inFile "$file" -outFile "$file" -selfSign 1</span><br><span class="line">    fi</span><br><span class="line">done</span><br></pre></td></tr></table></figure></p><h2 id="从CodeArts-IDE提取git"><a href="#从CodeArts-IDE提取git" class="headerlink" title="从CodeArts IDE提取git"></a>从CodeArts IDE提取git</h2><p>打开IDE, 随便创建一个项目打开，在终端执行以下命令<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"># 创建安装目录</span><br><span class="line">mkdir -p ~/.local/opt</span><br><span class="line"></span><br><span class="line"># 切换到安装目录， 并复制git</span><br><span class="line">cd ~/.local/opt</span><br><span class="line">cp -r /data/app/git.org/git_1.2/ . </span><br><span class="line"></span><br><span class="line"># 对git可执行文件签名</span><br><span class="line">hm-sign-all.sh</span><br><span class="line"></span><br><span class="line"># 创建bin的软件链接</span><br><span class="line">ln -s $HOME/.local/opt/git_1.2/bin/git $HOME/.local/bin/ </span><br><span class="line">ln -s $HOME/Users/currentUser/.local/opt/git_1.2/bin/git-lfs $HOME/.local/bin/</span><br></pre></td></tr></table></figure></p><h2 id="配置git环境"><a href="#配置git环境" class="headerlink" title="配置git环境"></a>配置git环境</h2><p>在<code>~/.zshrc</code>添加以下内容<br><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> git</span></span><br><span class="line">export GIT_EXEC_PATH=$HOME/.local/opt/git_1.2/libexec/git-core</span><br><span class="line">export GIT_TEMPLATE_DIR=$HOME/.local/opt/git_1.2/share/git-core/templates</span><br></pre></td></tr></table></figure></p><h2 id="测试"><a href="#测试" class="headerlink" title="测试"></a>测试</h2><p>可以看到，可以正常clone仓库<br><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line">➜ cd Documents/DevEcoStudioProjects ✓</span><br><span class="line">YSTYLE ❯ [10:35] ❯ ~/Documents/DevEcoStudioProjects</span><br><span class="line">➜ git clone https://github.com/ystyle/paimon.git✓</span><br><span class="line">Cloning into 'paimon'...</span><br><span class="line">remote: Enumerating objects: 99, done.</span><br><span class="line">remote: Counting objects: 100% (99/99), done.</span><br><span class="line">remote: Compressing objects: 100% (68/68), done.</span><br><span class="line">remote: Total 99 (delta 19), reused 94 (delta 16), pack-reused 0 (from 0)</span><br><span class="line">Receiving objects: 100% (99/99), 2.59 MiB | 3.19 MiB/s, done.</span><br><span class="line">Resolving deltas: 100% (19/19), done.</span><br><span class="line">YSTYLE ❯ [10:36] ❯ ~/Documents/DevEcoStudioProjects</span><br><span class="line">➜ cd paimon ✓</span><br><span class="line">YSTYLE ❯ [10:47] ❯ ~/Documents/DevEcoStudioProjects/paimon</span><br><span class="line">➜ git status✓</span><br><span class="line">fatal: detected dubious ownership in repository at '/storage/Users/currentUser/Documents/DevEcoStudioProjects/paimon'</span><br><span class="line">To add an exception for this directory, call:</span><br><span class="line"></span><br><span class="line">git config --global --add safe.directory /storage/Users/currentUser/Documents/DevEcoStudioProjects/paimon</span><br><span class="line">YSTYLE ❯ [10:47] ❯ ~/Documents/DevEcoStudioProjects/paimon</span><br><span class="line">➜ git config --global --add safe.directory /storage/Users/currentUser/Documents/DevEcoStudioProjects/paimon✗ 128</span><br><span class="line">YSTYLE ❯ [10:47] ❯ ~/Documents/DevEcoStudioProjects/paimon</span><br><span class="line">➜ git status✓</span><br><span class="line">On branch master</span><br><span class="line">Your branch is up to date with 'origin/master'.</span><br><span class="line"></span><br><span class="line">nothing to commit, working tree clean</span><br><span class="line">YSTYLE ❯ [10:47] ❯ ~/Documents/DevEcoStudioProjects/paimon</span><br><span class="line">➜ git log  ✓</span><br><span class="line">error: cannot run less: No such file or directory</span><br><span class="line">commit a0dffbac91fab1d1da50709d9e4b34f5a1ef0771 (HEAD -&gt; master, tag: 2025-10-20, origin/master, origin/HEAD)</span><br><span class="line">Author: ystyle &lt;lxy5266@live.com&gt;</span><br><span class="line">Date:   Mon Oct 20 14:06:30 2025 +0800</span><br><span class="line"></span><br><span class="line">    feat: 优化代码</span><br></pre></td></tr></table></figure></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;准备工作&quot;&gt;&lt;a href=&quot;#准备工作&quot; class=&quot;headerlink&quot; title=&quot;准备工作&quot;&gt;&lt;/a&gt;准备工作&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;在鸿蒙应用商店安装 CodeArts IDE&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;从CodeArts-IDE提
      
    
    </summary>
    
      <category term="软件" scheme="http://ystyle.top/categories/%E8%BD%AF%E4%BB%B6/"/>
    
    
      <category term="git" scheme="http://ystyle.top/tags/git/"/>
    
      <category term="鸿蒙" scheme="http://ystyle.top/tags/%E9%B8%BF%E8%92%99/"/>
    
      <category term="鸿蒙PC" scheme="http://ystyle.top/tags/%E9%B8%BF%E8%92%99PC/"/>
    
      <category term="matebook pro" scheme="http://ystyle.top/tags/matebook-pro/"/>
    
  </entry>
  
  <entry>
    <title>Neovim移植鸿蒙PC：三方库适配实战与挑战解析</title>
    <link href="http://ystyle.top/2025/12/27/matebookpro-port-nvim-deps/"/>
    <id>http://ystyle.top/2025/12/27/matebookpro-port-nvim-deps/</id>
    <published>2025-12-27T11:00:00.000Z</published>
    <updated>2025-12-27T11:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Neovim移植鸿蒙PC：三方库适配实战与挑战解析"><a href="#Neovim移植鸿蒙PC：三方库适配实战与挑战解析" class="headerlink" title="Neovim移植鸿蒙PC：三方库适配实战与挑战解析"></a>Neovim移植鸿蒙PC：三方库适配实战与挑战解析</h1><blockquote><p>本文记录将Neovim编辑器移植到HarmonyOS PC过程中，对11个核心依赖库的适配实战经验，涵盖平台差异分析、API限制处理、构建系统改造等关键问题。</p></blockquote><h2 id="项目背景"><a href="#项目背景" class="headerlink" title="项目背景"></a>项目背景</h2><p><strong>目标</strong>：将现代文本编辑器Neovim完整移植到HarmonyOS PC系统，支持完整的Lua插件生态和现代语法高亮。</p><p><strong>环境</strong>：</p><ul><li>操作系统：HarmonyOS 6.0</li><li>架构：aarch64 (ARM64)</li><li>编译器：BiSheng Clang 15.0.4 (OHOS工具链)</li><li>构建系统：CMake 3.28.2 + Ninja</li></ul><p><strong>挑战</strong>：Neovim依赖11个核心三方库，每个库都需要针对HarmonyOS进行适配，涉及平台检测、API限制、内存权限、文件系统等多个维度。</p><h2 id="一、依赖库适配全景"><a href="#一、依赖库适配全景" class="headerlink" title="一、依赖库适配全景"></a>一、依赖库适配全景</h2><h3 id="1-1-适配状态总览"><a href="#1-1-适配状态总览" class="headerlink" title="1.1 适配状态总览"></a>1.1 适配状态总览</h3><table><thead><tr><th>依赖库</th><th>版本</th><th>适配状态</th><th>主要挑战</th><th>解决方案</th></tr></thead><tbody><tr><td><strong>libuv</strong></td><td>1.51.0</td><td>✅ 完全适配</td><td>TTY权限、CPU亲和性、io_uring</td><td>条件编译+鸿蒙平台文件</td></tr><tr><td><strong>LuaJIT</strong></td><td>2.1</td><td>✅ 完全适配</td><td>JIT内存权限、系统分配器</td><td>禁用JIT+系统分配器</td></tr><tr><td><strong>Lua</strong></td><td>5.1.5</td><td>✅ 完全适配</td><td>工具链适配</td><td>Makefile平台扩展</td></tr><tr><td><strong>tree-sitter</strong></td><td>核心库</td><td>✅ 无需修改</td><td>无</td><td>直接构建</td></tr><tr><td><strong>luv</strong></td><td>1.51.0-1</td><td>✅ 完全适配</td><td>头文件路径冲突</td><td>路径修复+编译标志</td></tr><tr><td><strong>lpeg</strong></td><td>1.1.0</td><td>✅ 完全适配</td><td>Makefile工具链</td><td>完整Makefile重写</td></tr><tr><td><strong>libiconv</strong></td><td>1.17</td><td>✅ 完全适配</td><td>平台检测缺失</td><td>config.guess扩展</td></tr><tr><td><strong>unibilium</strong></td><td>v2.1.2</td><td>✅ 无需修改</td><td>无</td><td>直接构建</td></tr><tr><td><strong>utf8proc</strong></td><td>v2.11.2</td><td>✅ 无需修改</td><td>无</td><td>直接构建</td></tr><tr><td><strong>lua-compat-5.3</strong></td><td>v0.13</td><td>✅ 完全适配</td><td>缺少构建系统</td><td>CMakeLists.txt创建</td></tr><tr><td><strong>tree-sitter解析器</strong></td><td>7个</td><td>✅ 完全适配</td><td>无</td><td>直接构建</td></tr></tbody></table><p><strong>构建成功率</strong>：100% (11/11个依赖成功构建)</p><h2 id="二、关键技术挑战与解决方案"><a href="#二、关键技术挑战与解决方案" class="headerlink" title="二、关键技术挑战与解决方案"></a>二、关键技术挑战与解决方案</h2><h3 id="2-1-libuv：异步I-O库的鸿蒙适配"><a href="#2-1-libuv：异步I-O库的鸿蒙适配" class="headerlink" title="2.1 libuv：异步I/O库的鸿蒙适配"></a>2.1 libuv：异步I/O库的鸿蒙适配</h3><h4 id="挑战分析"><a href="#挑战分析" class="headerlink" title="挑战分析"></a>挑战分析</h4><p>libuv是Neovim异步事件处理的核心，但在HarmonyOS上遇到多个问题：</p><ol><li><strong>TTY权限问题</strong>：<code>uv_tty_init</code>在非终端环境返回<code>UV_EACCES</code></li><li><strong>CPU亲和性API缺失</strong>：HarmonyOS缺少<code>pthread_setaffinity_np</code>等API</li><li><strong>mmsghdr结构体差异</strong>：系统头文件定义不完整</li><li><strong>io_uring支持</strong>：可能不兼容</li></ol><h4 id="解决方案"><a href="#解决方案" class="headerlink" title="解决方案"></a>解决方案</h4><p><strong>平台检测与条件编译</strong>：<br><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 在CMakeLists.txt中添加鸿蒙平台定义</span></span><br><span class="line">add_definitions(-D__OHOS__=<span class="number">1</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment">// 关键API的条件编译包装</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">if</span> !defined(__OHOS__)</span></span><br><span class="line"><span class="comment">// Linux特有功能（CPU亲和性、mmsghdr等）</span></span><br><span class="line">uv_cpumask_size();</span><br><span class="line">uv_available_parallelism();</span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br></pre></td></tr></table></figure></p><p><strong>创建鸿蒙平台文件</strong>：<br>基于<code>linux.c</code>创建<code>harmonyos.c</code>，包含：</p><ul><li>完整的<code>uv__platform_loop_init</code>实现</li><li>epoll事件循环支持</li><li>缺失函数的桩实现</li></ul><p><strong>TTY功能验证</strong>：<br>在真实终端环境中测试，发现<code>isatty()</code>在HarmonyOS上正常工作，所有TTY函数（<code>uv_tty_init</code>、<code>uv_tty_set_mode</code>等）均正常。</p><h4 id="验证结果"><a href="#验证结果" class="headerlink" title="验证结果"></a>验证结果</h4><p>经过全面测试，Neovim所需的所有libuv功能在HarmonyOS上正常工作：</p><ul><li>✅ 事件循环和定时器</li><li>✅ 文件系统操作</li><li>✅ TTY/终端功能（neovim TUI核心）</li><li>✅ 进程管理</li><li>✅ 系统信息获取</li></ul><h3 id="2-2-LuaJIT：JIT编译器的安全限制"><a href="#2-2-LuaJIT：JIT编译器的安全限制" class="headerlink" title="2.2 LuaJIT：JIT编译器的安全限制"></a>2.2 LuaJIT：JIT编译器的安全限制</h3><h4 id="挑战分析-1"><a href="#挑战分析-1" class="headerlink" title="挑战分析"></a>挑战分析</h4><p>LuaJIT在HarmonyOS上遇到<strong>W^X（Write XOR Execute）安全策略</strong>限制：</p><ol><li><strong><code>mmap(PROT_EXEC)</code>失败</strong>：无法分配可执行内存</li><li><strong><code>mprotect(RW → RX)</code>失败</strong>：无法设置内存执行权限</li><li><strong>JIT编译器完全不可用</strong></li></ol><h4 id="解决方案-1"><a href="#解决方案-1" class="headerlink" title="解决方案"></a>解决方案</h4><p><strong>禁用JIT功能</strong>：<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 编译选项</span></span><br><span class="line">-DLUAJIT_DISABLE_JIT      <span class="comment"># 完全禁用JIT编译器</span></span><br><span class="line">-DLUAJIT_USE_SYSMALLOC    <span class="comment"># 使用系统内存分配器</span></span><br><span class="line">-DLJ_NO_SYSTEM            <span class="comment"># 限制系统调用（安全考虑）</span></span><br></pre></td></tr></table></figure></p><p><strong>平台检测扩展</strong>：<br><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 在lj_arch.h中添加鸿蒙平台检测</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">elif</span> defined(__OHOS__)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> LUAJIT_OS          LUAJIT_OS_POSIX</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> LJ_TARGET_OHOS     1</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> LJ_TARGET_CONSOLE  1      <span class="comment">// 控制台模式</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> LUAJIT_DISABLE_JIT 1      <span class="comment">// JIT不可用</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> LUAJIT_USE_SYSMALLOC 1    <span class="comment">// 系统分配器</span></span></span><br></pre></td></tr></table></figure></p><h4 id="性能影响"><a href="#性能影响" class="headerlink" title="性能影响"></a>性能影响</h4><p>虽然JIT不可用，但LuaJIT的解释器模式仍提供：</p><ul><li>完整的Lua 5.1语言兼容性</li><li>优于标准Lua 5.1的性能</li><li>稳定的内存管理</li></ul><h3 id="2-3-构建系统适配"><a href="#2-3-构建系统适配" class="headerlink" title="2.3 构建系统适配"></a>2.3 构建系统适配</h3><h4 id="挑战分析-2"><a href="#挑战分析-2" class="headerlink" title="挑战分析"></a>挑战分析</h4><p>不同依赖库使用不同的构建系统：</p><ul><li><strong>Autotools</strong>：libiconv</li><li><strong>Makefile</strong>：Lua、lpeg、LuaJIT</li><li><strong>CMake</strong>：tree-sitter、unibilium、utf8proc</li><li><strong>自定义构建</strong>：luv</li></ul><h4 id="统一构建方案"><a href="#统一构建方案" class="headerlink" title="统一构建方案"></a>统一构建方案</h4><p><strong>简化构建流程</strong>：<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 旧流程（复杂）</span></span><br><span class="line">下载 → 解压 → 应用补丁 → 构建</span><br><span class="line"></span><br><span class="line"><span class="comment"># 新流程（简化）</span></span><br><span class="line">下载 → 解压（已包含修改） → 构建</span><br></pre></td></tr></table></figure></p><p><strong>工具链统一配置</strong>：<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 鸿蒙BiSheng工具链</span></span><br><span class="line"><span class="built_in">export</span> CC=<span class="string">"/data/app/BiSheng.org/BiSheng_1.0/llvm/bin/clang"</span></span><br><span class="line"><span class="built_in">export</span> AR=<span class="string">"/data/app/BiSheng.org/BiSheng_1.0/llvm/bin/llvm-ar"</span></span><br><span class="line"><span class="built_in">export</span> RANLIB=<span class="string">"/data/app/BiSheng.org/BiSheng_1.0/llvm/bin/llvm-ranlib"</span></span><br><span class="line"><span class="built_in">export</span> STRIP=<span class="string">"/data/app/BiSheng.org/BiSheng_1.0/llvm/bin/llvm-strip"</span></span><br></pre></td></tr></table></figure></p><h3 id="2-4-头文件与路径冲突"><a href="#2-4-头文件与路径冲突" class="headerlink" title="2.4 头文件与路径冲突"></a>2.4 头文件与路径冲突</h3><h4 id="luv的头文件路径问题"><a href="#luv的头文件路径问题" class="headerlink" title="luv的头文件路径问题"></a>luv的头文件路径问题</h4><p><strong>问题</strong>：luv依赖Lua 5.3兼容层，但头文件包含路径错误：<br><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 错误</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">"compat-5.3.h"</span></span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 正确</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">"lua_compat53/compat-5.3.h"</span></span></span><br></pre></td></tr></table></figure></p><p><strong>解决方案</strong>：</p><ol><li>修复源代码中的包含路径</li><li>添加编译标志避免.c文件包含：<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">-DCMAKE_C_FLAGS=<span class="string">"-DCOMPAT53_PREFIX=compat53"</span></span><br></pre></td></tr></table></figure></li></ol><h3 id="2-5-平台检测扩展"><a href="#2-5-平台检测扩展" class="headerlink" title="2.5 平台检测扩展"></a>2.5 平台检测扩展</h3><h4 id="libiconv的config-guess问题"><a href="#libiconv的config-guess问题" class="headerlink" title="libiconv的config.guess问题"></a>libiconv的config.guess问题</h4><p><strong>问题</strong>：Autotools的<code>config.guess</code>脚本无法识别HarmonyOS系统。</p><p><strong>解决方案</strong>：在<code>build-aux/config.guess</code>中添加HarmonyOS检测：<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 添加系统检测分支</span></span><br><span class="line">HarmonyOS*:*:*:*)</span><br><span class="line">    <span class="built_in">echo</span> aarch64-unknown-harmonyos</span><br><span class="line">    <span class="built_in">exit</span> ;;</span><br></pre></td></tr></table></figure></p><h2 id="三、适配策略总结"><a href="#三、适配策略总结" class="headerlink" title="三、适配策略总结"></a>三、适配策略总结</h2><h3 id="3-1-渐进式适配策略"><a href="#3-1-渐进式适配策略" class="headerlink" title="3.1 渐进式适配策略"></a>3.1 渐进式适配策略</h3><ol><li><strong>功能验证优先</strong>：先测试核心功能，再完善边缘功能</li><li><strong>最小修改原则</strong>：只修改必要的部分，保持代码简洁</li><li><strong>条件编译为主</strong>：使用<code>#if !defined(__OHOS__)</code>包装平台特定代码</li><li><strong>桩函数补充</strong>：为缺失API提供简单实现</li></ol><h3 id="3-2-测试驱动开发"><a href="#3-2-测试驱动开发" class="headerlink" title="3.2 测试驱动开发"></a>3.2 测试驱动开发</h3><p>针对每个依赖库创建专门的测试程序：</p><ul><li><strong>libuv</strong>：<code>nvim-libuv-test.c</code>验证Neovim实际使用的功能</li><li><strong>LuaJIT</strong>：API可用性测试和性能基准测试</li><li><strong>综合测试</strong>：验证库间集成和兼容性</li></ul><h3 id="3-3-文档与补丁管理"><a href="#3-3-文档与补丁管理" class="headerlink" title="3.3 文档与补丁管理"></a>3.3 文档与补丁管理</h3><p><strong>补丁系统演进</strong>：</p><ol><li><strong>初期</strong>：使用patch文件管理修改</li><li><strong>中期</strong>：直接修改源码+Git版本控制</li><li><strong>当前</strong>：源码已包含修改，无需补丁应用步骤</li></ol><p><strong>文档完整性</strong>：</p><ul><li><code>PATCHES.md</code>：详细记录每个库的修改</li><li><code>libuv-porting-notes.md</code>：libuv移植全过程记录</li><li><code>luajit-harmonyos-api-analysis.md</code>：LuaJIT API限制分析</li></ul><h2 id="四、经验教训与最佳实践"><a href="#四、经验教训与最佳实践" class="headerlink" title="四、经验教训与最佳实践"></a>四、经验教训与最佳实践</h2><h3 id="4-1-关键经验"><a href="#4-1-关键经验" class="headerlink" title="4.1 关键经验"></a>4.1 关键经验</h3><ol><li><strong>平台差异深度分析</strong>：HarmonyOS不是简单的Linux变体，有独特的安全策略和API限制</li><li><strong>W^X安全策略影响</strong>：直接影响JIT编译器、代码生成等高级功能</li><li><strong>工具链兼容性</strong>：BiSheng Clang与GCC行为有细微差异</li><li><strong>文件系统限制</strong>：<code>/tmp</code>目录只读，影响临时文件处理</li></ol><h3 id="4-2-最佳实践"><a href="#4-2-最佳实践" class="headerlink" title="4.2 最佳实践"></a>4.2 最佳实践</h3><ol><li><strong>尽早验证核心API</strong>：在移植开始前测试<code>mmap</code>、<code>mprotect</code>等关键系统调用</li><li><strong>创建最小测试程序</strong>：隔离问题，快速验证假设</li><li><strong>对比官方实现</strong>：参考OpenHarmony的<code>ohos-libuv</code>等官方移植</li><li><strong>保持向上游兼容</strong>：条件编译优于直接修改，便于未来同步</li></ol><h3 id="4-3-调试技巧"><a href="#4-3-调试技巧" class="headerlink" title="4.3 调试技巧"></a>4.3 调试技巧</h3><ol><li><strong>构造函数调试</strong>：在平台文件中使用<code>__attribute__((constructor))</code>跟踪初始化</li><li><strong>环境变量诊断</strong>：检查<code>isatty()</code>、<code>uv_guess_handle()</code>等关键函数行为</li><li><strong>符号分析</strong>：使用<code>llvm-nm</code>分析库文件导出的符号</li><li><strong>分步构建测试</strong>：从简单功能开始，逐步增加复杂度</li></ol><h2 id="五、成果与展望"><a href="#五、成果与展望" class="headerlink" title="五、成果与展望"></a>五、成果与展望</h2><h3 id="5-1-移植成果"><a href="#5-1-移植成果" class="headerlink" title="5.1 移植成果"></a>5.1 移植成果</h3><p><strong>功能完整性</strong>：</p><ul><li>✅ Neovim核心编辑器功能</li><li>✅ 现代语法高亮（tree-sitter）</li><li>✅ Lua插件生态支持</li><li>✅ 异步I/O和事件处理</li><li>✅ 完整的终端用户界面</li></ul><p><strong>性能表现</strong>：</p><ul><li>LuaJIT解释器模式性能良好</li><li>libuv事件循环响应迅速</li><li>内存使用稳定可控</li></ul><h3 id="5-2-代码质量"><a href="#5-2-代码质量" class="headerlink" title="5.2 代码质量"></a>5.2 代码质量</h3><p><strong>补丁质量</strong>：</p><ul><li>所有修改都有详细文档记录</li><li>条件编译确保向上游兼容</li><li>测试覆盖核心功能场景</li></ul><p><strong>构建可靠性</strong>：</p><ul><li>100%构建成功率</li><li>支持增量构建和清理</li><li>完整的日志和错误处理</li></ul><h3 id="5-3-未来工作"><a href="#5-3-未来工作" class="headerlink" title="5.3 未来工作"></a>5.3 未来工作</h3><ol><li><strong>性能优化</strong>：进一步调优LuaJIT解释器性能</li><li><strong>网络功能</strong>：完善libuv网络套接字支持</li><li><strong>上游贡献</strong>：将稳定补丁贡献到各开源项目</li><li><strong>生态扩展</strong>：支持更多Lua插件和tree-sitter语法</li></ol><h2 id="六、结语"><a href="#六、结语" class="headerlink" title="六、结语"></a>六、结语</h2><p>Neovim在HarmonyOS PC上的成功移植，证明了复杂C/C++项目在鸿蒙生态中的可行性。通过系统性的平台差异分析、渐进式的适配策略和严谨的测试验证，我们克服了JIT内存限制、API差异、构建系统兼容性等多个技术挑战。</p><p>这次移植实践为其他复杂开源软件在HarmonyOS上的适配提供了宝贵经验：</p><ul><li><strong>平台差异的深度理解</strong>是成功的基础</li><li><strong>最小化修改和条件编译</strong>保持代码可维护性</li><li><strong>测试驱动的开发方法</strong>确保功能可靠性</li><li><strong>完整的文档记录</strong>便于知识传承和社区协作</li></ul><p>随着HarmonyOS PC生态的不断完善，期待更多优秀的开源软件能够在鸿蒙平台上焕发新的活力。</p><hr><p><strong>相关资源</strong>：</p><ul><li>项目仓库：<a href="https://gitcode.com/ystyle/neovim-harmonyos" target="_blank" rel="noopener">https://gitcode.com/ystyle/neovim-harmonyos</a></li><li>依赖构建系统：<a href="https://gitcode.com/ystyle/neovim-harmonyos-deps" target="_blank" rel="noopener">harmonyos-deps/</a></li><li>详细移植记录：<a href="https://gitcode.com/ystyle/neovim-harmonyos-deps/blob/master/libuv-porting-notes.md" target="_blank" rel="noopener">libuv-porting-notes.md</a></li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;Neovim移植鸿蒙PC：三方库适配实战与挑战解析&quot;&gt;&lt;a href=&quot;#Neovim移植鸿蒙PC：三方库适配实战与挑战解析&quot; class=&quot;headerlink&quot; title=&quot;Neovim移植鸿蒙PC：三方库适配实战与挑战解析&quot;&gt;&lt;/a&gt;Neovim移植鸿蒙P
      
    
    </summary>
    
      <category term="软件" scheme="http://ystyle.top/categories/%E8%BD%AF%E4%BB%B6/"/>
    
    
      <category term="鸿蒙" scheme="http://ystyle.top/tags/%E9%B8%BF%E8%92%99/"/>
    
      <category term="鸿蒙PC" scheme="http://ystyle.top/tags/%E9%B8%BF%E8%92%99PC/"/>
    
      <category term="matebook pro" scheme="http://ystyle.top/tags/matebook-pro/"/>
    
      <category term="neovim" scheme="http://ystyle.top/tags/neovim/"/>
    
      <category term="livub" scheme="http://ystyle.top/tags/livub/"/>
    
      <category term="luajit" scheme="http://ystyle.top/tags/luajit/"/>
    
  </entry>
  
  <entry>
    <title>鸿蒙PC Matebook Pro上安装仓颉编译器每日构建版</title>
    <link href="http://ystyle.top/2025/12/27/matebookpro-run-cangjie-compiler/"/>
    <id>http://ystyle.top/2025/12/27/matebookpro-run-cangjie-compiler/</id>
    <published>2025-12-27T07:00:00.000Z</published>
    <updated>2025-12-27T07:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="https://dll.ystyle.top/images/2025-12/5e398f57bb264562850d933612e65a3d.png" alt="使用示例" title="">                </div>                <div class="image-caption">使用示例</div>            </figure><h2 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h2><ul><li>在鸿蒙PC上使用应用商店安装CodeArts IDE</li><li>下载仓颉编译器每日构建版本: <a href="https://gitcode.com/Cangjie/nightly_build/releases" target="_blank" rel="noopener">cangjie-sdk-ohos-aarch64-1.1.0-alpha.2025xxxxxxxxxxxxx.tar.gz</a></li></ul><h2 id="从CodeArts-IDE提取签名工具"><a href="#从CodeArts-IDE提取签名工具" class="headerlink" title="从CodeArts IDE提取签名工具"></a>从CodeArts IDE提取签名工具</h2><p>打开IDE, 随便创建一个项目打开，在终端执行以下命令<br><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 复制签名工具</span></span><br><span class="line">cp /data/app/toolchains.org/toolchains_1.0/lib//binary-sign-tool .</span><br><span class="line"><span class="meta">#</span><span class="bash"> 对签名工具签名</span></span><br><span class="line">binary-sign-tool sign -inFile "./binary-sign-tool" -outFile "./binary-sign-tool-signed" -selfSign 1</span><br><span class="line"><span class="meta">#</span><span class="bash"> 添加可执行权限</span></span><br><span class="line">chmod +x binary-sign-tool-signed</span><br><span class="line"><span class="meta">#</span><span class="bash"> 测试，如果没弹授权弹窗和帮忙输出，需要重新签名和添加可执行权限</span></span><br><span class="line">./binary-sign-tool-signed</span><br><span class="line"></span><br><span class="line"><span class="meta">#</span><span class="bash"> 复制到用户安装目录</span></span><br><span class="line">mkdir -p ~/.local/bin</span><br><span class="line">cp ./binary-sign-tool-signed ~/.local/bin/binary-sign-tool</span><br></pre></td></tr></table></figure></p><p>最后在<code>~/.zshrc</code>添加<code>export PATH=$HOME/.local/bin:$PATH</code></p><h2 id="安装仓颉编译器"><a href="#安装仓颉编译器" class="headerlink" title="安装仓颉编译器"></a>安装仓颉编译器</h2><ul><li>把下载的仓颉编译器复制到个人目录(文件管器和下载目录同级)</li><li>打开终端解压 <code>tar -xzf cangjie-sdk-ohos-aarch64-1.1.0-alpha.2025xxxxxxxxxxxxx.tar.gz</code> 换自己下载的版本</li><li>打开<code>cangjie/envsetup.sh</code>把首行的<code>#!/bin/bash</code>换成<code>#!/bin/sh</code></li><li><p>把以下脚本保存为<code>sign-cangjie.sh</code>并复制到<code>cangjie</code>目录下和<code>envsetup.sh</code>同级</p>  <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash">!/bin/sh</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#</span><span class="bash"> 递归查询当前目录及其子目录下的所有文件</span></span><br><span class="line">find . -type f | while read -r file; do</span><br><span class="line"><span class="meta">#</span><span class="bash"> 使用 file 命令检查文件类型</span></span><br><span class="line">if file "$file" | grep "shared object"; then</span><br><span class="line">echo "Found executable or shared object: $file"</span><br><span class="line"></span><br><span class="line"><span class="meta">#</span><span class="bash"> 确保文件具有可执行权限</span></span><br><span class="line">chmod +x "$file"</span><br><span class="line"></span><br><span class="line"><span class="meta">#</span><span class="bash"> 签名文件</span></span><br><span class="line">echo "Signing file: $file"</span><br><span class="line">binary-sign-tool sign -inFile "$file" -outFile "$file" -selfSign 1</span><br><span class="line">fi</span><br><span class="line">done</span><br></pre></td></tr></table></figure></li><li><p>在终端切换到<code>cangjie</code>目录下，执行<code>chmod +x sign-cangjie.sh</code> 并执行 <code>./sign-cangjie.sh</code></p></li><li>终端切换到<code>third_party/llvm/bin</code> 目录， 执行 <code>rm ld.lld &amp;&amp; cp lld ld.lld</code><ul><li>这一步是为了解决 cjc 编译过程中找不到<code>ld.lld</code>的问题， 原因是仓颉编译器看不到软链接的 <code>ld.lld</code></li></ul></li></ul><h2 id="使用仓颉编译器"><a href="#使用仓颉编译器" class="headerlink" title="使用仓颉编译器"></a>使用仓颉编译器</h2><p>现在就可以按仓颉教程的两种方法使用仓颉了</p><ul><li><p>第一种，临时使用</p><ul><li>打开终端 <code>source ~/.cangjie/envsetup.sh</code> 然后就可以在当前终端窗口执行<code>cjc -v</code></li></ul></li><li><p>第二种，永远使用</p><ul><li>把<code>source $HOME/.cangjie/envsetup.sh</code> 添加到 <code>~/.zshrc</code> 里，之后打开的新终端都可以使用仓颉命令了</li></ul></li></ul><h2 id="编译并执行项目"><a href="#编译并执行项目" class="headerlink" title="编译并执行项目"></a>编译并执行项目</h2><ul><li><p>写一个<code>hello_world.cj</code></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">main()&#123;</span><br><span class="line">println(&quot;你好，仓颉\n你好鸿蒙&quot;)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>编译 <code>cjc hello_world.cj</code></p></li><li>签名 <code>binary-sign-tool sign -inFile &quot;./main&quot; -outFile &quot;./main-signed&quot; -selfSign 1</code></li><li>授权 <code>chmod +x ./main-signed</code></li><li>执行 <code>./main-signed</code> , 如无意外就能看到输出了</li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;figure class=&quot;image-bubble&quot;&gt;
                &lt;div class=&quot;img-lightbox&quot;&gt;
                    &lt;div class=&quot;overlay&quot;&gt;&lt;/div&gt;
                   
      
    
    </summary>
    
      <category term="软件" scheme="http://ystyle.top/categories/%E8%BD%AF%E4%BB%B6/"/>
    
    
      <category term="鸿蒙" scheme="http://ystyle.top/tags/%E9%B8%BF%E8%92%99/"/>
    
      <category term="鸿蒙PC" scheme="http://ystyle.top/tags/%E9%B8%BF%E8%92%99PC/"/>
    
      <category term="matebook pro" scheme="http://ystyle.top/tags/matebook-pro/"/>
    
      <category term="仓颉" scheme="http://ystyle.top/tags/%E4%BB%93%E9%A2%89/"/>
    
      <category term="cangjie" scheme="http://ystyle.top/tags/cangjie/"/>
    
      <category term="cangjie-lang" scheme="http://ystyle.top/tags/cangjie-lang/"/>
    
  </entry>
  
  <entry>
    <title>鸿蒙pc上Vite 7 + Rollup原生模块问题的解决方案</title>
    <link href="http://ystyle.top/2025/12/08/matebookpro-run-vite7-vue-rollup/"/>
    <id>http://ystyle.top/2025/12/08/matebookpro-run-vite7-vue-rollup/</id>
    <published>2025-12-08T13:00:00.000Z</published>
    <updated>2025-12-08T13:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="环境信息"><a href="#环境信息" class="headerlink" title="环境信息"></a>环境信息</h2><ul><li><strong>操作系统</strong>：HarmonyOS HongMeng Kernel 1.11.0 (OpenHarmony)</li><li><strong>Node.js版本</strong>：22.7.0</li><li><strong>Vite版本</strong>：7.2.6</li><li><strong>Rollup版本</strong>：4.53.3</li><li><strong>项目类型</strong>：Vue 3 + TypeScript + Vite</li></ul><h2 id="问题描述"><a href="#问题描述" class="headerlink" title="问题描述"></a>问题描述</h2><p>在鸿蒙系统上运行<code>npm run dev</code>时出现以下错误：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Error: Cannot find module @rollup/rollup-openharmony-arm64. npm has a bug related to optional dependencies (https://github.com/npm/cli/issues/4828). Please try `npm i` again after removing both package-lock.json and node_modules directory.</span><br></pre></td></tr></table></figure></p><h2 id="错误分析"><a href="#错误分析" class="headerlink" title="错误分析"></a>错误分析</h2><ol><li><strong>Rollup原生模块问题</strong>：Rollup 4.53.3为鸿蒙系统提供了原生模块<code>@rollup/rollup-openharmony-arm64</code>，但在当前鸿蒙环境无法正确加载</li><li><strong>Node.js版本警告</strong>：Vite 7需要Node.js 22.12+，当前是22.7.0，但Vite仍可运行</li><li><strong>npm可选依赖bug</strong>：npm在处理可选依赖时存在问题</li></ol><h2 id="解决方案"><a href="#解决方案" class="headerlink" title="解决方案"></a>解决方案</h2><h3 id="1-修改Rollup的native-js文件"><a href="#1-修改Rollup的native-js文件" class="headerlink" title="1. 修改Rollup的native.js文件"></a>1. 修改Rollup的native.js文件</h3><p>文件位置：<code>node_modules/rollup/dist/native.js</code></p><p>在文件开头添加以下代码：<br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> &#123; platform &#125; = <span class="built_in">require</span>(<span class="string">'node:process'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 鸿蒙系统使用JavaScript版本</span></span><br><span class="line"><span class="keyword">if</span> (platform === <span class="string">'openharmony'</span>) &#123;</span><br><span class="line">  <span class="comment">// 返回一个简单的实现，避免抛出错误</span></span><br><span class="line">  <span class="built_in">module</span>.exports.parse = <span class="function"><span class="keyword">function</span>(<span class="params">input, allowReturnOutsideFunction = false, jsx = false</span>) </span>&#123;</span><br><span class="line">    <span class="comment">// 返回一个简单的AST结构</span></span><br><span class="line">    <span class="keyword">return</span> &#123;</span><br><span class="line">      type: <span class="string">'Program'</span>,</span><br><span class="line">      body: [],</span><br><span class="line">      sourceType: <span class="string">'module'</span>,</span><br><span class="line">      comments: []</span><br><span class="line">    &#125;;</span><br><span class="line">  &#125;;</span><br><span class="line">  <span class="built_in">module</span>.exports.parseAsync = <span class="keyword">async</span> <span class="function"><span class="keyword">function</span>(<span class="params">input, allowReturnOutsideFunction = false, jsx = false, signal</span>) </span>&#123;</span><br><span class="line">    <span class="keyword">return</span> &#123;</span><br><span class="line">      type: <span class="string">'Program'</span>,</span><br><span class="line">      body: [],</span><br><span class="line">      sourceType: <span class="string">'module'</span>,</span><br><span class="line">      comments: []</span><br><span class="line">    &#125;;</span><br><span class="line">  &#125;;</span><br><span class="line">  <span class="built_in">module</span>.exports.xxhashBase64Url = <span class="function"><span class="keyword">function</span>(<span class="params">input</span>) </span>&#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="string">'xxhash_base64_url_stub'</span>;</span><br><span class="line">  &#125;;</span><br><span class="line">  <span class="built_in">module</span>.exports.xxhashBase36 = <span class="function"><span class="keyword">function</span>(<span class="params">input</span>) </span>&#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="string">'xxhash_base36_stub'</span>;</span><br><span class="line">  &#125;;</span><br><span class="line">  <span class="built_in">module</span>.exports.xxhashBase16 = <span class="function"><span class="keyword">function</span>(<span class="params">input</span>) </span>&#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="string">'xxhash_base16_stub'</span>;</span><br><span class="line">  &#125;;</span><br><span class="line">  <span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><h3 id="2-package-json配置"><a href="#2-package-json配置" class="headerlink" title="2. package.json配置"></a>2. package.json配置</h3><p>确保使用Vite 7及相关插件：<br><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  <span class="attr">"devDependencies"</span>: &#123;</span><br><span class="line">    <span class="attr">"@vitejs/plugin-vue"</span>: <span class="string">"^6.0.0"</span>,</span><br><span class="line">    <span class="attr">"@vitejs/plugin-vue-jsx"</span>: <span class="string">"^5.0.0"</span>,</span><br><span class="line">    <span class="attr">"vite"</span>: <span class="string">"^7.0.0"</span></span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><h2 id="完整操作步骤"><a href="#完整操作步骤" class="headerlink" title="完整操作步骤"></a>完整操作步骤</h2><h3 id="步骤1：清理并安装依赖"><a href="#步骤1：清理并安装依赖" class="headerlink" title="步骤1：清理并安装依赖"></a>步骤1：清理并安装依赖</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 清理旧依赖</span></span><br><span class="line">rm -rf node_modules package-lock.json</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装依赖（使用legacy-peer-deps避免peer依赖冲突）</span></span><br><span class="line">npm install --legacy-peer-deps</span><br></pre></td></tr></table></figure><h3 id="步骤2：修改Rollup文件"><a href="#步骤2：修改Rollup文件" class="headerlink" title="步骤2：修改Rollup文件"></a>步骤2：修改Rollup文件</h3><ol><li>打开<code>node_modules/rollup/dist/native.js</code></li><li>在文件开头添加上述代码</li><li>保存文件</li></ol><h3 id="步骤3：运行项目"><a href="#步骤3：运行项目" class="headerlink" title="步骤3：运行项目"></a>步骤3：运行项目</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">npm run dev</span><br><span class="line"><span class="comment"># 或直接运行</span></span><br><span class="line">npx vite</span><br></pre></td></tr></table></figure><h2 id="验证结果"><a href="#验证结果" class="headerlink" title="验证结果"></a>验证结果</h2><ul><li><strong>Vite版本</strong>：7.2.6 ✓</li><li><strong>开发服务器</strong>：成功启动在 <a href="http://localhost:5175/" target="_blank" rel="noopener">http://localhost:5175/</a> ✓</li><li><p><strong>控制台输出</strong>：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">VITE v7.2.6  ready in 1742 ms</span><br><span class="line">➜  Local:   http://localhost:5175/</span><br></pre></td></tr></table></figure></li><li><p><strong>警告信息</strong>（可忽略）：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">You are using Node.js 22.7.0. Vite requires Node.js version 20.19+ or 22.12+. Please upgrade your Node.js version.</span><br></pre></td></tr></table></figure></li></ul><h2 id="技术原理"><a href="#技术原理" class="headerlink" title="技术原理"></a>技术原理</h2><h3 id="Rollup原生模块加载机制"><a href="#Rollup原生模块加载机制" class="headerlink" title="Rollup原生模块加载机制"></a>Rollup原生模块加载机制</h3><ol><li>Rollup根据平台和架构加载对应的原生模块</li><li>鸿蒙系统对应<code>openharmony-arm64</code></li><li>当原生模块加载失败时，Rollup应回退到JavaScript实现</li><li>我们的修改强制在鸿蒙系统上使用JavaScript实现</li></ol><h3 id="修改的作用"><a href="#修改的作用" class="headerlink" title="修改的作用"></a>修改的作用</h3><ol><li><strong>提前返回</strong>：在鸿蒙系统上直接返回模块导出，跳过原生模块加载</li><li><strong>简单实现</strong>：提供基本的函数实现，避免运行时错误</li><li><strong>兼容性</strong>：确保Vite和其他工具能正常调用这些函数</li></ol><h2 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h2><h3 id="1-持久性问题"><a href="#1-持久性问题" class="headerlink" title="1. 持久性问题"></a>1. 持久性问题</h3><ul><li>对<code>node_modules</code>的修改在重新安装依赖后会丢失</li><li>解决方案：<ul><li>使用<code>patch-package</code>创建永久补丁</li><li>在<code>postinstall</code>脚本中自动应用修改</li><li>记录修改步骤，需要时重新应用</li></ul></li></ul><h3 id="2-性能影响"><a href="#2-性能影响" class="headerlink" title="2. 性能影响"></a>2. 性能影响</h3><ul><li>使用JavaScript实现可能比原生模块慢</li><li>但对于开发服务器影响不大</li><li>生产构建可能受影响，但鸿蒙系统通常用于移动端，Vite主要用于开发</li></ul><h3 id="3-版本兼容性"><a href="#3-版本兼容性" class="headerlink" title="3. 版本兼容性"></a>3. 版本兼容性</h3><ul><li><strong>Node.js</strong>：22.7.0（低于Vite 7要求的22.12+）</li><li><strong>Vite</strong>：7.2.6 ✓</li><li><strong>Rollup</strong>：4.53.3 ✓</li><li>相关插件需要匹配Vite 7版本</li></ul><h2 id="替代方案"><a href="#替代方案" class="headerlink" title="替代方案"></a>替代方案</h2><h3 id="方案A：降级Vite到6-x"><a href="#方案A：降级Vite到6-x" class="headerlink" title="方案A：降级Vite到6.x"></a>方案A：降级Vite到6.x</h3><ul><li>优点：完全兼容Node.js 22.7.0</li><li>缺点：无法使用Vite 7新特性</li><li>操作：修改package.json中Vite版本为<code>^6.0.0</code>， 然后一样修改Rollup的native.js文件</li></ul><h3 id="方案B：升级Node-js"><a href="#方案B：升级Node-js" class="headerlink" title="方案B：升级Node.js"></a>方案B：升级Node.js</h3><ul><li>优点：完全符合Vite 7要求</li><li>缺点：鸿蒙系统无法升级Node.js</li><li>操作：将Node.js升级到22.12+</li></ul><h3 id="方案C：使用环境变量"><a href="#方案C：使用环境变量" class="headerlink" title="方案C：使用环境变量"></a>方案C：使用环境变量</h3><p>尝试过但未成功：<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ROLLUP_NATIVE=<span class="literal">false</span> npm run dev</span><br></pre></td></tr></table></figure></p><h2 id="故障排除"><a href="#故障排除" class="headerlink" title="故障排除"></a>故障排除</h2><h3 id="问题1：修改后仍然报错"><a href="#问题1：修改后仍然报错" class="headerlink" title="问题1：修改后仍然报错"></a>问题1：修改后仍然报错</h3><ul><li>检查修改是否正确应用</li><li>确保在文件最开头添加代码</li><li>检查platform是否为<code>&#39;openharmony&#39;</code></li></ul><h3 id="问题2：Vite启动失败"><a href="#问题2：Vite启动失败" class="headerlink" title="问题2：Vite启动失败"></a>问题2：Vite启动失败</h3><ul><li>检查Node.js版本：<code>node --version</code></li><li>检查Vite版本：<code>npx vite --version</code></li><li>清理缓存：<code>rm -rf node_modules/.vite</code></li></ul><h3 id="问题3：其他依赖冲突"><a href="#问题3：其他依赖冲突" class="headerlink" title="问题3：其他依赖冲突"></a>问题3：其他依赖冲突</h3><ul><li>使用<code>npm ls</code>检查依赖树</li><li>使用<code>--legacy-peer-deps</code>安装</li><li>检查package.json中的版本范围</li></ul><h2 id="长期建议"><a href="#长期建议" class="headerlink" title="长期建议"></a>长期建议</h2><ol><li><strong>向Rollup提交Issue</strong>：报告鸿蒙系统原生模块问题</li><li><strong>关注Vite更新</strong>：后续版本可能改善兼容性</li><li><strong>考虑Docker</strong>：在容器中运行开发环境避免系统差异</li><li><strong>文档化</strong>：团队共享此解决方案</li></ol><h2 id="成功标志"><a href="#成功标志" class="headerlink" title="成功标志"></a>成功标志</h2><ul><li>✅ Vite开发服务器正常启动</li><li>✅ 浏览器可访问本地开发地址</li><li>✅ HMR（热模块替换）正常工作</li><li>✅ 控制台无原生模块相关错误</li><li>✅ 项目可正常开发和调试</li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;环境信息&quot;&gt;&lt;a href=&quot;#环境信息&quot; class=&quot;headerlink&quot; title=&quot;环境信息&quot;&gt;&lt;/a&gt;环境信息&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;操作系统&lt;/strong&gt;：HarmonyOS HongMeng Kernel 1.11.0 (
      
    
    </summary>
    
      <category term="软件" scheme="http://ystyle.top/categories/%E8%BD%AF%E4%BB%B6/"/>
    
    
      <category term="鸿蒙" scheme="http://ystyle.top/tags/%E9%B8%BF%E8%92%99/"/>
    
      <category term="鸿蒙PC" scheme="http://ystyle.top/tags/%E9%B8%BF%E8%92%99PC/"/>
    
      <category term="matebook pro" scheme="http://ystyle.top/tags/matebook-pro/"/>
    
      <category term="vite" scheme="http://ystyle.top/tags/vite/"/>
    
      <category term="vue3" scheme="http://ystyle.top/tags/vue3/"/>
    
      <category term="Rollup" scheme="http://ystyle.top/tags/Rollup/"/>
    
  </entry>
  
  <entry>
    <title>hypyland实现alt + tab切换到任意工作区的窗口</title>
    <link href="http://ystyle.top/2023/10/13/hyprland-alt-tab-switch-to-any-widnow/"/>
    <id>http://ystyle.top/2023/10/13/hyprland-alt-tab-switch-to-any-widnow/</id>
    <published>2023-10-13T02:46:26.000Z</published>
    <updated>2023-10-13T07:08:26.000Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>hypyland使用过程中，遇到开了很多工作区和很多窗口时，找指定的窗口会比较麻烦</p></blockquote><h3 id="依赖"><a href="#依赖" class="headerlink" title="依赖"></a>依赖</h3><blockquote><p>一键安装 <code>yay -S jq rofi-lbonn-wayland-git</code></p></blockquote><ul><li>jq</li><li>rofi</li></ul><h3 id="脚本"><a href="#脚本" class="headerlink" title="脚本"></a>脚本</h3><p>把以下脚本存放到<code>~/.config/hypr/scripts/switch_windows</code><br><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash">!/usr/bin/env bash</span></span><br><span class="line">NAME=`hyprctl clients -j | jq -r '.[] | select(.title != "") | .title' | rofi -dmenu`</span><br><span class="line">WINDOW=`hyprctl clients -j | jq -r ".[] | select(.title == \"$&#123;NAME&#125;\") | .address"`</span><br><span class="line">hyprctl dispatch focuswindow address:$&#123;WINDOW&#125;</span><br></pre></td></tr></table></figure></p><p>添加快捷键<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">bind = ALT, Tab, exec, $&#123;HOME&#125;/.config/hypr/scripts/switch_windows</span><br></pre></td></tr></table></figure></p><h3 id="效果"><a href="#效果" class="headerlink" title="效果"></a>效果</h3><blockquote><p>按<code>alt + tab</code>后，在弹出的窗口选择对应窗口的标题， 可以自动跳转到对应的窗口</p></blockquote><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="https://github.com/ystyle/ystyle.github.io/assets/4478635/bf28c244-a9ad-4463-92a6-d06b5329c749" alt="截图_2023-10-13_160749" title="">                </div>                <div class="image-caption">截图_2023-10-13_160749</div>            </figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;blockquote&gt;
&lt;p&gt;hypyland使用过程中，遇到开了很多工作区和很多窗口时，找指定的窗口会比较麻烦&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;依赖&quot;&gt;&lt;a href=&quot;#依赖&quot; class=&quot;headerlink&quot; title=&quot;依赖&quot;&gt;&lt;/a&gt;依赖&lt;/
      
    
    </summary>
    
      <category term="系统" scheme="http://ystyle.top/categories/%E7%B3%BB%E7%BB%9F/"/>
    
    
      <category term="hyprland" scheme="http://ystyle.top/tags/hyprland/"/>
    
      <category term="wayland" scheme="http://ystyle.top/tags/wayland/"/>
    
  </entry>
  
  <entry>
    <title>使用泛型设计gorm扩展字段</title>
    <link href="http://ystyle.top/2023/09/25/design_gorm_extension_fields_using_generics/"/>
    <id>http://ystyle.top/2023/09/25/design_gorm_extension_fields_using_generics/</id>
    <published>2023-09-25T09:37:26.000Z</published>
    <updated>2023-09-25T09:37:26.000Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>大型项目经常需要在标准的用户表或员工表加些扩展字段，如果你有一套标准的用户管理系统的话，要么每个项目复制过来改一遍或者添加十几个固定的自定义字段Def1~Def10， 现在可以用在gorm定义模型时使用泛型来解决这个问题</p></blockquote><h3 id="gorm-embeded嵌入字段"><a href="#gorm-embeded嵌入字段" class="headerlink" title="gorm embeded嵌入字段"></a>gorm embeded嵌入字段</h3><p>使用<code>gorm:&quot;embedded&quot;</code>定义嵌入字段</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">type</span> User <span class="keyword">struct</span> &#123;</span><br><span class="line">gorm.Model</span><br><span class="line">Username <span class="keyword">string</span></span><br><span class="line">Password <span class="keyword">string</span></span><br><span class="line">Extend   UserExtendField <span class="string">`gorm:"embedded"`</span> <span class="comment">// 添加embed tag</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> UserExtendField <span class="keyword">struct</span> &#123;</span><br><span class="line">OpenID <span class="keyword">string</span></span><br><span class="line">UnionID <span class="keyword">string</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>上面的model等价于这个, 两个生成的表结构是一致的<br><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">type</span> User <span class="keyword">struct</span> &#123;</span><br><span class="line">gorm.Model</span><br><span class="line">Username <span class="keyword">string</span></span><br><span class="line">Password <span class="keyword">string</span></span><br><span class="line">OpenID <span class="keyword">string</span></span><br><span class="line">UnionID <span class="keyword">string</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><p>上面两个模型都会生成同样的ddl sql, 如下<br><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> <span class="keyword">if</span> <span class="keyword">not</span> <span class="keyword">users</span></span><br><span class="line">(</span><br><span class="line">    <span class="keyword">id</span>         <span class="built_in">bigint</span> <span class="keyword">unsigned</span> auto_increment</span><br><span class="line">        primary <span class="keyword">key</span>,</span><br><span class="line">    created_at datetime(<span class="number">3</span>) <span class="literal">null</span>,</span><br><span class="line">    updated_at datetime(<span class="number">3</span>) <span class="literal">null</span>,</span><br><span class="line">    deleted_at datetime(<span class="number">3</span>) <span class="literal">null</span>,</span><br><span class="line">  username   longtext    <span class="literal">null</span>,</span><br><span class="line">    <span class="keyword">password</span>   longtext    <span class="literal">null</span>,</span><br><span class="line">    org_id     longtext    <span class="literal">null</span>,</span><br><span class="line">    open_id    longtext    <span class="literal">null</span>,</span><br><span class="line">    union_id   longtext    <span class="literal">null</span>   </span><br><span class="line">)</span><br></pre></td></tr></table></figure></p><h3 id="使用泛型定义可扩展的模型"><a href="#使用泛型定义可扩展的模型" class="headerlink" title="使用泛型定义可扩展的模型"></a>使用泛型定义可扩展的模型</h3><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">type</span> User[ExtendField any] <span class="keyword">struct</span> &#123;</span><br><span class="line">gorm.Model</span><br><span class="line">Username <span class="keyword">string</span></span><br><span class="line">Password <span class="keyword">string</span></span><br><span class="line">Extend   ExtendField <span class="string">`gorm:"embedded"`</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 需要自定义表名，否则gorm识别到的泛型的表名是不符合数据库标准的，建表会错误</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(User[Extend, Item])</span> <span class="title">TableName</span><span class="params">()</span> <span class="title">string</span></span> &#123;</span><br><span class="line"><span class="keyword">return</span> <span class="string">"ma_users"</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 定义扩展字段结构</span></span><br><span class="line"><span class="keyword">type</span> ExtendUserField <span class="keyword">struct</span> &#123;</span><br><span class="line">OrgID   <span class="keyword">string</span></span><br><span class="line">OpenID  <span class="keyword">string</span></span><br><span class="line">UnionID <span class="keyword">string</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>使用方法<br><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 生成数据库表结构</span></span><br><span class="line">db.AutoMigrate(User[ExtendUserField])</span><br><span class="line"></span><br><span class="line"><span class="comment">// 查找</span></span><br><span class="line"><span class="keyword">var</span> list []User[ExtendUserField]</span><br><span class="line">db.model(&amp;User[ExtendUserField]).Find(&amp;list)</span><br></pre></td></tr></table></figure></p><h3 id="可扩展的子表"><a href="#可扩展的子表" class="headerlink" title="可扩展的子表"></a>可扩展的子表</h3><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">type</span> User[ExtendField any,Item any] <span class="keyword">struct</span> &#123;</span><br><span class="line">gorm.Model</span><br><span class="line">Username <span class="keyword">string</span></span><br><span class="line">Password <span class="keyword">string</span></span><br><span class="line">Extend   ExtendField <span class="string">`gorm:"embedded"`</span></span><br><span class="line">Items    Item <span class="string">`gorm:"foreignKey:user_id"`</span> <span class="comment">// 这里需要写外键</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 需要自定义表名，否则gorm识别到的泛型的表名是不符合数据库标准的，建表会错误</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(User[Extend, Item])</span> <span class="title">TableName</span><span class="params">()</span> <span class="title">string</span></span> &#123;</span><br><span class="line"><span class="keyword">return</span> <span class="string">"ma_users"</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> UserItem <span class="keyword">struct</span> &#123;</span><br><span class="line">gorm.Model</span><br><span class="line">UserID  <span class="keyword">uint</span></span><br><span class="line">Product <span class="keyword">string</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 定义扩展字段结构</span></span><br><span class="line"><span class="keyword">type</span> ExtendUserField <span class="keyword">struct</span> &#123;</span><br><span class="line">OrgID   <span class="keyword">string</span></span><br><span class="line">OpenID  <span class="keyword">string</span></span><br><span class="line">UnionID <span class="keyword">string</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>使用方法<br><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 查找</span></span><br><span class="line"><span class="keyword">var</span> list []User[ExtendUserField, UserItem]</span><br><span class="line">db.model(&amp;User[ExtendUserField, UserItem]).Find(&amp;list)</span><br></pre></td></tr></table></figure></p><h3 id="使用类型别名简化泛型类型"><a href="#使用类型别名简化泛型类型" class="headerlink" title="使用类型别名简化泛型类型"></a>使用类型别名简化泛型类型</h3><blockquote><p>使用类型别名， 可以把上面的泛型代码简化<br><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">type</span> MyUser = User[ExUserField, UserItem]</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> list []MyUser</span><br><span class="line">db.model(&amp;MyUser).Find(&amp;list)</span><br></pre></td></tr></table></figure></p></blockquote>]]></content>
    
    <summary type="html">
    
      
      
        &lt;blockquote&gt;
&lt;p&gt;大型项目经常需要在标准的用户表或员工表加些扩展字段，如果你有一套标准的用户管理系统的话，要么每个项目复制过来改一遍或者添加十几个固定的自定义字段Def1~Def10， 现在可以用在gorm定义模型时使用泛型来解决这个问题&lt;/p&gt;
&lt;/blockqu
      
    
    </summary>
    
      <category term="软件" scheme="http://ystyle.top/categories/%E8%BD%AF%E4%BB%B6/"/>
    
    
      <category term="go" scheme="http://ystyle.top/tags/go/"/>
    
      <category term="gorm" scheme="http://ystyle.top/tags/gorm/"/>
    
      <category term="泛型" scheme="http://ystyle.top/tags/%E6%B3%9B%E5%9E%8B/"/>
    
  </entry>
  
  <entry>
    <title>使用qemu8.0安装龙芯loongarch64版本archlinux</title>
    <link href="http://ystyle.top/2023/07/20/install-loongarch64-archlinux-qemu/"/>
    <id>http://ystyle.top/2023/07/20/install-loongarch64-archlinux-qemu/</id>
    <published>2023-07-20T02:46:26.000Z</published>
    <updated>2023-07-20T02:46:26.000Z</updated>
    
    <content type="html"><![CDATA[<h3 id="准备"><a href="#准备" class="headerlink" title="准备"></a>准备</h3><ul><li><a href="https://loongarchlinux.org/pages/download/" target="_blank" rel="noopener">Loong Arch Linux官网</a></li><li><a href="https://mirrors.pku.edu.cn/loongarch/archlinux/images/" target="_blank" rel="noopener">qemu镜像下载</a><ul><li><code>QEMU_EFI_8.0.fd</code>: 固件</li><li><code>archlinux-xfce4-2023.05.10-loong64.qcow2.zst</code>: 系统镜像, 下载后需要解压出qcow2文件</li></ul></li></ul><h3 id="安装依赖"><a href="#安装依赖" class="headerlink" title="安装依赖"></a>安装依赖</h3><blockquote><p>建议安装<code>qemu-full</code>包, 我以前安装的不是这个, 导致gpu加载不了</p></blockquote><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo pacman -S qemu-full</span><br></pre></td></tr></table></figure><h3 id="启动系统"><a href="#启动系统" class="headerlink" title="启动系统"></a>启动系统</h3><blockquote><p>注意固件版本和系统镜像版本</p></blockquote><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">qemu-system-loongarch64 \</span><br><span class="line">    -m 4G \</span><br><span class="line">    -cpu la464-loongarch-cpu \</span><br><span class="line">    -machine virt \</span><br><span class="line">    -smp 4 \</span><br><span class="line">    -bios ./QEMU_EFI_8.0.fd \</span><br><span class="line">    -serial stdio \</span><br><span class="line">    -device virtio-gpu-pci \</span><br><span class="line">    -net nic -net user \</span><br><span class="line">    -device nec-usb-xhci,id=xhci,addr=0x1b \</span><br><span class="line">    -device usb-tablet,id=tablet,bus=xhci.0,port=1 \</span><br><span class="line">    -device usb-kbd,id=keyboard,bus=xhci.0,port=2 \</span><br><span class="line">    -hda archlinux-xfce4-2023.05.10-loong64.qcow2</span><br></pre></td></tr></table></figure><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="https://github.com/ystyle/ystyle.github.io/assets/4478635/6ccb868a-2fa2-4b8c-8a92-5ca84f4a1e03" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="https://github.com/ystyle/ystyle.github.io/assets/4478635/a71528eb-e84c-44b9-b5b9-4f2343e4699f" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;准备&quot;&gt;&lt;a href=&quot;#准备&quot; class=&quot;headerlink&quot; title=&quot;准备&quot;&gt;&lt;/a&gt;准备&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loongarchlinux.org/pages/download/&quot; target=&quot;_bl
      
    
    </summary>
    
      <category term="系统" scheme="http://ystyle.top/categories/%E7%B3%BB%E7%BB%9F/"/>
    
    
      <category term="loongarch" scheme="http://ystyle.top/tags/loongarch/"/>
    
      <category term="archlinux" scheme="http://ystyle.top/tags/archlinux/"/>
    
      <category term="qemu" scheme="http://ystyle.top/tags/qemu/"/>
    
  </entry>
  
  <entry>
    <title>在archlinux aur上提交龙芯loongarch的软件包</title>
    <link href="http://ystyle.top/2023/07/19/push-loongarch64-app-to-archlinux-aur/"/>
    <id>http://ystyle.top/2023/07/19/push-loongarch64-app-to-archlinux-aur/</id>
    <published>2023-07-19T06:46:26.000Z</published>
    <updated>2023-07-19T06:46:26.000Z</updated>
    
    <content type="html"><![CDATA[<figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="https://github.com/ystyle/ystyle.github.io/assets/4478635/1813826c-da90-426f-9d19-e9a459f3f262" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure><blockquote><p>发现安装好龙芯后, laur软件仓库就自带了yay和paru, 可以直接使用pacman安装. 我有一个软件kaf-cli是go写的可以直接编译到龙芯上.本文记录一下PKGBUILD的写法</p></blockquote><h3 id="PKGBUILD脚本"><a href="#PKGBUILD脚本" class="headerlink" title="PKGBUILD脚本"></a>PKGBUILD脚本</h3><p>脚本基本上和x86上的没什么区别, 只需要</p><ul><li>在<code>arch</code>字段上添加<code>loong64</code>构架</li><li>添加<code>source_loong64</code>软件安装包的源</li><li>添加<code>sha512sums_loong64</code>校验值, 还可以是<code>md5sum_loong64</code>, <code>sha1sums_loong64</code><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"># Maintainer: YSTYLE &lt;lxy5266@live.com&gt;</span><br><span class="line"></span><br><span class="line">pkgname=kaf-cli</span><br><span class="line">pkgver=v1.3.5</span><br><span class="line">pkgrel=2</span><br><span class="line">epoch=</span><br><span class="line">pkgdesc=&quot;把txt文本转成epub与mobi电子书的命令行工具&quot;</span><br><span class="line">arch=(&apos;x86_64&apos; &apos;aarch64&apos; &apos;loong64&apos;)</span><br><span class="line">url=&quot;https://github.com/ystyle/kaf-cli&quot;</span><br><span class="line">license=(&apos;MulanPSL&apos;)</span><br><span class="line">optdepends=(&apos;kindlegen: 在x86_64上用于生成标准的mobi格式&apos;)</span><br><span class="line">source_x86_64=(&quot;https://github.com/ystyle/TmdTextEpub/releases/download/$pkgver/kaf-cli_$&#123;pkgver&#125;_linux_amd64.zip&quot;)</span><br><span class="line">source_aarch64=(&quot;https://github.com/ystyle/TmdTextEpub/releases/download/$pkgver/kaf-cli_$&#123;pkgver&#125;_linux_arm64.zip&quot;)</span><br><span class="line">source_loong64=(&quot;https://github.com/ystyle/TmdTextEpub/releases/download/$pkgver/kaf-cli_$&#123;pkgver&#125;_linux_loong64.zip&quot;)</span><br><span class="line">sha512sums_x86_64=(&apos;29d3f3e0138f2348024d8a3e2a7a19dfe00b0098e9247c2ea364f3e4ab992575fc68bbbf56258be341c335b94e989ecbe37c0c32419b61ee2d45034f5c5e00de&apos;)</span><br><span class="line">sha512sums_aarch64=(&apos;72d2519dec242be92869d0d2eb7022d836147624ff79ba797ff287eb0444eb3dd33e910c01422e1448d486955dbbea0fbc2166e942213e1be03038993945e28f&apos;)</span><br><span class="line">sha512sums_loong64=(&apos;c6af9aeb904f934c0fbee06dda83fed02a22c0ec41cccd1b685cbe5e232b5dd66ad5888a91ab2aadeef7007870c94a063a4537a3e32f150d4ea12453cb3f1b54&apos;)</span><br><span class="line"></span><br><span class="line">package() &#123;</span><br><span class="line">    install -Dm755 kaf-cli &quot;$pkgdir/usr/bin/kaf-cli&quot;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ul><p>然后生成安装包清单信息<br><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">makepkg --printsrcinfo &gt; .SRCINFO</span><br></pre></td></tr></table></figure></p><p>测试生成安装包<br><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">makepkg -f</span><br></pre></td></tr></table></figure></p><p>直接安装软件<br><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">makepkg -si</span><br></pre></td></tr></table></figure></p><p>没问题直接用git推送到aur上就可以了</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;figure class=&quot;image-bubble&quot;&gt;
                &lt;div class=&quot;img-lightbox&quot;&gt;
                    &lt;div class=&quot;overlay&quot;&gt;&lt;/div&gt;
                   
      
    
    </summary>
    
      <category term="系统" scheme="http://ystyle.top/categories/%E7%B3%BB%E7%BB%9F/"/>
    
    
      <category term="loongarch" scheme="http://ystyle.top/tags/loongarch/"/>
    
      <category term="archlinux" scheme="http://ystyle.top/tags/archlinux/"/>
    
      <category term="龙芯" scheme="http://ystyle.top/tags/%E9%BE%99%E8%8A%AF/"/>
    
  </entry>
  
  <entry>
    <title>k3s云上master+内网agent的部署方式</title>
    <link href="http://ystyle.top/2023/03/11/k3s-master-in-cloud-agent-in-local-intranet/"/>
    <id>http://ystyle.top/2023/03/11/k3s-master-in-cloud-agent-in-local-intranet/</id>
    <published>2023-03-11T13:02:26.000Z</published>
    <updated>2023-03-11T13:02:26.000Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>公网master和内网agent使用<code>wireguard-native</code>通信， 只要在所有节点上安装了<code>wireguard</code>模块，k3s会自动处理所有通信流量</p></blockquote><h3 id="准备"><a href="#准备" class="headerlink" title="准备"></a>准备</h3><ul><li>在云端master开放<ul><li><code>tcp</code> <code>6443</code> 端口，</li><li><code>udp</code> <code>51820</code> 端口</li></ul></li><li>先在所有机器上安装<code>wireguard-native</code>， <a href="https://www.wireguard.com/install/" target="_blank" rel="noopener">点击查看安装命令</a></li><li>如果内网有防火墙，需要开放master公网ip的<code>6443</code>和<code>51820</code>端口</li></ul><h3 id="在云上安装master"><a href="#在云上安装master" class="headerlink" title="在云上安装master"></a>在云上安装master</h3><blockquote><p>需要替换下面的master_public_ip为master公网ip, 能正常起来一般就没问题了</p></blockquote><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">export INSTALL_KAS_EXEC="--node-external-ip=master_public_ip --flannel-backend=wireguard-native --flannel-external-ip"</span><br><span class="line">curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -</span><br></pre></td></tr></table></figure><blockquote><p>INSTALL_KAS_EXEC的参数是最少的开启<code>wireguard-native</code>功能的参数</p></blockquote><blockquote><p>在msater上执行<code>cat /var/lib/rancher/k3s/server/node-token</code>获取token, 等下子节点需要用</p></blockquote><h3 id="在内网安装agent"><a href="#在内网安装agent" class="headerlink" title="在内网安装agent"></a>在内网安装agent</h3><blockquote><p>我是在树苺派上安装的。<br>下面的token需要换成上一步获取的， 然后把x.x.x.x换成上面的<code>master_public_ip</code>的master公网ip</p></blockquote><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">export TOKEN=K1004a306bd3e78de0bfb4e9a485659e847dd16be3192b5b16407f53f991dc7d7f7::server:58dcf4e6e4fd7c6023976c331d1xxxxxx</span><br><span class="line">curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_URL=https://x.x.x.x:6443 K3S_TOKEN=$&#123;TOKEN&#125; sh -s - --docker --node-external-ip=x.x.x.x</span><br></pre></td></tr></table></figure><blockquote><p>只需要添加<code>--node-external-ip</code>参数就能启用<code>wireguard-native</code>功能了 。 如果没加这参数，是普通的节点，公网master和内网agent就不能正常通信</p></blockquote><h3 id="验证方法"><a href="#验证方法" class="headerlink" title="验证方法"></a>验证方法</h3><ol><li><p>先查看节点是否正常，不需要重启master或agent的服务，如果重启后才看到的话，可能没安装成功</p> <figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"> $ kubelct get node</span><br><span class="line">NAME                      STATUS   ROLES                  AGE    VERSION</span><br><span class="line">ubuntu-20.04   Ready    control-plane,master   14d    v1.25.6+k3s1</span><br><span class="line">archlinux-rpi             Ready    &lt;none&gt;                 156m   v1.25.6+k3s1</span><br></pre></td></tr></table></figure></li><li><p>用nodeSelector分别在master和内网机器上部署nginx的deploy， 再分别创建对应的service</p></li><li>再在其中一个deploy的pod里执行curl 另一个deploy的service名称，如果能请求到nginx默认界面，说明是通的</li></ol>]]></content>
    
    <summary type="html">
    
      
      
        &lt;blockquote&gt;
&lt;p&gt;公网master和内网agent使用&lt;code&gt;wireguard-native&lt;/code&gt;通信， 只要在所有节点上安装了&lt;code&gt;wireguard&lt;/code&gt;模块，k3s会自动处理所有通信流量&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 
      
    
    </summary>
    
      <category term="运维" scheme="http://ystyle.top/categories/%E8%BF%90%E7%BB%B4/"/>
    
    
      <category term="k3s" scheme="http://ystyle.top/tags/k3s/"/>
    
      <category term="kubernetes" scheme="http://ystyle.top/tags/kubernetes/"/>
    
      <category term="wireguard-native" scheme="http://ystyle.top/tags/wireguard-native/"/>
    
      <category term="wireguard" scheme="http://ystyle.top/tags/wireguard/"/>
    
  </entry>
  
  <entry>
    <title>阿里云网盘映射本地硬盘</title>
    <link href="http://ystyle.top/2022/01/01/aliyundrive-webdav/"/>
    <id>http://ystyle.top/2022/01/01/aliyundrive-webdav/</id>
    <published>2022-01-01T14:46:26.000Z</published>
    <updated>2022-01-01T14:46:26.000Z</updated>
    
    <content type="html"><![CDATA[<h3 id="下载aliyundrive-webdav"><a href="#下载aliyundrive-webdav" class="headerlink" title="下载aliyundrive-webdav"></a>下载aliyundrive-webdav</h3><ul><li>下载地址: <a href="https://github.com/messense/aliyundrive-webdav/releases/latest" target="_blank" rel="noopener">https://github.com/messense/aliyundrive-webdav/releases/latest</a></li><li>解压并放在一个目录里<br><img src="https://dll.ystyle.top/images/2022-01/explorer_2022-01-01_23-16-55.png" alt=""></li></ul><h3 id="准备脚本"><a href="#准备脚本" class="headerlink" title="准备脚本"></a>准备脚本</h3><blockquote><p>把以下内容存为run.ps1</p></blockquote><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$env:REFRESH_TOKEN</span>=<span class="string">"484b469b3ef74dcaba5cf21aeadae2ca"</span></span><br><span class="line"><span class="variable">$env:WEBDAV_AUTH_USER</span>=<span class="string">"admin"</span></span><br><span class="line"><span class="variable">$env:WEBDAV_AUTH_PASSWORD</span>=<span class="string">"123456"</span></span><br><span class="line"><span class="built_in">Start-Process</span> -FilePath aliyundrive-webdav.exe -ArgumentList (<span class="string">"--port=8080"</span>) -Wait -WindowStyle Hidden</span><br></pre></td></tr></table></figure><p>脚本配置说明:</p><ul><li><code>$env:REFRESH_TOKEN</code>: 为阿里云网盘登陆后的token, 必需改为自己的<ul><li><a href="https://github.com/messense/aliyundrive-webdav#%E8%8E%B7%E5%8F%96-refresh_token" target="_blank" rel="noopener">获取阿里云网盘REFRESH_TOKEN的方法</a></li></ul></li><li><code>$env:WEBDAV_AUTH_USER</code>： webdav用户名</li><li><code>$env:WEBDAV_AUTH_PASSWORD</code>: webdav密码</li><li><p><code>--port=8080</code> 为webdav的访问端口，被占用时可以换成其它的</p><p><img src="https://dll.ystyle.top/images/2022-01/kate_2022-01-01_23-18-47.png" alt=""></p></li></ul><h3 id="设计开机启动"><a href="#设计开机启动" class="headerlink" title="设计开机启动"></a>设计开机启动</h3><ul><li><code>win + s</code>搜索<code>任务计划程序</code>打开</li><li>在打开界面选择<code>任务计划程序库</code></li><li><p>在右边点创建基本任务，输入名字: <code>aliyundrive-webdav</code> (名字可以随意写)<br><img src="https://dll.ystyle.top/images/2022-01/mmc_2022-01-01_23-12-57.png" alt=""></p></li><li><p>下一步选择: 计算机启动时<br><img src="https://dll.ystyle.top/images/2022-01/mmc_2022-01-01_23-13-35.png" alt=""></p></li><li><p>下一步选择: 启动程序</p><ul><li>下一步： 在【程序或者脚本】写: <code>powershell.exe</code></li><li>在【添加参数】填写: <code>-WindowStyle Hidden -file run.ps1</code></li><li>在【起始于】填写：存放<code>run.ps1</code>和 <code>aliyundrive-webdav</code>的目录<br><img src="https://dll.ystyle.top/images/2022-01/mmc_2022-01-01_23-13-52.png" alt=""></li></ul><p><img src="https://dll.ystyle.top/images/2022-01/chrome_2022-01-01_23-15-31.png" alt=""></p></li><li><p>下一步点击：完成<br><img src="https://dll.ystyle.top/images/2022-01/mmc_2022-01-01_23-16-10.png" alt=""></p></li><li>启动服务: 在服务列表选择<code>aliyundrive-webdav</code>并在右边选项里选择启动<br><img src="https://dll.ystyle.top/images/2022-01/mmc_2022-01-01_23-20-07.png" alt=""></li></ul><h3 id="映射本地硬盘"><a href="#映射本地硬盘" class="headerlink" title="映射本地硬盘"></a>映射本地硬盘</h3><ul><li>修改注册表，以支持webdav的http协议<br><img src="https://user-images.githubusercontent.com/4478635/166304882-bd9852a9-081d-4420-9818-e6ba864bac27.png" alt="image"></li><li>打开文件管理器，在此电脑右键-选择映射网络驱动器<br><img src="https://dll.ystyle.top/images/2022-01/explorer_2022-01-01_23-22-35.png" alt=""></li><li><p>在弹窗选择一个盘符，并在文件夹填写: <code>http://127.0.0.1:8080</code>, 点完成，在弹窗输入用户名和密码<br><img src="https://dll.ystyle.top/images/2022-01/explorer_2022-01-01_23-23-39.png" alt=""></p><p><img src="https://dll.ystyle.top/images/2022-01/chrome_2022-01-01_23-25-44.png" alt=""></p><p><img src="https://dll.ystyle.top/images/2022-01/explorer_2022-01-01_23-25-13.png" alt=""></p></li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;下载aliyundrive-webdav&quot;&gt;&lt;a href=&quot;#下载aliyundrive-webdav&quot; class=&quot;headerlink&quot; title=&quot;下载aliyundrive-webdav&quot;&gt;&lt;/a&gt;下载aliyundrive-webdav&lt;/h3&gt;&lt;
      
    
    </summary>
    
      <category term="软件" scheme="http://ystyle.top/categories/%E8%BD%AF%E4%BB%B6/"/>
    
    
      <category term="阿里云网盘" scheme="http://ystyle.top/tags/%E9%98%BF%E9%87%8C%E4%BA%91%E7%BD%91%E7%9B%98/"/>
    
      <category term="webdav" scheme="http://ystyle.top/tags/webdav/"/>
    
  </entry>
  
  <entry>
    <title>go mod 拉取 gogs 私有仓库</title>
    <link href="http://ystyle.top/2021/06/22/go-mod-gogs-private/"/>
    <id>http://ystyle.top/2021/06/22/go-mod-gogs-private/</id>
    <published>2021-06-22T02:46:26.000Z</published>
    <updated>2021-06-22T02:46:26.000Z</updated>
    
    <content type="html"><![CDATA[<h3 id="环境变量设置"><a href="#环境变量设置" class="headerlink" title="环境变量设置"></a>环境变量设置</h3><ol><li>添加环境变量或设置go env<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">export GOPRIVATE=git.hofo.co</span><br><span class="line"># 或者</span><br><span class="line">go env -w GOPRIVATE=git.hofo.co</span><br></pre></td></tr></table></figure></li></ol><h3 id="git设置"><a href="#git设置" class="headerlink" title="git设置"></a>git设置</h3><ol><li><p>在git设置http.extraheader</p><ul><li><code>PRIVATE-TOKEN</code>生成方式:  在点击gogs右上头像-用户设置-授权应用-生成新的token<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git config --global http.extraheader "PRIVATE-TOKEN: 5737d215af7f9a41a2abe98631d312e9e9311d29d"</span><br></pre></td></tr></table></figure></li></ul></li><li><p>在git添加url配置, <code>ystyle:5737d215af7f9a41a2abe98631d312e9e939d29d11</code>是用户名和上一步生成的token</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git config --global url."https://ystyle:5737d215af7f9a41a2abe98631d312e9e939d29d11@git.hofo.co".insteadOf "https://git.hofo.co"</span><br></pre></td></tr></table></figure></li></ol>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;环境变量设置&quot;&gt;&lt;a href=&quot;#环境变量设置&quot; class=&quot;headerlink&quot; title=&quot;环境变量设置&quot;&gt;&lt;/a&gt;环境变量设置&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;添加环境变量或设置go env&lt;figure class=&quot;highlight plain&quot;&gt;&lt;
      
    
    </summary>
    
      <category term="软件" scheme="http://ystyle.top/categories/%E8%BD%AF%E4%BB%B6/"/>
    
    
      <category term="git" scheme="http://ystyle.top/tags/git/"/>
    
      <category term="gogs" scheme="http://ystyle.top/tags/gogs/"/>
    
      <category term="go" scheme="http://ystyle.top/tags/go/"/>
    
  </entry>
  
  <entry>
    <title>开源鸿蒙网络和hdc连接方法</title>
    <link href="http://ystyle.top/2021/06/06/openharmonyos-hdc-and-network/"/>
    <id>http://ystyle.top/2021/06/06/openharmonyos-hdc-and-network/</id>
    <published>2021-06-06T10:10:13.000Z</published>
    <updated>2026-04-03T16:16:50.667Z</updated>
    
    <content type="html"><![CDATA[<h3 id="hdc下载"><a href="#hdc下载" class="headerlink" title="hdc下载"></a>hdc下载</h3><ul><li>如果下载了源码，可以在源码目录找到: developtools/hdc_standard/prebuilt/windows/hdc_std.exe</li><li>远程仓库地址： <a href="https://gitee.com/openharmony/developtools_hdc_standard" target="_blank" rel="noopener">https://gitee.com/openharmony/developtools_hdc_standard</a></li><li>hdc使用手册: <a href="https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/subsystems/hdc_std-%E4%BD%BF%E7%94%A8%E6%8C%87%E5%AF%BC.md" target="_blank" rel="noopener">https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/subsystems/hdc_std-%E4%BD%BF%E7%94%A8%E6%8C%87%E5%AF%BC.md</a></li></ul><h3 id="通过usb连接鸿蒙"><a href="#通过usb连接鸿蒙" class="headerlink" title="通过usb连接鸿蒙"></a>通过usb连接鸿蒙</h3><ul><li>通过hi3516背面的type-c口连接电脑, 目前只有这口能传数据， 底下的口不行<ul><li>如果成功，可以在电脑 <code>设备管理-用串行总线设备</code>下面看到<code>HDC Device</code></li></ul></li><li>打开终端， 输入<code>hdc list targets</code>列出设备</li></ul><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="https://dll.ystyle.top/images/2021-06/mmc_2021-06-07_19-52-37.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="https://dll.ystyle.top/images/2021-06/WindowsTerminal_2021-06-07_19-53-25.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure><h3 id="鸿蒙连接本地有线网络"><a href="#鸿蒙连接本地有线网络" class="headerlink" title="鸿蒙连接本地有线网络"></a>鸿蒙连接本地有线网络</h3><ul><li>插入有线网线</li><li>在hitool串口中连接上hi3516后执行<ul><li><code>/system/xbin/su</code> 获取root权限</li><li><code>ifconfig eth0 192.168.3.197 netmask 255.255.255.0</code> 网络IP要换成自己的网段</li></ul></li></ul><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="https://dll.ystyle.top/images/2021-06/HiTool_2021-06-06_18-29-05.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure><h3 id="用hdc通过tcp连接鸿蒙"><a href="#用hdc通过tcp连接鸿蒙" class="headerlink" title="用hdc通过tcp连接鸿蒙"></a>用hdc通过tcp连接鸿蒙</h3><ul><li>在连接hitool串口后执行<code>hdcd -t</code></li><li>在自己电脑主机上打开终端执行 <code>hdc tconn 192.168.3.197:10178</code> 显示 <code>Connect OK</code> 就表示连接上了<ul><li>执行<code>hdc list targets -v</code> 显示设备</li><li>执行<code>hdc -t 192.168.3.197:10178 shell</code> 连接鸿蒙系统的shell， 注： tcp连接时要用-t指定连接的ip:端口</li><li>执行<code>hdc -t 192.168.3.197:10178 file send localfile remotefile</code> 发送文件</li><li>其实命令请查看使用手册</li></ul></li></ul><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="https://dll.ystyle.top/images/2021-06/HiTool_2021-06-06_18-19-47.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="https://dll.ystyle.top/images/2021-06/WindowsTerminal_2021-06-06_18-30-29.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;hdc下载&quot;&gt;&lt;a href=&quot;#hdc下载&quot; class=&quot;headerlink&quot; title=&quot;hdc下载&quot;&gt;&lt;/a&gt;hdc下载&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;如果下载了源码，可以在源码目录找到: developtools/hdc_standard/prebuil
      
    
    </summary>
    
      <category term="系统" scheme="http://ystyle.top/categories/%E7%B3%BB%E7%BB%9F/"/>
    
    
      <category term="鸿蒙" scheme="http://ystyle.top/tags/%E9%B8%BF%E8%92%99/"/>
    
  </entry>
  
  <entry>
    <title>鸿蒙开发板HI3516用命令行连接wifi</title>
    <link href="http://ystyle.top/2020/12/18/hi3516-connect-wifi/"/>
    <id>http://ystyle.top/2020/12/18/hi3516-connect-wifi/</id>
    <published>2020-12-18T12:11:48.000Z</published>
    <updated>2020-12-18T12:11:48.000Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>鸿蒙的HI3516编译里已经有wpa_supplicant相关工程了，但编译时没有包进去, 所以只要修改配置文件后就能编译出来了</p></blockquote><p>主要修改文件: <a href="https://gitee.com/openharmony/applications_sample_camera/blob/master/communication/BUILD.gn#L17-18" target="_blank" rel="noopener">communication/BUILD.gn#L17-18</a> 行之间添加， 以下第2行<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">features = [</span><br><span class="line">   &quot;wpa_supplicant:wpa_sample&quot;,</span><br><span class="line">]</span><br></pre></td></tr></table></figure></p><h3 id="编译过程"><a href="#编译过程" class="headerlink" title="编译过程"></a>编译过程</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">docker run --rm -ti -e HARDWARE=ipcamera_hi3516dv300 -v $&#123;PWD&#125;/out:/OpenHarmony/out ystyle/open-harmony bash</span><br><span class="line">sed -i '17a\ \ \ \ \ \ "wpa_supplicant:wpa_sample",' applications/sample/camera/communication/BUILD.gn</span><br><span class="line">python build.py $&#123;HARDWARE&#125; -b debug</span><br></pre></td></tr></table></figure><blockquote><p>然后wpa_supplicant在编译目录<code>/out/ipcamera_hi3516dv300/bin/</code>， 把wpa_supplicant复制出来就可以直接使用</p></blockquote><h3 id="使用方法"><a href="#使用方法" class="headerlink" title="使用方法"></a>使用方法</h3><p>先创建配置文件，wpa_supplicant.conf</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">country=GB</span><br><span class="line">ctrl_interface=udp</span><br><span class="line">network=&#123;</span><br><span class="line">    #要连接的SSID</span><br><span class="line">    ssid=&quot;example&quot;</span><br><span class="line">    #如果不需要加密就写key_mgmt=NONE</span><br><span class="line">    #key_mgmt=NONE</span><br><span class="line">    #如果需要加密就写这行密码</span><br><span class="line">    psk=&quot;AA123456&quot;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>把wpa_supplicant和配置文件复制到hi3516， 执行以下命令连接wifi<br><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cd /nfs/wifi</span><br><span class="line">./wpa_supplicant -i wlan0 -c ./wpa_supplicant.conf</span><br></pre></td></tr></table></figure></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;blockquote&gt;
&lt;p&gt;鸿蒙的HI3516编译里已经有wpa_supplicant相关工程了，但编译时没有包进去, 所以只要修改配置文件后就能编译出来了&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;主要修改文件: &lt;a href=&quot;https://gitee.com/ope
      
    
    </summary>
    
      <category term="系统" scheme="http://ystyle.top/categories/%E7%B3%BB%E7%BB%9F/"/>
    
    
      <category term="鸿蒙" scheme="http://ystyle.top/tags/%E9%B8%BF%E8%92%99/"/>
    
      <category term="wifi" scheme="http://ystyle.top/tags/wifi/"/>
    
  </entry>
  
  <entry>
    <title>Quest2 使用Netch激活与无线串流的设置</title>
    <link href="http://ystyle.top/2020/12/05/quest2/"/>
    <id>http://ystyle.top/2020/12/05/quest2/</id>
    <published>2020-12-05T17:30:26.000Z</published>
    <updated>2021-11-05T11:30:26.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Quest2-激活与无线串流的设置"><a href="#Quest2-激活与无线串流的设置" class="headerlink" title="Quest2 激活与无线串流的设置"></a>Quest2 激活与无线串流的设置</h1><h3 id="更新后自带Airlink串流，不需要买virtual-desktop了"><a href="#更新后自带Airlink串流，不需要买virtual-desktop了" class="headerlink" title="更新后自带Airlink串流，不需要买virtual desktop了"></a>更新后自带Airlink串流，不需要买virtual desktop了</h3><h3 id="连网激活"><a href="#连网激活" class="headerlink" title="连网激活"></a>连网激活</h3><blockquote><p>需要可上网，与tcp、udp转发， 激活更新系统时需要udp转发才能正常更新系统, 本方法完美支持，只需要有支持wifi网卡的电脑</p></blockquote><ul><li><a href="https://github.com/NetchX/Netch" target="_blank" rel="noopener">Netch</a>： socket5、ss、vmess(v2ray) 转wifi<ul><li>安装<a href="https://aka.ms/dotnet/5.0/windowsdesktop-runtime-win-x64.exe" target="_blank" rel="noopener"><code>.NET Desktop runtime 5.0 x64</code></a>和<code>Visual C++ 运行库</code></li></ul></li><li>打开Netch, 添你的代理，然后选择<code>ByPass LAN and China</code>， 启动</li><li>在win10开启wifi移动热点</li><li>在网络适配器管理界面，把带tap的网卡，右键属性-切换到分享， 把第一个勾上，下拉选择wifi热点的网卡</li><li>在quest2连接热点，等一会后，联网界面下的确定按钮亮了之后，会进入系统更新</li><li>更新系统后，可以切回wifi+http代理方式玩(wifi连接输入密码，下边点高级，可以填入http代理)<br><img src="https://dll.ystyle.top/images/2020-12/Netch_2020-12-06_16-44-00.png" alt=""><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="https://dll.ystyle.top/images/2020-12/explorer_2020-12-06_16-35-08.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="https://dll.ystyle.top/images/2020-12/chrome_2020-12-06_20-40-12.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure></li></ul><h3 id="Airlink串流"><a href="#Airlink串流" class="headerlink" title="Airlink串流"></a>Airlink串流</h3><ul><li>电脑上安装或升级oculus home到最新版</li><li>登陆帐号后到<code>设置-公测版</code>打开<code>Airlink</code>设置</li><li>更新quest2系统到最新版</li><li>在实验室打开Airlink</li><li>之后在设置-快捷操作-Airlink搜索电脑，连接上后点启动， 就进入电脑版的操作台了。</li></ul><h3 id="开发者模式"><a href="#开发者模式" class="headerlink" title="开发者模式"></a>开发者模式</h3><ul><li><a href="https://dashboard.oculus.com" target="_blank" rel="noopener">注册开发者帐号</a>或进入别人的开发者团队</li><li><a href="https://developer.oculus.com/downloads/package/oculus-adb-drivers" target="_blank" rel="noopener">下载adb驱动</a>, 解压后右键【androidwinusb.inf】选择安装即可。</li><li>安装手机<a href="https://rawapk.com/oculus-apk-download/" target="_blank" rel="noopener">oculus app</a></li><li>用数据线连接quest2和电脑</li><li>在手机oculus app上连接quest2, 并在设置开启开发者模板</li><li>在电脑上安装sidequest， 可以下载一些第三方游戏。<br><img src="https://dll.ystyle.top/images/2020-12/BE9BEC5F78EDD4C97982C8353CFE1D13.jpg" alt=""><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="https://dll.ystyle.top/images/2020-12/27EDA36DBCB42C960E77A19FB20F1557.jpg" alt="" title="">                </div>                <div class="image-caption"></div>            </figure></li></ul><details><br><summary>展开查看 virtual desktop 串流</summary><br><br>### virtual desktop<br>  - 在quest2上购买<code>virtual desktop</code><br>    - <code>virtual desktop</code>必需买，sidequest上的只是个串流用的插件<br>  - 在电脑上安装<code>virtual desktop streamer</code>串流软件， <a href="https://www.vrdesktop.net/" target="_blank" rel="noopener">官方网站</a>直接免费下载<br>  - 用数据线连接电脑<br>  - 安装<a href="https://sidequestvr.com/setup-howto" target="_blank" rel="noopener">sidequest</a>, 用它给quest2安装串流插件<code>virtual desktop vr patch</code><br>  <img src="https://dll.ystyle.top/images/2020-12/SideQuest_2020-12-06_16-41-36.png" alt=""><br><br>### 购买virtual desktop<br>  - 注册paypal<br>  - 绑定支持银联的银行卡(我用的是邮政的储蓄卡，只有银联，没其它标识)<br>  - 在<code>oculus home</code>、<code>oculus网站</code>、或<code>手机oculus app</code>绑定paypal<br>  - 在上述软件中搜索<code>virtual desktop</code>点购买，如果出现执行查询出现错误就<code>更换代理节点</code>(我用美国节点的会出现这个)<br>    - 按汇率，卡里需要<code>137RMB</code><br>    - steam 里的<code>virtual desktop</code>不支持quest2<br><br>### 串流设置<br>  - 连接到与电脑同wifi（激活时用的热点也可以用的）<br>  - 打开电脑上的<code>virtual desktop streamer</code>，并在username填写自己的oculus帐户名<br>  - 在quest2上打开<code>virtual desktop</code>软件<br>  - 这时会显示一个巨大的电脑屏幕， 打开支持<code>steam vr</code>或<code>oculus home</code>的游戏，会自动串流到quest2里<br>    - 这时可以愉快的玩耍了<br><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="https://dll.ystyle.top/images/2020-12/VirtualDesktop.Streamer_2020-12-06_16-38-19.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure><br></details><h3 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h3><ul><li><a href="https://blog.csdn.net/kasaiki/article/details/109145902" target="_blank" rel="noopener">Oculus Quest / Quest2 如何设置 VirtualDesktop 实现无线串流【详细教程】_kasaiki的博客-CSDN博客</a></li><li><a href="http://vr42.com/t/187" target="_blank" rel="noopener">Oculus Quest 国内玩家无障碍使用指南 - VR42</a><ul><li>本文的Netch是此文中方案4的Sstap替代品，sstap已经多年不更新了</li></ul></li><li><a href="https://b23.tv/9rEP0A" target="_blank" rel="noopener">【干货】Oculus quest 2电脑连接串流教程｜有线+无线_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili</a></li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;Quest2-激活与无线串流的设置&quot;&gt;&lt;a href=&quot;#Quest2-激活与无线串流的设置&quot; class=&quot;headerlink&quot; title=&quot;Quest2 激活与无线串流的设置&quot;&gt;&lt;/a&gt;Quest2 激活与无线串流的设置&lt;/h1&gt;&lt;h3 id=&quot;更新后自带
      
    
    </summary>
    
      <category term="软件" scheme="http://ystyle.top/categories/%E8%BD%AF%E4%BB%B6/"/>
    
    
      <category term="quest2" scheme="http://ystyle.top/tags/quest2/"/>
    
      <category term="工具" scheme="http://ystyle.top/tags/%E5%B7%A5%E5%85%B7/"/>
    
  </entry>
  
  <entry>
    <title>移植lua到鸿蒙 - 首个移植成功的编程语言</title>
    <link href="http://ystyle.top/2020/11/07/porting-Lua-to-openharmony/"/>
    <id>http://ystyle.top/2020/11/07/porting-Lua-to-openharmony/</id>
    <published>2020-11-07T15:52:26.000Z</published>
    <updated>2020-11-07T15:52:26.000Z</updated>
    
    <content type="html"><![CDATA[<h3 id="惯例先放hello-world"><a href="#惯例先放hello-world" class="headerlink" title="惯例先放hello world"></a>惯例先放hello world</h3><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="https://dll.ystyle.top/images/2020-11/WindowsTerminal_2020-11-07_23-28-08.png" alt="hello world" title="">                </div>                <div class="image-caption">hello world</div>            </figure><ul><li>本项目地址: <a href="https://gitee.com/ystyle/lua" target="_blank" rel="noopener">https://gitee.com/ystyle/lua</a></li><li><a href="https://gitee.com/ystyle/lua/releases/v5.4.2" target="_blank" rel="noopener">下载二进制文件</a></li></ul><h3 id="准备环境"><a href="#准备环境" class="headerlink" title="准备环境"></a>准备环境</h3><ul><li>安装 docker</li><li>docker pull ystyle/open-harmony</li></ul><p>ps: 本文使用与鸿蒙系统一同编译的方法。 如果自己有本地环境，可以把lua项目放鸿蒙代码目录里(或者使用软接连)</p><h3 id="下载lua官方代码"><a href="#下载lua官方代码" class="headerlink" title="下载lua官方代码"></a>下载lua官方代码</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">mkdir -p ~/code/ohos/</span><br><span class="line">cd ~/code/ohos/</span><br><span class="line">git clone https://github.com/lua/lua.git</span><br></pre></td></tr></table></figure><h3 id="编写BUILD-gn文件"><a href="#编写BUILD-gn文件" class="headerlink" title="编写BUILD.gn文件"></a>编写BUILD.gn文件</h3><blockquote><p>因为要与系统一起编译， 为了方便，直接用替换掉示例的方法，这样就只需要写一个BUILD.gn就好了</p></blockquote><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br></pre></td><td class="code"><pre><span class="line"># Copyright (c) 2020 YSTYLE(lxy5266@live.com)</span><br><span class="line"># Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);</span><br><span class="line"># you may not use this file except in compliance with the License.</span><br><span class="line"># You may obtain a copy of the License at</span><br><span class="line">#</span><br><span class="line">#     http://www.apache.org/licenses/LICENSE-2.0</span><br><span class="line">#</span><br><span class="line"># Unless required by applicable law or agreed to in writing, software</span><br><span class="line"># distributed under the License is distributed on an &quot;AS IS&quot; BASIS,</span><br><span class="line"># WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span><br><span class="line"># See the License for the specific language governing permissions and</span><br><span class="line"># limitations under the License.</span><br><span class="line"></span><br><span class="line">import(&quot;//build/lite/config/component/lite_component.gni&quot;)</span><br><span class="line">import(&quot;//build/lite/ndk/ndk.gni&quot;)</span><br><span class="line"></span><br><span class="line">static_library(&quot;hello_world&quot;) &#123;</span><br><span class="line">    sources = [</span><br><span class="line">        &quot;lapi.c&quot;,</span><br><span class="line">        &quot;lauxlib.c&quot;,</span><br><span class="line">        &quot;lbaselib.c&quot;,</span><br><span class="line">        &quot;lcode.c&quot;,</span><br><span class="line">        &quot;lcorolib.c&quot;,</span><br><span class="line">        &quot;lctype.c&quot;,</span><br><span class="line">        &quot;ldblib.c&quot;,</span><br><span class="line">        &quot;ldebug.c&quot;,</span><br><span class="line">        &quot;ldo.c&quot;,</span><br><span class="line">        &quot;ldump.c&quot;,</span><br><span class="line">        &quot;lfunc.c&quot;,</span><br><span class="line">        &quot;lgc.c&quot;,</span><br><span class="line">        &quot;linit.c&quot;,</span><br><span class="line">        &quot;liolib.c&quot;,</span><br><span class="line">        &quot;llex.c&quot;,</span><br><span class="line">        &quot;lmathlib.c&quot;,</span><br><span class="line">        &quot;lmem.c&quot;,</span><br><span class="line">        &quot;loadlib.c&quot;,</span><br><span class="line">        &quot;lobject.c&quot;,</span><br><span class="line">        &quot;lopcodes.c&quot;,</span><br><span class="line">        &quot;loslib.c&quot;,</span><br><span class="line">        &quot;lparser.c&quot;,</span><br><span class="line">        &quot;lstate.c&quot;,</span><br><span class="line">        &quot;lstring.c&quot;,</span><br><span class="line">        &quot;lstrlib.c&quot;,</span><br><span class="line">        &quot;ltable.c&quot;,</span><br><span class="line">        &quot;ltablib.c&quot;,</span><br><span class="line">        &quot;ltests.c&quot;,</span><br><span class="line">        &quot;ltm.c&quot;,</span><br><span class="line">        &quot;lua.c&quot;,</span><br><span class="line">        &quot;lundump.c&quot;,</span><br><span class="line">        &quot;lutf8lib.c&quot;,</span><br><span class="line">        &quot;lvm.c&quot;,</span><br><span class="line">        &quot;lzio.c&quot;</span><br><span class="line">    ]</span><br><span class="line"></span><br><span class="line">    include_dirs = [</span><br><span class="line">        &quot;include&quot;,</span><br><span class="line">    ]</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">lite_component(&quot;camera_app&quot;) &#123;</span><br><span class="line">    target_type = &quot;executable&quot;</span><br><span class="line"></span><br><span class="line">    features = [</span><br><span class="line">        &quot;:hello_world&quot;,</span><br><span class="line">    ]</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">ndk_lib(&quot;app_sample&quot;) &#123;</span><br><span class="line">    deps = [</span><br><span class="line">        &quot;:hello_world&quot;</span><br><span class="line">    ]</span><br><span class="line">    head_files = [</span><br><span class="line">        &quot;include&quot;</span><br><span class="line">    ]</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><blockquote><p>static_library里的source参照lua/makefile</p></blockquote><h3 id="编译脚本"><a href="#编译脚本" class="headerlink" title="编译脚本"></a>编译脚本</h3><p>创建编译脚本<code>build-ohos.sh</code>文件</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">cd ~/code/ohos/lua</span><br><span class="line">touch build-ohos.sh</span><br><span class="line">chmod +x build-ohos.sh</span><br></pre></td></tr></table></figure><p>文件内容如下<br><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">set -e</span><br><span class="line">rm -rf ./out ./bin</span><br><span class="line">docker run --rm -ti \</span><br><span class="line">  -e HARDWARE=ipcamera_hi3516dv300 \</span><br><span class="line">  -v $&#123;PWD&#125;/out:/OpenHarmony/out \</span><br><span class="line">  -v $&#123;PWD&#125;:/OpenHarmony/applications/sample/camera/app \</span><br><span class="line">  ystyle/open-harmony</span><br><span class="line">mkdir -p ./bin</span><br><span class="line">cp ./out/ipcamera_hi3516dv300/bin/camera_app ./bin/lua</span><br><span class="line">tar -zcf lua-5.4.2-ohos.tar.gz ./bin</span><br><span class="line">echo 'build success!'</span><br></pre></td></tr></table></figure></p><p>与鸿蒙一起编译，这里使用我之前的<a href="https://ystyle.top/2020/09/10/compile-openharmony-indokcer/">docker镜像</a><br><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">cd ~/code/ohos/lua</span><br><span class="line">./build-ohos.sh</span><br><span class="line"><span class="meta">#</span><span class="bash"> 看到 ohos ipcamera_hi3516dv300 build success! build success! 就编译成功了。</span></span><br></pre></td></tr></table></figure></p><blockquote><p>编译后软件在鸿蒙的 ./out/ipcamera_hi3516dv300/bin/camera_app<br>脚本会把lua单独打包出来<br>单独的lua可执行文件在bin目录 </p></blockquote><h3 id="演示"><a href="#演示" class="headerlink" title="演示"></a>演示</h3><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="https://dll.ystyle.top/images/2020-11/WindowsTerminal_2020-11-07_23-46-45.png" alt="io操作" title="">                </div>                <div class="image-caption">io操作</div>            </figure><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="https://dll.ystyle.top/images/2020-11/WindowsTerminal_2020-11-07_23-48-58.png" alt="官方测试用例1" title="">                </div>                <div class="image-caption">官方测试用例1</div>            </figure><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="https://dll.ystyle.top/images/2020-11/WindowsTerminal_2020-11-07_23-50-10.png" alt="官方测试用例2" title="">                </div>                <div class="image-caption">官方测试用例2</div>            </figure><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="https://dll.ystyle.top/images/2020-11/WindowsTerminal_2020-11-07_23-51-01.png" alt="官方测试用例3" title="">                </div>                <div class="image-caption">官方测试用例3</div>            </figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;惯例先放hello-world&quot;&gt;&lt;a href=&quot;#惯例先放hello-world&quot; class=&quot;headerlink&quot; title=&quot;惯例先放hello world&quot;&gt;&lt;/a&gt;惯例先放hello world&lt;/h3&gt;&lt;figure class=&quot;image-
      
    
    </summary>
    
      <category term="软件" scheme="http://ystyle.top/categories/%E8%BD%AF%E4%BB%B6/"/>
    
    
      <category term="鸿蒙" scheme="http://ystyle.top/tags/%E9%B8%BF%E8%92%99/"/>
    
      <category term="编程语言" scheme="http://ystyle.top/tags/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80/"/>
    
      <category term="lua" scheme="http://ystyle.top/tags/lua/"/>
    
  </entry>
  
  <entry>
    <title>harl-鸿蒙应用开发实机热更新工具</title>
    <link href="http://ystyle.top/2020/10/24/harl/"/>
    <id>http://ystyle.top/2020/10/24/harl/</id>
    <published>2020-10-24T17:30:26.000Z</published>
    <updated>2020-10-24T17:30:26.000Z</updated>
    
    <content type="html"><![CDATA[<p><a href="https://gitee.com/ystyle/harl/" target="_blank" rel="noopener">鸿蒙应用开发实机热更新工具</a></p><h3 id="依赖"><a href="#依赖" class="headerlink" title="依赖"></a>依赖</h3><ul><li>debug 版本的hi3516镜像(release版本不支持shell)</li><li>nfs v3<ul><li><a href="https://openharmony.gitee.com/openharmony/docs/blob/master/kernel/NFS.md" target="_blank" rel="noopener">配置过程</a></li><li><a href="https://openharmony.gitee.com/openharmony/docs/issues/I1YIBO" target="_blank" rel="noopener">配置过程可能遇到的问题</a></li></ul></li><li>serial(串口)</li><li>dev tools (可以从鸿蒙编译目录<code>/out/ipcamera_hi3516dv300/dev_tools/bin</code>复制到nfs挂载目录)<ul><li>aa (管理APP启动，关闭)</li><li>bm (安装卸载APP)</li></ul></li></ul><h3 id="USAGE"><a href="#USAGE" class="headerlink" title="USAGE"></a>USAGE</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">➜ harl.exe</span><br><span class="line">NAME:</span><br><span class="line">   harl - Open Harmony OS Dev tools</span><br><span class="line"></span><br><span class="line">USAGE:</span><br><span class="line">   harl.exe [global options] command [command options] [arguments...]</span><br><span class="line"></span><br><span class="line">VERSION:</span><br><span class="line">   v0.1.2</span><br><span class="line"></span><br><span class="line">COMMANDS:</span><br><span class="line">   init, i    init .harm.yml</span><br><span class="line">   watch, w   watch and reload app</span><br><span class="line">   install    install hap</span><br><span class="line">   uninstall  uninstall hap</span><br><span class="line">   shell      open a shell</span><br><span class="line">   reboot     reboot</span><br><span class="line">   help, h    Shows a list of commands or help for one command</span><br><span class="line"></span><br><span class="line">GLOBAL OPTIONS:</span><br><span class="line">   --help, -h     show help (default: false)</span><br><span class="line">   --version, -v  print the version (default: false)</span><br></pre></td></tr></table></figure><ul><li><a href="https://gitee.com/ystyle/harl/releases" target="_blank" rel="noopener">下载应用</a></li><li><code>cd /your-project-dir</code> 切换到项目目录</li><li><code>harl init</code> 初始化配置文件</li><li><code>harl w</code> 监听项目文件修改<ul><li>监听时支持输入命令, 若看不到提示符请在调试日志暂停打印时按回车</li><li>可以用<code>^run [command name]</code>的方式执行command里定义的脚本<ul><li>如执行示例配置文件的setup脚本， <code>^run setup</code></li></ul></li></ul></li><li>目前命令只支持在项目目录执行</li></ul><h3 id="配置文件"><a href="#配置文件" class="headerlink" title="配置文件"></a>配置文件</h3><blockquote><p>.harl.yaml<br><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">watch:</span> <span class="comment"># 监听文件修改并自动编译、安装的参数</span></span><br><span class="line"><span class="attr">  excludes:</span> <span class="comment"># 排除的文件</span></span><br><span class="line"><span class="bullet">  -</span> <span class="string">.gradle</span></span><br><span class="line"><span class="bullet">  -</span> <span class="string">.idea</span></span><br><span class="line"><span class="bullet">  -</span> <span class="string">gradle</span></span><br><span class="line"><span class="bullet">  -</span> <span class="string">entry/build</span></span><br><span class="line"><span class="bullet">  -</span> <span class="string">entry/node_modules</span></span><br><span class="line"><span class="attr">  includes:</span> <span class="comment"># 监听的文件类型</span></span><br><span class="line"><span class="bullet">  -</span> <span class="string">.css</span></span><br><span class="line"><span class="bullet">  -</span> <span class="string">.hml</span></span><br><span class="line"><span class="bullet">  -</span> <span class="string">.js</span></span><br><span class="line"><span class="bullet">  -</span> <span class="string">.hap</span></span><br><span class="line"><span class="bullet">  -</span> <span class="string">.json</span></span><br><span class="line"><span class="attr">  delay:</span> <span class="number">100</span> <span class="comment"># 监听频率，单位ms</span></span><br><span class="line"><span class="attr">nfs:</span> <span class="comment"># nfs 配置</span></span><br><span class="line"><span class="attr">  ldir:</span> <span class="attr">H:/bin</span> <span class="comment"># 本地nfs挂载目录 </span></span><br><span class="line"><span class="attr">  rdir:</span> <span class="string">/nfs</span> <span class="comment"># 远程nfs(开发板)挂载目录</span></span><br><span class="line"><span class="attr">shell:</span> <span class="comment"># 开发板连接参数</span></span><br><span class="line"><span class="attr">  com:</span> <span class="string">COM5</span> <span class="comment"># 串口号</span></span><br><span class="line"><span class="attr">command:</span> <span class="comment"># 定义常用命令, 在shell或watch里可执行</span></span><br><span class="line"><span class="attr">  setup:</span> <span class="comment"># 命令执行方式: ^run setup</span></span><br><span class="line"><span class="bullet">    -</span> <span class="string">dhclient</span> <span class="string">eth0</span> <span class="comment"># 命令一行一个, 顺序执行错误不会中断</span></span><br><span class="line"><span class="bullet">    -</span> <span class="string">mkdir</span> <span class="string">/nfs</span></span><br><span class="line"><span class="bullet">    -</span> <span class="string">mount</span> <span class="number">192.168</span><span class="number">.3</span><span class="number">.12</span><span class="string">:/nfsshare</span> <span class="string">/nfs</span> <span class="string">nfs</span></span><br><span class="line"><span class="attr">  kill:</span> <span class="comment"># 关闭应用</span></span><br><span class="line"><span class="bullet">    -</span> <span class="string">cd</span> <span class="string">/nfs</span></span><br><span class="line"><span class="bullet">    -</span> <span class="string">./aa</span> <span class="string">terminate</span> <span class="bullet">-p</span> <span class="string">top.ystyle.ohos.js.testapp</span></span><br><span class="line"><span class="attr">  start:</span> <span class="comment"># 启动应用</span></span><br><span class="line"><span class="bullet">    -</span> <span class="string">cd</span> <span class="string">/nfs</span></span><br><span class="line"><span class="bullet">    -</span> <span class="string">./aa</span> <span class="string">start</span> <span class="bullet">-p</span> <span class="string">top.ystyle.ohos.js.testapp</span> <span class="bullet">-n</span> <span class="string">default</span></span><br></pre></td></tr></table></figure></p></blockquote><h3 id="支持情况"><a href="#支持情况" class="headerlink" title="支持情况"></a>支持情况</h3><ul><li>只支持windows</li><li>只测试过liteWearable项目改的smartVision</li><li>只在hi3516d上测试过</li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;&lt;a href=&quot;https://gitee.com/ystyle/harl/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;鸿蒙应用开发实机热更新工具&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;依赖&quot;&gt;&lt;a href=&quot;#依赖&quot; class=&quot;headerlink
      
    
    </summary>
    
      <category term="软件" scheme="http://ystyle.top/categories/%E8%BD%AF%E4%BB%B6/"/>
    
    
      <category term="工具" scheme="http://ystyle.top/tags/%E5%B7%A5%E5%85%B7/"/>
    
      <category term="鸿蒙" scheme="http://ystyle.top/tags/%E9%B8%BF%E8%92%99/"/>
    
  </entry>
  
</feed>
