我是兰瓶Coding,一枚刚踏入鸿蒙领域的转型小白,原是移动开发中级,如下是我学习笔记《零基础学鸿蒙》,若对你所有帮助,还请不吝啬的给个大大的赞~

前言

——版本锁定、私仓与安全审计的工程化落地指南(含 .ohpmrc、离线镜像、CI 流程与脚本)

说句掏心窝子的:三方依赖治理做不好,线上事故就像过山车:今天是非法网络请求,明天是License 违规,后天是不可重现构建。而在 OpenHarmony 生态里用 ohpm,我们既要稳住可重复性,又要兼顾安全与合规,还得让离线构建在园区/内网照样“起飞”。这篇我把版本锁定私仓去重分组离线镜像License/安全审计一条龙说透,给你能直接抄的配置和脚本。上车!🚗💨

目录快扫(拿去当评审 Checklist)

  1. 目标与底线:可重现、可追溯、可回滚
  2. 依赖分组与去重:从“堆包”到“控包”
  3. 版本锁定:从 semver 茫然到 “1 个 commit = 1 个世界”
  4. .ohpmrc 私仓与镜像:在线稳、离线也能打包
  5. 离线镜像与缓存:Build Farm / CI 的“柴油桶”
  6. 安全与 License 审计:自动化到每次 PR
  7. 可重现构建流水线:CI 模板(含断网演练)
  8. 备份/恢复与应急回滚:黑天鹅预案
  9. 团队规范与常见地雷(含脚本)
  10. 收尾 & 一个小小确认

1) 目标与底线:三句话敲在门框上

  • 可重现:任何提交在同版本 ohpm/Node/系统库下,锁文件一致就能产出一致的产物
  • 可追溯:每个产物带 SBOM 与依赖树指纹;谁引入了什么、一查即知。
  • 可回滚:失败一键回到上一个锁文件 + 离线包快照

2) 依赖分组与去重:从“堆包”到“控包”

分组(Repository 维度)

  • runtime(生产运行时):打包进产物,严格锁定。
  • dev(开发期工具):lint、测试、打包器。
  • build-only(构建时辅助):代码生成、预编译。
  • optional/platform(可选/平台差异):仅在特定 profile/产品使用。

建议:monorepo + workspace(多 HAP/多模块)时,每个模块的 oh-package.json(或等价配置)显式标注 dependencies/devDependencies/optionalDependencies不要“全都扔 dependencies”

去重(版本统一)

  • 优先原则同一 major 尽量同一 exact 版本
  • 审查点:锁文件中同名包出现多个版本(>1),评估兼容性后上“override/alias”统一版本(下文给脚本)。

3) 版本锁定:从 semver 茫然到“1 commit=1世界”

规则

  • 全部依赖用“精确版本”"foo": "1.2.3",不要 ^~latest
  • 锁文件必须提交(例如 ohpm-lock.json 或工具生成的 lockfile)。
  • CI 用冻结安装:禁止隐式升级(若 ohpm 支持,使用 ohpm ci/--frozen-lockfile/等价参数)。

Hook:防止误写宽松版本

# scripts/guard-strict-versions.sh
set -euo pipefail
files=$(git diff --cached --name-only | grep -E '(oh|)package\.json$' || true)
[ -z "$files" ] && exit 0
fail=0
for f in $files; do
  if grep -E '"(dependencies|devDependencies|optionalDependencies)"' -n -A200 "$f" \
     | grep -E ':"[\^~><=]' ; then
     echo "✖ $f: 发现非精确版本(^ ~ >= <= 等),请改为 exact 版本" >&2
     fail=1
  fi
done
[ $fail -eq 0 ] || exit 1
# .husky/pre-commit
bash scripts/guard-strict-versions.sh

4) .ohpmrc 私仓与镜像:在线稳、离线也能打包

目标:所有安装只从公司私仓/镜像取包;外网断开仍可通过离线镜像完成构建。
下面示例字段命名参考 npm 风格,ohpm 实际字段可能略有不同——以你们项目 ohpm 版本文档为准,但治理思路相同。

# .ohpmrc  —— 项目根目录
registry=https://ohpm.registry.company.com/

# 私有 scope 走内网私仓
@company:registry=https://ohpm.registry.company.com/

# 镜像策略
strict-ssl=true
always-auth=true
# 证书链(如有内网 CA)
cafile=/etc/ssl/certs/company-ca.pem

# 离线镜像目录(本机/CI 预热)
offline-mirror=.ohpm-offline-mirror
offline-mirror-prune=true

# 代理(如需)
# proxy=http://proxy.company.com:8080
# https-proxy=http://proxy.company.com:8080

# 审计/许可策略(若 ohpm 支持)
# audit=true
# license-policy=ALLOW:MIT,Apache-2.0;DENY:AGPL-3.0

私仓实现

  • 选型:兼容 npm-registry 协议的 Verdaccio / Nexus / Artifactory(若 ohpm 完全独立协议,使用官方私仓或网关适配层)。
  • 上游同步白名单:只拉允许的 scope 与版本;其余默认拒绝
  • 灰度缓存:新包进入需审批或“影子区”观察 24–48h。

5) 离线镜像与缓存:Build Farm / CI 的“柴油桶”

预热离线镜像

# scripts/ohpm-warmup.sh
set -e
export OHPM_CONFIG_USERCONFIG=$(pwd)/.ohpmrc
# Install 并把 tarball 存到 offline-mirror
ohpm install
# 也可显式拉取关键包版本
# ohpm pack @company/core@1.2.3 --dest .ohpm-offline-mirror

让 CI 断网也能跑

# .github/workflows/ci.yml
name: ci
on: [push, pull_request]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Cache ohpm mirror
        uses: actions/cache@v4
        with:
          path: .ohpm-offline-mirror
          key: ohpm-mirror-${{ hashFiles('ohpm-lock.json') }}
      - name: Install
        run: |
          export OHPM_CONFIG_USERCONFIG=$GITHUB_WORKSPACE/.ohpmrc
          # 强制只用离线镜像(示意:根据 ohpm 实际参数替换)
          ohpm install --offline --frozen-lockfile
      - name: Build
        run: ohpm run build

小贴士:镜像目录建议纳入缓存不进仓库;锁文件才是唯一真相。


6) 安全与 License 审计:自动化到每次 PR

SBOM(物料清单)

  • 产出格式:CycloneDXSPDX
  • 工具:syft 生成 SBOM,grype/trivy 做漏洞扫描;或接入 ORT(OSS Review Toolkit)做 License 体检。
# 生成 SBOM
syft dir:. -o cyclonedx-json=sbom.json
# 漏洞扫描(本地/CI)
grype sbom:sbom.json --fail-on high

License 扫描与策略

  • 白名单MIT, BSD-2/3, Apache-2.0
  • 灰名单LGPL-2.1/3.0(需动态链接或隔离)
  • 黑名单AGPL-3.0, SSPL, 未知/自定义不可商业
  • CI 中阻断:检测到黑名单→阻止合并;灰名单→需要法务豁免标记。
# .github/workflows/compliance.yml
name: compliance
on: [pull_request]
jobs:
  license-and-vuln:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: SBOM
        run: syft dir:. -o cyclonedx-json=sbom.json
      - name: Vulnerabilities
        run: grype sbom:sbom.json --fail-on high
      - name: License check (ORT)
        run: |
          ort --info analyze -i . -o ort-result
          ort --info evaluate -i ort-result/analyzer-result.yml \
              --policy-file ./.ort/policy.hocon \
              --output-dir ort-result/eval

7) 可重现构建流水线:锁 + 镜像 + 冻结 三件套

流水线关键点

  1. 固定工具版本:ohpm --version、Node 版本用 .tool-versions/asdf/volta 固定。
  2. 只用锁文件ohpm install --frozen-lockfile(或等价参数);禁止 ohpm update 在 CI 里运行。
  3. 产物附带指纹与 SBOM:编译后生成 build.json(含 git commit、锁文件 hash、SBOM 摘要)。
  4. 断网演练作业:每周一次 CI Job 关闭外网,只用离线镜像跑一次全流程。
// build/build.json —— 产物可追溯元数据
{
  "git": "c4c1b7f",
  "ohpmLockHash": "sha256:9c6f…",
  "node": "20.11.1",
  "ohpm": "X.Y.Z",
  "sbom": "sha256:a1b2…",
  "builtAt": "2025-10-27T13:03:00Z"
}

8) 备份/恢复与应急回滚:黑天鹅预案

  • 离线镜像快照:每次 release 打一份 .ohpm-offline-mirror 的归档(含校验和),与锁文件一起入库(对象存储)。
  • 锁文件回滚:出事“一键还原到上个 release 的 lock + mirror”,CI 自动触发冷构建验收。
  • 私仓“影子区”:新版本先放影子区,仅灰度项目可用;稳定 1–2 个迭代后升入正式通道。

9) 团队规范与常见地雷(附脚本)

团队规范(摘)

  • 任何升级都走 PRohpm update foo@1.2.3 + 变更说明 + 审计结果(漏洞/License diff)。
  • 锁文件冲突不得手改:重新 ohpm install 解决;手改 = 把地雷埋到线上。
  • Node/ohpm 版本随仓库走:本地开发和 CI 一致。
  • 定期“去重体检”:每周跑一次依赖树重复版本扫描。

重复版本扫描脚本

# scripts/dedupe-report.js
// 粗略示例:统计 lock 中重复版本(请按实际 lock 结构调整)
const fs = require('fs')
const lock = JSON.parse(fs.readFileSync('ohpm-lock.json','utf8'))
const map = new Map()
for (const [name, meta] of Object.entries(lock.packages || {})) {
  const k = `${meta.name}`
  const v = meta.version
  if (!map.has(k)) map.set(k, new Set())
  map.get(k).add(v)
}
const dup = [...map.entries()].filter(([k, v]) => v.size > 1)
if (dup.length) {
  console.log('⚠️  Duplicated packages:')
  dup.forEach(([k, v]) => console.log(k, '=>', [...v].join(', ')))
  process.exitCode = 0
} else {
  console.log('✅ No duplicates')
}

离线构建干跑(断网演练)

# scripts/offline-dryrun.sh
set -e
export OHPM_CONFIG_USERCONFIG=$(pwd)/.ohpmrc
ohpm cache verify || true
ohpm install --offline --frozen-lockfile
ohpm run build

10) 收尾:把“拿来就能用”变成“拿来就离不开”

依赖治理说到底是三件事:锁得住(版本与来源)、查得清(SBOM 与审计)、断了网也能干(离线镜像)。.ohpmrc 定路线、私仓兜底离线镜像加速CI 冻结安装每次 PR 自动审计,这就是一套能经得起“人祸与天灾”的工程化组合拳。下次有人问“为什么你们发版这么稳?”你就笑笑:“我们只信锁文件和镜像,不信运气。” 😉

(未完待续)

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐