R021: hypium版本号>=1.0.26
SkillDev toolsA skill for dev tools by openharmonyinsight.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the R021: hypium版本号>=1.0.26 skill
What this skill tells your AI
The instructions your AI receives, as published by openharmonyinsight/openharmony-skills in skills/check-test-code-quality/rules/R021/SKILL.md and read by ahel’s review.
规则信息
| 属性 | 值 |
|---|---|
| 规则编号 | R021 |
| 问题类型 | hypium版本号不满足要求 |
| 严重级别 | Critical |
| 规则复杂度 | simple |
| 扫描范围 | 独立XTS工程根目录下的 oh-package.json5 |
| testcase字段 | -(配置文件,不在it()块内) |
问题描述
一个独立XTS工程的 oh-package.json5 文件中,devDependencies 下的 "@ohos/hypium" 字段值必须 >= 1.0.26。
修复建议
将 "@ohos/hypium" 的版本号升级到 1.0.26 或以上。
修复建议格式
路径: {文件路径}, 行号: {行号}, 问题描述: 在独立XTS工程 '{工程名称}' 中,oh-package.json5的devDependencies.@ohos/hypium版本号为 '{当前版本}',低于最低要求版本 1.0.26。
扫描逻辑
Step 1: 识别独立XTS工程
复用R011的独立XTS工程识别逻辑(必须使用修正后的版本,正确处理group类型父BUILD.gn,见R019陷阱6)。
Step 2: 定位oh-package.json5
在每个独立XTS工程的根目录下查找 oh-package.json5 文件。注意:
- 只检查工程根目录下的
oh-package.json5,不检查entry/oh-package.json5或cpp/*/oh-package.json5等子目录文件 - 如果根目录下没有
oh-package.json5,跳过该工程
Step 3: 提取hypium版本号
在 oh-package.json5 文件中,提取 devDependencies 下 "@ohos/hypium" 的版本号字符串。
关键: 必须跳过注释行。oh-package.json5 支持 // 单行注释,注释掉的依赖不参与检查。
import re
import os
HYPIMUM_PATTERN = re.compile(
r'"@ohos/hypium"\s*:\s*"([^"]+)"'
)
def parse_version(version_str):
parts = version_str.strip().split('.')
result = []
for p in parts:
m = re.match(r'(\d+)', p)
result.append(int(m.group(1)) if m else 0)
while len(result) < 3:
result.append(0)
return tuple(result)
def scan_r021(scan_root, base_dir):
MIN_VERSION = (1, 0, 26)
issues = []
projects = find_independent_projects(scan_root)
for project_dir in projects:
pkg_path = os.path.join(project_dir, 'oh-package.json5')
if not os.path.isfile(pkg_path):
continue
with open(pkg_path, 'r', encoding='utf-8') as f:
lines = f.readlines()
for line_idx, line in enumerate(lines):
stripped = line.strip()
# 跳过注释行(// 开头或全行被注释)
if stripped.startswith('//'):
continue
# 跳过 @ohos/hypium 被注释的情况
# 例如: // "@ohos/hypium": "1.0.21",
code_part = stripped
if '//' in stripped:
# 取 // 之前的部分
code_part = stripped[:stripped.index('//')].strip()
match = HYPIMUM_PATTERN.search(code_part)
if not match:
continue
version_str = match.group(1)
version = parse_version(version_str)
if version < MIN_VERSION:
rel_path = os.path.relpath(pkg_path, base_dir)
rel_project = os.path.relpath(project_dir, base_dir)
line_num = line_idx + 1
issues.append({
'rule': 'R021',
'type': 'hypium版本号不满足要求',
'severity': 'Critical',
'file': rel_path,
'line': line_num,
'testcase': '-',
'snippet': f'"@ohos/hypium": "{version_str}"',
'suggestion': (
f"路径: {rel_path}, 行号: {line_num}, "
f"问题描述: 在独立XTS工程 '{rel_project}' 中,"
f"oh-package.json5的devDependencies.@ohos/hypium版本号为 "
f"'{version_str}',低于最低要求版本 1.0.26。"
),
})
return issues
错误示例
{
"modelVersion": "6.0.0",
"description": "Please describe the basic information.",
"dependencies": {
},
"devDependencies": {
"@ohos/hypium": "1.0.25" // ✗ 错误:版本低于 1.0.26
}
}
{
"devDependencies": {
"@ohos/hypium": "1.0.6" // ✗ 错误:版本低于 1.0.26
}
}
正确示例
{
"modelVersion": "6.0.0",
"description": "Please describe the basic information.",
"dependencies": {
},
"devDependencies": {
"@ohos/hypium": "1.0.26" // ✓ 版本号满足最低要求
}
}
{
"devDependencies": {
"@ohos/hypium": "1.0.27" // ✓ 版本号满足最低要求
}
}
陷阱与注意事项
陷阱1: 必须跳过注释行
oh-package.json5 支持 // 单行注释。被注释掉的 @ohos/hypium 条目不参与检查。
"devDependencies": {
// "@ohos/hypium": "1.0.21", // ← 被注释掉,不检查
}
如果不过滤注释行,会将注释中的旧版本号误报为问题。
判断方法: 行去除首尾空白后以 // 开头,或行内 // 之前的部分不含 @ohos/hypium。
陷阱2: 只检查工程根目录的oh-package.json5
独立XTS工程下可能存在多个 oh-package.json5 文件:
{工程根目录}/oh-package.json5← 只检查这个{工程根目录}/entry/oh-package.json5← 不检查{工程根目录}/entry/src/main/cpp/types/libxxx/oh-package.json5← 不检查
陷阱3: 版本号格式可能不标准
大部分工程的版本号为标准semver格式(如 1.0.26),但可能存在非标准格式。解析时只取数字部分进行比较:
def parse_version(version_str):
parts = version_str.strip().split('.')
result = []
for p in parts:
m = re.match(r'(\d+)', p)
result.append(int(m.group(1)) if m else 0)
while len(result) < 3:
result.append(0)
return tuple(result)
陷阱4: devDependencies可能不存在
部分工程的 oh-package.json5 中可能没有 devDependencies 字段,或者 devDependencies 下没有 "@ohos/hypium" 条目。这种情况下不报错(规则只检查存在的hypium版本号是否满足要求)。
输出格式
每条issue的字段:
| 字段 | 值 |
|---|---|
| rule | R021 |
| type | hypium版本号不满足要求 |
| severity | Critical |
| file | 相对路径(如arkui/xxx/oh-package.json5) |
| line | "@ohos/hypium" 所在行号 |
| testcase | - |
| snippet | "@ohos/hypium": "1.0.25" |
| suggestion | 路径: {文件路径}, 行号: {行号}, 问题描述: 在独立XTS工程 '{工程名}' 中,oh-package.json5的devDependencies.@ohos/hypium版本号为 '{版本}',低于最低要求版本 1.0.26。 |
排除规则
- 被注释掉的
@ohos/hypium条目不检查 entry/oh-package.json5等子目录文件不检查- 工程根目录下无
oh-package.json5的不检查 devDependencies中无@ohos/hypium条目的不检查
技术规范
检测范围补充说明
检查:
- 独立XTS工程根目录下的
oh-package.json5中,devDependencies.@ohos/hypium的版本号 - 版本号 <
1.0.26时报告问题
不检查:
- 被注释掉的依赖条目
- 子目录中的
oh-package.json5 - 无
@ohos/hypium条目的文件
实际案例
全仓扫描结果(版本分布):
- 1.0.26: 2954个工程(合规)
- 1.0.21: 33个工程(不合规,大部分已注释)
- 1.0.6: 18个工程(不合规,部分为活跃依赖如officeservice、web子系统)
- 1.0.24: 4个工程(不合规,如multimedia/av_codec)
- 1.0.25: 3个工程(不合规,如web子系统)
与其他规则的关系
R021与其他配置文件检查规则(R007/Test.json、R010/BUILD.gn、R012/p7b、R017/syscap.json)类似,都是检查工程配置文件中的特定字段值。区别在于:
- R021的扫描对象是
oh-package.json5(非标准JSON,支持注释和尾逗号) - R021使用正则提取而非
json.loads()解析,以兼容JSON5格式
Signals
- GitHub stars
- 34
- Forks
- 7
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
r021- Source
- github.com/openharmonyinsight/openharmony-skills