• Lv1
    粉丝0

积分2 / 贡献0

提问0答案被采纳0文章1

作者动态

    [经验分享] ohpm探索:不只是第三方库管理工具 原创

    u8f-nKs9 显示全部楼层 发表于 2025-12-20 17:34:17

    在根据方舟运行时使用指南进行ArkCompiler编译的时候,发现编译过程中存在对ohpm的使用。然而无论官方还是民间文档都只提到过ohpm管理第三方库的作用,所以本人尝试探索了一下ohpm在这里的作用。

    编译日志中的 ohpm 相关信息

    编译脚本在构建开始前,首先启动了 ohpm 的初始化流程。具体信息按时间顺序如下:

    阶段 信息类型 具体内容
    初始化开始 [OHOS INFO] Ohpm initialization started...
    版本检查 [OHOS INFO] Current ohpm version is 5.0.8
    环境警告 ohpm WARN Your "NodeJs" version is less than the recommended version "18.x.x", please upgrade it as soon as possible.
    配置设置 ohpm DEBUG 1.config set registry https://repo.harmonyos.com/ohpm/ <br> 2. config set strict_ssl false <br> 3. config set log_level debug
    审计失败 ohpm DEBUG Audit failed, detail: the trace log file path is not exist! trace path: /home/ushio/Library/Caches/Huawei/DevEcoStudio5.0/TraceLogData <br> (在每次 config set操作后均出现一次,共三次)
    工具安装 [OHOS INFO] 1.installing pnpm... <br> 2. installing hypium...
    初始化完成 [OHOS INFO] ohpm initialization successful!

    为什么运行时编译中会出现ohpm?

    从日志判断,ohpm在构建开始前应该执行了一些关键的环境初始化工作

    • 设置包仓库源:将 registry 指向华为官方仓 https://repo.harmonyos.com/ohpm/,这是后续下载任何依赖的基础。
    • 安装构建工具(是否由ohpm进行存疑):安装了 pnpm(一个高性能的Node.js包管理器)和 hypium(OpenHarmony的测试框架)。这可能意味着 ohpm 负责管理构建工具链本身的依赖,而不仅仅是应用层的第三方库。
    • 配置构建环境:设置了日志级别和SSL验证等参数。

    因此,ohpm 或许是OpenHarmony构建系统的一个基础组件,它确保编译所需的工具和依赖是正确的版本且可用。可以把它理解为OpenHarmony生态的“基础设施包管理器”。

    管理第三方库是ohpm的唯一作用吗?

    从这次编译过程来看,ohpm的作用不止“应用级第三方库管理”,也是OpenHarmony 的官方包管理工具管理范围:其管理的“包”包括:

    • 应用开发库:通常所说的“第三方库”(如UI组件、网络库等)。
    • 构建工具链:如日志中安装的 pnpmhypium,以及其他编译、测试、调试工具。
    • 系统组件/运行时依赖:一些系统级的模块或运行时也可能通过 ohpm 来管理版本和依赖。 简单来说,ohpm 管理的是整个OpenHarmony开发生态(从系统构建到应用开发)中所需要的各种软件包。 这就是为什么在编译Ark运行时这样的基础模块时,它也必须先行启动并完成配置。

    为什么会出现这种角色差异?

    这样的设计可能基于以下原因:

    1. 统一依赖管理:OpenHarmony可能希望用OHPM这一套工具来统一管理所有依赖,无论是应用层的功能库,还是构建系统本身的工具链。这能简化整个生态的包管理模型。
    2. 动态环境准备:构建像ArkJS这样的大型项目,需要一个特定版本的构建环境(如特定版本的Node.js包管理器)。让OHPM在编译开始时自动准备这些环境,可以确保每次构建的环境都是一致且隔离的

    相关代码证明

    > 以下代码皆来自OpenHarmony开源仓库。

    build.sh

    function init_ohpm() {
      TOOLS_INSTALL_DIR="${SOURCE_ROOT_DIR}/prebuilts/build-tools/common"
      pushd ${TOOLS_INSTALL_DIR} &gt; /dev/null
        OHPM_HOME=${TOOLS_INSTALL_DIR}/../../tool/command-line-tools/ohpm/bin
        chmod +x ${OHPM_HOME}/ohpm
        export PATH=${OHPM_HOME}:$PATH
        chmod +x ${OHPM_HOME}/init
        ${OHPM_HOME}/init &gt; /dev/null
        echo "[OHOS INFO] Current ohpm version is $(ohpm -v)"
        ohpm config set registry https://repo.harmonyos.com/ohpm/
        ohpm config set strict_ssl false
        ohpm config set log_level debug
      popd &gt; /dev/null
      if [[ -d "$HOME/.hvigor" ]]; then
        rm -rf $HOME/.hvigor/daemon $HOME/.hvigor/wrapper
      fi
      mkdir -p $HOME/.hvigor/wrapper/tools
      echo '{"dependencies": {"pnpm": "7.30.0"}}' &gt; $HOME/.hvigor/wrapper/tools/package.json
      pushd $HOME/.hvigor/wrapper/tools &gt; /dev/null
        echo "[OHOS INFO] installing pnpm..."
        npm install --silent &gt; /dev/null
      popd &gt; /dev/null
      mkdir -p $HOME/.ohpm
      echo '{"devDependencies":{"@ohos/hypium":"1.0.6"}}' &gt; $HOME/.ohpm/oh-package.json5
      pushd $HOME/.ohpm &gt; /dev/null
        echo "[OHOS INFO] installing hypium..."
        ohpm install &gt; /dev/null
      popd &gt; /dev/null
    }

    build.sh 脚本是 OpenHarmony 构建系统的主入口和前置环境准备脚本,在这里能看到在编译过程中为什么会发生ohpm初始化。以上为ohpm初始化函数。

    oh-package-lock.json

    /*
     * Copyright (c) 2025 Shenzhen Kaihong Digital Industry Development Co., Ltd.
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *     http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    {
      "meta": {
        "stableOrder": true
      },
      "lockfileVersion": 3,
      "ATTENTION": "THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.",
      "specifiers": {
        "@ohos/hypium@1.0.6": "@ohos/hypium@1.0.6"
      },
      "packages": {
        "@ohos/hypium@1.0.6": {
          "name": "@ohos/hypium",
          "version": "1.0.6",
          "integrity": "sha512-bb3DWeWhYrFqj9mPFV3yZQpkm36kbcK+YYaeY9g292QKSjOdmhEIQR2ULPvyMsgSR4usOBf5nnYrDmaCCXirgQ==",
          "resolved": "https://ohpm.openharmony.cn/ohpm/@ohos/hypium/-/hypium-1.0.6.tgz",
          "shasum": "3f5fed65372633233264b3447705b0831dfe7ea1",
          "registryType": "ohpm"
        }
      }
    }

    test\xts\tools\sample\ui_compare\uiCompareTest_05\oh-package-lock.json5 文件中可以看出,OpenHarmony的官方测试工具包 @ohos/hypium@ohos/hamock 的下载地址是 https://ohpm.openharmony.cn/ohpm/。这直接证明ohpm管理的不仅是社区“第三方库”,还包括华为/OpenHarmony官方的工具链和系统组件

    use-napi-load-module.md和arkts-dynamic-import.md

    docs\zh-cn\application-dev\napi\use-napi-load-module.md

    // [Start napi_load_module_napi_ohpm]
    static napi_value loadModule(napi_env env, napi_callback_info info)
    {
        napi_value result;
        // 1. 使用napi_load_module加载@ohos/axios
        napi_status status = napi_load_module(env, "@ohos/axios", &amp;result);
        if (status != napi_ok) {
            return nullptr;
        }
    
        napi_value key;
        std::string keyStr = "VERSION";
        napi_create_string_utf8(env, keyStr.c_str(), keyStr.size(), &amp;key);
        // 2. 使用napi_get_property获取VERSION
        napi_value defaultValue;
        napi_get_property(env, result, key, &amp;defaultValue);
        return result;
    }
    // [End napi_load_module_napi_ohpm]

    这段代码是 ArkTS/JS运行时(NAPI接口)的C++扩展,它演示了如何从原生侧动态加载一个由ohpm管理的模块。 底层C++ API可以直接加载 @ohos/axios@ohos/crypto-js 等模块。结合文档和 oh-package-lock.json 可知,这些模块正是通过ohpm进行分发的官方包。这揭示了从应用层API调用到底层包管理(ohpm)的完整链路,表明ohpm是官方能力分发的渠道。

    docs\zh-cn\application-dev\arkts-utils\arkts-dynamic-import.md:

    - **HAP常量动态import远程HAR模块名**
    
      ```typescript
    
      // HAP's src/main/ets/pages/Index.ets
    
      import('@ohos/crypto-js').then((ns:ESObject) =&gt; {
    
        console.info('DynamicImport @ohos/crypto-js: ' + ns.CryptoJS.MD5(123456));
    
      });
    
      // HAP's oh-package.json5
    
      "dependencies": {
    
        "@ohos/crypto-js": "2.0.3-rc.0"
    
      }

    上下层对应:ArkTS的 import('@ohos/xxx') 在运行时,最终很可能就是通过底层类似于 napi_load_module(env, “@ohos/xxx“, ...) 的机制来实现的。

    结论

    将最后的2个文件与之前发现的 oh-package-lock.json 结合起来,可以尝试描绘出一个技术闭环:

    1. 声明依赖(开发态):开发者在 oh-package.json5 中写入 "@ohos/axios": "x.x.x"
    2. 下载与管理(包管理态)ohpm 根据配置,从官方仓库下载该包,并将其信息(名称、版本、存储路径)记录在 oh-package-lock.json 中。
    3. 通知构建(构建态):对于动态加载场景,通过 runtimeOnly 配置告知构建系统此包为运行时必需。
    4. 动态加载(运行态)
      • 应用层:ArkTS代码执行 import('@ohos/axios')
      • 系统层:C++/NAPI代码调用 napi_load_module(env, “@ohos/axios“, ...)
      • 运行时:系统根据ohpm管理的模块解析路径,找到并加载对应的代码包,完成动态导入。 由此可以看出,@ohos/ 开头的官方包的其分发、管理和运行时加载,整个生命周期都与ohpm工具绑定。这说明ohpm也是OpenHarmony官方生态的基础包管理器,而非仅用于社区第三方库。

    附记与致谢

    本文是笔者在大学课程中完成的作业结果之一。本文通过对ArkCompiler编译流程的跟踪与一些源码分析,尝试理解 ohpm工具在构建系统中的实际角色。感谢OpenHarmony开源项目提供的学习机会,也感谢课程老师的指导。文中观点仅为个人基于公开代码的分析,如有理解偏颇之处,欢迎指正。 本文同步发布在华为开发者社区和csdn。

    ©著作权归作者所有,转载或内容合作请联系作者

    您尚未登录,无法参与评论,登录后可以:
    参与开源共建问题交流
    认同或收藏高质量问答
    获取积分成为开源共建先驱

    Copyright   ©2025  OpenHarmony开发者论坛  京ICP备2020036654号-3 | 京公网安备11030102011662号 |技术支持 Discuz!

    返回顶部