<?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>2025-12-28T02:30:00.000Z</updated>
  <id>http://ystyle.top/</id>
  
  <author>
    <name>YSTYLE</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <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><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><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><br><span class="line">chmod +x binary-sign-tool-signed</span><br><span class="line"><span class="meta">#</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><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>!/bin/sh</span><br><span class="line"></span><br><span class="line"><span class="meta">#</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> git</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>!/usr/bin/env bash</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>2025-12-28T02:56:31.445Z</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> 看到 ohos ipcamera_hi3516dv300 build success! build success! 就编译成功了。</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>
  
  <entry>
    <title>使用Docker快速上手鸿蒙</title>
    <link href="http://ystyle.top/2020/09/10/compile-openharmony-indokcer/"/>
    <id>http://ystyle.top/2020/09/10/compile-openharmony-indokcer/</id>
    <published>2020-09-10T17:00:26.000Z</published>
    <updated>2020-12-25T08:40:26.000Z</updated>
    
    <content type="html"><![CDATA[<h3 id="准备"><a href="#准备" class="headerlink" title="准备"></a>准备</h3><ul><li>在机器上安装好Docker</li></ul><h3 id="编译鸿蒙系统镜像"><a href="#编译鸿蒙系统镜像" class="headerlink" title="编译鸿蒙系统镜像"></a>编译鸿蒙系统镜像</h3><ul><li>打开终端执行以下命令</li></ul><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 ~/OpenHarmony</span><br><span class="line">cd ~/OpenHarmony</span><br><span class="line">docker run --rm -ti -v $&#123;PWD&#125;/out:/OpenHarmony/out ystyle/open-harmony</span><br></pre></td></tr></table></figure><ul><li>编译成功后各镜像在out目录下面, 默认编译的是<code>Hi3861</code>开发板的系统镜像, 可自行烧录到固定测试</li><li>如果要编译其它板子可以设置dokcer镜像的环境变量<code>HARDWARE</code> 目前支持: <code>wifiiot</code>、<code>ipcamera_hi3516dv300</code>、<code>ipcamera_hi3518ev300</code></li></ul><h3 id="更新代码并编译"><a href="#更新代码并编译" class="headerlink" title="更新代码并编译"></a>更新代码并编译</h3><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">mkdir ~/OpenHarmony</span><br><span class="line">cd ~/OpenHarmony</span><br><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">repo sync -c</span><br><span class="line">python build.py $&#123;HARDWARE&#125; -b debug</span><br></pre></td></tr></table></figure><h3 id="编写应用程序"><a href="#编写应用程序" class="headerlink" title="编写应用程序"></a>编写应用程序</h3><ul><li>示例在这<a href="https://openharmony.gitee.com/openharmony/docs/blob/master/quick-start/Hi3861%E5%BC%80%E5%8F%91%E6%9D%BF%E7%AC%AC%E4%BA%8C%E4%B8%AA%E7%A4%BA%E4%BE%8B%E7%A8%8B%E5%BA%8F.md" target="_blank" rel="noopener">Hi3861开发板第二个示例程序</a></li><li>创建一个代码目录: <code>my_first_app</code></li><li><p>新建文件<code>hello_world.c</code></p><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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">"ohos_init.h"</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">"ohos_types.h"</span></span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">HelloWorld</span><span class="params">(<span class="keyword">void</span>)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">"[DEMO] Hello world.\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line">SYS_RUN(HelloWorld);</span><br></pre></td></tr></table></figure></li><li><p>新建文件<code>BUILD.gn</code></p><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></pre></td><td class="code"><pre><span class="line">static_library(<span class="string">"myapp"</span>) &#123;</span><br><span class="line">  sources = [</span><br><span class="line">      <span class="string">"hello_world.c"</span></span><br><span class="line">  ]</span><br><span class="line">  include_dirs = [</span><br><span class="line">      <span class="string">"//utils/native/liteos/include"</span></span><br><span class="line">  ]</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>新建文件<code>APP_BUILD.gn</code></p></li><li><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="keyword">import</span>(<span class="string">"//build/lite/config/component/lite_component.gni"</span>)</span><br><span class="line"></span><br><span class="line">lite_component(<span class="string">"app"</span>) &#123;</span><br><span class="line">    features = [</span><br><span class="line">        <span class="string">"my_first_app:myapp"</span>,</span><br><span class="line">    ]</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>现在的目录结构为</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></pre></td><td class="code"><pre><span class="line">.</span><br><span class="line">├── APP_BUILD.gn</span><br><span class="line">├── BUILD.gn</span><br><span class="line">└── hello_world.c</span><br></pre></td></tr></table></figure></li></ul><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><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">docker run --rm \</span><br><span class="line">  -e HARDWARE=wifiiot \</span><br><span class="line">  -v $&#123;PWD&#125;/out:/OpenHarmony/out \</span><br><span class="line">  -v $&#123;PWD&#125;/APP_BUILD.gn:/OpenHarmony/applications/sample/wifi-iot/app/APP_BUILD.gn \</span><br><span class="line">  -v $&#123;PWD&#125;:/OpenHarmony/applications/sample/wifi-iot/app/my_first_app \</span><br><span class="line">  ystyle/open-harmony</span><br></pre></td></tr></table></figure><blockquote><p>编译后的文件在out目录<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></pre></td><td class="code"><pre><span class="line">.</span><br><span class="line">├── APP_BUILD.gn</span><br><span class="line">├── BUILD.gn</span><br><span class="line">├── hello_world.c</span><br><span class="line">└── out</span><br><span class="line">    └── wifiiot</span><br></pre></td></tr></table></figure></p></blockquote><h3 id="其它问题"><a href="#其它问题" class="headerlink" title="其它问题"></a>其它问题</h3><ul><li>如果实际开发，建议直接替换掉 整个<code>/OpenHarmony/applications/sample/wifi-iot/app/</code> 目录, 目录里边的都是示例代码.</li><li>如果要修改启动编译的命令的话，可以写好shell 脚本， run时指定cmd命令<ul><li>构建命令为: <code>python build.py ${HARDWARE} -b debug</code></li><li><code>docker run --rm -v ${PWD}/mybuild.sh:/OpenHarmony/mybuild.sh ystyle/open-harmony /OpenHarmony/mybuild.sh</code></li></ul></li><li>更新鸿蒙代码: 用修改镜像启动命令的方法，在<code>/OpenHarmony</code>目录执行<code>repo sync -c</code> 命令</li><li>其它驱动开发或系统组件开发也可以用挂载的方式把工程目录映射到容器，开发并编译</li></ul><h3 id="本文所使用Docker镜像的dockerfile文件"><a href="#本文所使用Docker镜像的dockerfile文件" class="headerlink" title="本文所使用Docker镜像的dockerfile文件"></a>本文所使用Docker镜像的dockerfile文件</h3><blockquote><p>参考<code>@keithyau</code><a href="https://openharmony.gitee.com/keithyau/build_lite/blob/master/Dockerfile20.04" target="_blank" rel="noopener">所写的Dockerfile</a>修改而来</p></blockquote><figure class="highlight dockerfile"><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><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">FROM</span> ubuntu:<span class="number">20.04</span> AS build-<span class="keyword">env</span></span><br><span class="line"><span class="keyword">LABEL</span> version=2020-10-15</span><br><span class="line"></span><br><span class="line"># Set your hardware</span><br><span class="line">ENV HARDWARE=wifiiot</span><br><span class="line"># Prevent interactive</span><br><span class="line">ENV DEBIAN_FRONTEND=noninteractive</span><br><span class="line"></span><br><span class="line"># Setting up the build environment</span><br><span class="line">RUN sed -i 's/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list &amp;&amp; \</span><br><span class="line">    sed -i 's/security.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list &amp;&amp; \</span><br><span class="line">    apt-get clean -y &amp;&amp; \</span><br><span class="line">    apt-get -y update &amp;&amp; \</span><br><span class="line">    apt-get remove python* -y &amp;&amp; \</span><br><span class="line">    apt-get install git curl build-essential libdbus-glib-1-dev libgirepository1.0-dev -y &amp;&amp; \</span><br><span class="line">    apt-get install zip libncurses5-dev pkg-config -y &amp;&amp; \</span><br><span class="line">    apt-get install python3-pip -y &amp;&amp; \</span><br><span class="line">    apt-get install scons dosfstools mtools mtd-utils default-jdk default-jre -y &amp;&amp; \</span><br><span class="line">    rm -rf /var/lib/apt/lists/*</span><br><span class="line"></span><br><span class="line"># Setup python</span><br><span class="line"># Make sure python install on the right python version path</span><br><span class="line">RUN update-alternatives --install /usr/bin/python python /usr/bin/python3.8 1 &amp;&amp; \</span><br><span class="line">    pip3 install --upgrade pip -i https://mirrors.aliyun.com/pypi/simple &amp;&amp; \</span><br><span class="line">    pip3 install ninja kconfiglib pycryptodome ecdsa -i https://mirrors.aliyun.com/pypi/simple &amp;&amp; \</span><br><span class="line">    pip3 install six --upgrade --ignore-installed six -i https://pypi.tuna.tsinghua.edu.cn/simple &amp;&amp; \</span><br><span class="line">    rm -rf /var/cache/apt/archives</span><br><span class="line"></span><br><span class="line">#Fix Dash</span><br><span class="line">RUN rm -rf /bin/sh &amp;&amp; \</span><br><span class="line">    ln -s /bin/bash /bin/sh</span><br><span class="line"></span><br><span class="line">#Setup gn</span><br><span class="line">ENV PATH /tools/gn:$PATH</span><br><span class="line">RUN mkdir /tools &amp;&amp; \</span><br><span class="line">    cd /tools &amp;&amp; \</span><br><span class="line">    curl -LO https://repo.huaweicloud.com/harmonyos/compiler/gn/1523/linux/gn.1523.tar &amp;&amp; \</span><br><span class="line">    tar xvf /tools/gn.1523.tar &amp;&amp; \</span><br><span class="line">    rm -rf /tools/gn.1523.tar</span><br><span class="line"></span><br><span class="line">#Setup LLVM</span><br><span class="line">#ADD ./llvm-linux-9.0.0-34042.tar /tools</span><br><span class="line">ENV PATH /tools/llvm/bin:$PATH</span><br><span class="line">RUN cd /tools &amp;&amp; \</span><br><span class="line">    curl -LO https://repo.huaweicloud.com/harmonyos/compiler/clang/9.0.0-34042/linux/llvm-linux-9.0.0-34042.tar &amp;&amp; \</span><br><span class="line">    tar xvf /tools/llvm-linux-9.0.0-34042.tar &amp;&amp; \</span><br><span class="line">    rm -rf /tools/llvm-linux-9.0.0-34042.tar</span><br><span class="line"></span><br><span class="line">#Setup hc-gen</span><br><span class="line">ENV PATH /tools/hc-gen:$PATH</span><br><span class="line">RUN cd /tools &amp;&amp; \</span><br><span class="line">    curl -LO https://repo.huaweicloud.com/harmonyos/compiler/hc-gen/0.65/linux/hc-gen-0.65-linux.tar &amp;&amp; \</span><br><span class="line">    tar xvf /tools/hc-gen-0.65-linux.tar &amp;&amp; \</span><br><span class="line">    rm -rf /tools/hc-gen-0.65-linux.tar</span><br><span class="line">    </span><br><span class="line">    </span><br><span class="line">#Setup hmos_app_packing_tool and hapsigntool // 必需是这目录，编译脚本写死了</span><br><span class="line">ENV PATH /root/developtools/:$PATH</span><br><span class="line">RUN mkdir /root/developtools/ &amp;&amp; cd /root/developtools/ &amp;&amp; \</span><br><span class="line">    curl -LO https://repo.huaweicloud.com/harmonyos/develop_tools/hmos_app_packing_tool.jar &amp;&amp; \</span><br><span class="line">    curl -LO https://repo.huaweicloud.com/harmonyos/develop_tools/hapsigntoolv2.jar</span><br><span class="line"></span><br><span class="line">#Setup gcc_riscv32</span><br><span class="line">ENV PATH /tools/gcc_riscv32/bin:$PATH</span><br><span class="line">RUN cd /tools &amp;&amp; \</span><br><span class="line">    curl -LO http://tools.harmonyos.com/mirrors/gcc_riscv32/7.3.0/linux/gcc_riscv32-linux-7.3.0.tar.gz &amp;&amp; \</span><br><span class="line">    tar xvf /tools/gcc_riscv32-linux-7.3.0.tar.gz &amp;&amp; \</span><br><span class="line">    rm -rf /tools/gcc_riscv32-linux-7.3.0.tar.gz</span><br><span class="line"></span><br><span class="line">#Create work dir</span><br><span class="line">RUN mkdir /OpenHarmony</span><br><span class="line">WORKDIR /OpenHarmony</span><br><span class="line"></span><br><span class="line"># Gitee Repo tool and download</span><br><span class="line"># Make sure requests install at the right location</span><br><span class="line">RUN curl https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 &gt; /usr/bin/repo &amp;&amp; \</span><br><span class="line">    chmod a+x /usr/bin/repo &amp;&amp; \</span><br><span class="line">    pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple requests</span><br><span class="line"></span><br><span class="line">#Download source, update to your info</span><br><span class="line">RUN git config --global user.email "lxy5266@live.com" &amp;&amp; \</span><br><span class="line">    git config --global user.name "ystyle" &amp;&amp; \</span><br><span class="line">    git config --global color.ui false &amp;&amp; \</span><br><span class="line">    git config --global credential.helper store &amp;&amp; \</span><br><span class="line">    repo init -u https://gitee.com/openharmony/manifest.git -b master --repo-branch=stable --no-repo-verify &amp;&amp; \</span><br><span class="line">    repo sync -c</span><br><span class="line"></span><br><span class="line"># compile</span><br><span class="line">ENV LANGUAGE en</span><br><span class="line">ENV LANG en_US.utf-8</span><br><span class="line">RUN export|grep LANG</span><br><span class="line">CMD ["/bin/bash", "-c", "python build.py $&#123;HARDWARE&#125; -b debug"]</span><br></pre></td></tr></table></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;在机器上安装好Docker&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;编译鸿蒙系统镜像&quot;&gt;&lt;a href=&quot;#编译鸿蒙系统镜像&quot; c
      
    
    </summary>
    
      <category term="系统" scheme="http://ystyle.top/categories/%E7%B3%BB%E7%BB%9F/"/>
    
    
      <category term="docker" scheme="http://ystyle.top/tags/docker/"/>
    
      <category term="鸿蒙" scheme="http://ystyle.top/tags/%E9%B8%BF%E8%92%99/"/>
    
  </entry>
  
  <entry>
    <title>转换在线漫画为mobi格式</title>
    <link href="http://ystyle.top/2020/09/04/comic-cli/"/>
    <id>http://ystyle.top/2020/09/04/comic-cli/</id>
    <published>2020-09-04T04:46:26.000Z</published>
    <updated>2020-09-04T04:46:26.000Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>转换在线漫画为mobi格式的工具</p></blockquote><h3 id="支持的网站"><a href="#支持的网站" class="headerlink" title="支持的网站"></a>支持的网站</h3><ul><li>动漫之家</li><li>喵同人</li></ul><h3 id="使用方法"><a href="#使用方法" class="headerlink" title="使用方法"></a>使用方法</h3><ul><li>必需安装<code>谷歌浏览器chrome</code></li><li>下载<a href="https://pan.baidu.com/s/1EPkLJ7WIJYdYtRHBEMqw0w" target="_blank" rel="noopener">comic-cli: https://pan.baidu.com/s/1EPkLJ7WIJYdYtRHBEMqw0w</a>, 提取码:h4np</li><li><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></pre></td><td class="code"><pre><span class="line"># 注释:  以#号或//开头的行会被忽略，空行也会被忽略</span><br><span class="line">// 本文件会生成三个漫画文件</span><br><span class="line"></span><br><span class="line">// 下载整个动漫，直接写列表地址</span><br><span class="line">https://www.dmzj.com/info/wodenvpengyouyoudianqiguaidanshihenkeai.html</span><br><span class="line"></span><br><span class="line">// 也可以载指定的章节，填写需要下载的章节地址，同一漫画的章节会合并成同一个文件</span><br><span class="line">https://www.dmzj.com/view/benghuai3rd/102129.html#@page=1</span><br><span class="line">https://www.dmzj.com/view/benghuai3rd/101570.html</span><br><span class="line">// 这行地址的章节会被忽略</span><br><span class="line"># https://www.dmzj.com/view/benghuai3rd/101013.html</span><br><span class="line"></span><br><span class="line">// 喵同人网站的写列表地址就好了</span><br><span class="line">https://zh.nyahentai.site/g/326699/</span><br></pre></td></tr></table></figure></li><li><p>然后把文件拖到comic-cli里边就会自动把漫画转为mobi格式</p></li><li>如果没有生成则把<code>kindlegen.exe</code>放到<code>c:/windows</code>里再试试</li></ul><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="https://dll.ystyle.top/images/2020-09/WindowsTerminal_2020-09-05_12-04-06.png" alt="图文教程" title="">                </div>                <div class="image-caption">图文教程</div>            </figure><h3 id="目前存在的问题"><a href="#目前存在的问题" class="headerlink" title="目前存在的问题"></a>目前存在的问题</h3><ul><li>转换工程文件到mobi格式时，可能失败，kindlegen没输出原因和错误内容，目前无法解决， 只能多次重试了。</li></ul><h3 id="其它工具"><a href="#其它工具" class="headerlink" title="其它工具"></a>其它工具</h3><ul><li><a href="https://ystyle.top/2019/12/31/txt-converto-epub-and-mobi/">txt文件转epub和mobi的工具TmdTextEpub和kaf</a></li><li>喵同人在线转换为mobi格式<a href="https://hcc.ystyle.top/" target="_blank" rel="noopener">hcc</a></li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;blockquote&gt;
&lt;p&gt;转换在线漫画为mobi格式的工具&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;/h3&gt;&lt;ul&gt;
&lt;li&gt;动
      
    
    </summary>
    
      <category term="软件" scheme="http://ystyle.top/categories/%E8%BD%AF%E4%BB%B6/"/>
    
    
      <category term="kindle" scheme="http://ystyle.top/tags/kindle/"/>
    
      <category term="mobi" scheme="http://ystyle.top/tags/mobi/"/>
    
      <category term="漫画" scheme="http://ystyle.top/tags/%E6%BC%AB%E7%94%BB/"/>
    
  </entry>
  
  <entry>
    <title>Linux kde文件管理器连接华为Share</title>
    <link href="http://ystyle.top/2020/09/03/kde-dolphin-smb/"/>
    <id>http://ystyle.top/2020/09/03/kde-dolphin-smb/</id>
    <published>2020-09-03T02:46:26.000Z</published>
    <updated>2020-09-03T02:46:26.000Z</updated>
    
    <content type="html"><![CDATA[<h3 id="华为手机设置"><a href="#华为手机设置" class="headerlink" title="华为手机设置"></a>华为手机设置</h3><ul><li>打开华为Share</li><li>长按华为Share图标进入华为分享</li><li>打开共享至电脑选项</li></ul><h3 id="Linux-设置"><a href="#Linux-设置" class="headerlink" title="Linux 设置"></a>Linux 设置</h3><ul><li><p>检查文件夹没有就创建一个</p><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">mkdir ~/.smb</span><br><span class="line">vim ~/.smb/smb.conf</span><br></pre></td></tr></table></figure></li><li><p>然后在文件填写</p><figure class="highlight"><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="section">[global]</span></span><br><span class="line">client min protocol = NT1</span><br></pre></td></tr></table></figure></li><li><p>打开Dolphin</p></li><li>选择网络在文件管理地址栏填写手机ip: <code>smb://192.168.3.129</code>  回车</li><li>在弹窗填写用户名和密码</li><li>右键添加到标签(下次直接在标签点击就能访问了)</li></ul><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="https://dll.ystyle.top/images/2020-09/2020-09-03_14-33.png" alt="访问华为Share" title="">                </div>                <div class="image-caption">访问华为Share</div>            </figure><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="https://dll.ystyle.top/images/2020-09/2020-09-03_14-31.png" alt="修改标签名称" title="">                </div>                <div class="image-caption">修改标签名称</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;打开华为Share&lt;/li&gt;
&lt;li&gt;长按华为Share图标进入华为分享&lt;/li&gt;
&lt;li&gt;打开
      
    
    </summary>
    
      <category term="软件" scheme="http://ystyle.top/categories/%E8%BD%AF%E4%BB%B6/"/>
    
    
      <category term="linux" scheme="http://ystyle.top/tags/linux/"/>
    
      <category term="kde" scheme="http://ystyle.top/tags/kde/"/>
    
      <category term="华为Share" scheme="http://ystyle.top/tags/%E5%8D%8E%E4%B8%BAShare/"/>
    
      <category term="Samba" scheme="http://ystyle.top/tags/Samba/"/>
    
  </entry>
  
  <entry>
    <title>Dokcer编译方舟引擎（MapleEngine）</title>
    <link href="http://ystyle.top/2020/07/21/dokcer-compile-maple-engine/"/>
    <id>http://ystyle.top/2020/07/21/dokcer-compile-maple-engine/</id>
    <published>2020-07-21T02:46:26.000Z</published>
    <updated>2020-08-06T07:08:26.000Z</updated>
    
    <content type="html"><![CDATA[<h3 id="文档"><a href="#文档" class="headerlink" title="文档"></a>文档</h3><ul><li><a href="https://gitee.com/harmonyos/OpenArkCompiler/issues/I1OHE5" target="_blank" rel="noopener">方舟引擎发布公告</a></li><li><a href="https://gitee.com/openarkcompiler-incubator/maple_engine" target="_blank" rel="noopener">官方文档 - 方舟引擎编译说明</a></li><li><a href="https://gitee.com/openarkcompiler-incubator/maple_engine/blob/master/maple_build/doc/build_OpenJDK8.md" target="_blank" rel="noopener">官方文档 - 构建Java 核心库</a></li></ul><h3 id="Docker-文件"><a href="#Docker-文件" class="headerlink" title="Docker 文件"></a>Docker 文件</h3><blockquote><p>复制到方舟引擎代码根目录, 文件名为Dockerfile</p></blockquote><figure class="highlight dockerfile"><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="keyword">FROM</span> ubuntu:<span class="number">16.04</span></span><br><span class="line"><span class="keyword">MAINTAINER</span> https://www.openarkcompiler.cn</span><br><span class="line"></span><br><span class="line"><span class="comment"># Setting up the build environment</span></span><br><span class="line"><span class="keyword">RUN</span> sed -i 's/archive.ubuntu.com/mirrors.163.com/g' /etc/apt/sources.list &amp;&amp; \</span><br><span class="line">    apt-get -y update &amp;&amp; \</span><br><span class="line">    apt install --no-install-recommends -y build-essential git wget clang cmake libffi-dev libelf-dev libunwind-dev \</span><br><span class="line">        libssl-dev openjdk-8-jdk-headless unzip python-minimal python3 curl &amp;&amp; \</span><br><span class="line">    rm -rf /var/lib/apt/lists/*</span><br><span class="line"></span><br><span class="line"># 在国内请反注释下行, 因为容器也是个单独的系统，所以别用127.0.0.1</span><br><span class="line">#ENV http_proxy=http://192.168.3.81:1081 \ </span><br><span class="line">#    https_proxy=http://192.168.3.81:1081</span><br><span class="line"></span><br><span class="line"># copy source</span><br><span class="line">COPY . /maple_engine</span><br><span class="line">WORKDIR /maple_engine</span><br><span class="line"></span><br><span class="line"># custom java/lang/Object.java</span><br><span class="line">RUN cd /maple_engine/maple_build/jar/ &amp;&amp; \</span><br><span class="line">    bash -c "cp /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/&#123;rt.jar,jce.jar,jsse.jar,charsets.jar&#125; . " &amp;&amp; \</span><br><span class="line">    mkdir -p java/lang/ &amp;&amp; \</span><br><span class="line">    curl -L http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/raw-file/jdk8u265-b01/src/share/classes/java/lang/Object.java &gt; java/lang/Object.java &amp;&amp; \</span><br><span class="line">    sed -i '/public class Object &#123;/a\long reserved_1; int reserved_2;' java/lang/Object.java &amp;&amp; \</span><br><span class="line">    javac -target 1.8 -g java/lang/Object.java &amp;&amp; \</span><br><span class="line">    jar uf rt.jar java/lang/Object.class &amp;&amp; \</span><br><span class="line">    rm -rf java</span><br><span class="line"></span><br><span class="line"># compile</span><br><span class="line">RUN bash -c "source ./envsetup.sh &amp;&amp; ./maple_build/tools/build-maple.sh &amp;&amp; ./maple_build/tools/build-libcore.sh &amp;&amp; rm -rf /maple_engine/maple_build/out/*"</span><br></pre></td></tr></table></figure><h3 id="编译方舟引擎"><a href="#编译方舟引擎" class="headerlink" title="编译方舟引擎"></a>编译方舟引擎</h3><blockquote><p>方舟编译器，也会一起编译，注意： 编译libjava时会占用25G左右的内存，不足25G建议添加swap分区</p></blockquote><blockquote><p>本人机器是16G内存，20G的SSD swap分区</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">docker build -t ystyle/maple-engine .</span><br></pre></td></tr></table></figure><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="https://dll.ystyle.top/images/2020-07/44F09FD9B6FF040264D4D5D02EBD079E.jpg" alt="编译占用" title="">                </div>                <div class="image-caption">编译占用</div>            </figure><h3 id="测试"><a href="#测试" class="headerlink" title="测试"></a>测试</h3><blockquote><p><a href="https://hub.docker.com/r/ystyle/maple-engine" target="_blank" rel="noopener">镜像</a>已经推送到<a href="https://hub.docker.com/r/ystyle/maple-engine" target="_blank" rel="noopener">docker hub</a>, 可以直接使用下面的镜像编译hello world或其它软件</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></pre></td><td class="code"><pre><span class="line">docker run --rm -ti ystyle/maple-engine bash</span><br><span class="line"># 设置基础环境</span><br><span class="line">source ./envsetup.sh</span><br><span class="line"># 编译java hello world</span><br><span class="line">cd ./maple_build/examples/HelloWorld</span><br><span class="line">$MAPLE_BUILD_TOOLS/java2asm.sh HelloWorld.java</span><br><span class="line"># 生成把.s文件编译为.so</span><br><span class="line">$MAPLE_BUILD_TOOLS/asm2so.sh HelloWorld.s</span><br><span class="line"># 运行软件</span><br><span class="line">$MAPLE_BUILD_TOOLS/run-app.sh -classpath ./HelloWorld.so HelloWorld</span><br></pre></td></tr></table></figure><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="https://dll.ystyle.top/images/2020-07/2020-07-22_10-35.png" alt="编译执行结果" title="">                </div>                <div class="image-caption">编译执行结果</div>            </figure><h3 id="调试应用程序"><a href="#调试应用程序" class="headerlink" title="调试应用程序"></a>调试应用程序</h3><ul><li><a href="https://gitee.com/openarkcompiler-incubator/maple_engine/wikis/%E6%96%B9%E8%88%9F%E5%A4%9A%E8%AF%AD%E8%A8%80%E8%B0%83%E8%AF%95%E5%99%A8?sort_id=2711073" target="_blank" rel="noopener">方舟多语言调试器介绍</a></li><li><a href="https://gitee.com/openarkcompiler-incubator/maple_engine/tree/master/maple_debugger" target="_blank" rel="noopener">方舟多语言调试器项目说明</a></li><li><a href="https://gitee.com/openarkcompiler-incubator/maple_engine/blob/master/maple_debugger/UserReference.md" target="_blank" rel="noopener">方舟多语言调试器用户手册</a></li></ul><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">docker run --rm -ti ystyle/maple-engine:gdb bash</span><br><span class="line"># 设置jdk源码路径 $JDK_SRC 为本地的openjdk源码</span><br><span class="line"># docker run --rm -ti -v $&#123;JDK_SRC&#125;:/root/my_openjdk8/jdk/src/ ystyle/maple-engine:gdb bash</span><br><span class="line"># 设置基础环境</span><br><span class="line">source ./envsetup.sh</span><br><span class="line"># 编译java hello world</span><br><span class="line">cd ./maple_build/examples/HelloWorld</span><br><span class="line">$MAPLE_BUILD_TOOLS/java2asm.sh HelloWorld.java</span><br><span class="line"># 生成把.s文件编译为.so</span><br><span class="line">$MAPLE_BUILD_TOOLS/asm2so.sh HelloWorld.s</span><br><span class="line"># 调试应用程序</span><br><span class="line">&quot;$MAPLE_BUILD_TOOLS&quot;/run-app.sh -gdb -classpath ./HelloWorld.so HelloWorld</span><br></pre></td></tr></table></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://gitee.com/harmonyos/OpenArkCompiler/issues/I1OH
      
    
    </summary>
    
      <category term="软件" scheme="http://ystyle.top/categories/%E8%BD%AF%E4%BB%B6/"/>
    
    
      <category term="编译器" scheme="http://ystyle.top/tags/%E7%BC%96%E8%AF%91%E5%99%A8/"/>
    
      <category term="方舟" scheme="http://ystyle.top/tags/%E6%96%B9%E8%88%9F/"/>
    
      <category term="方舟多语言调试器" scheme="http://ystyle.top/tags/%E6%96%B9%E8%88%9F%E5%A4%9A%E8%AF%AD%E8%A8%80%E8%B0%83%E8%AF%95%E5%99%A8/"/>
    
  </entry>
  
</feed>
