openharmony-error-detection
10
总安装量
9
周安装量
#30876
全站排名
安装命令
npx skills add https://github.com/mengfei0053/skills --skill openharmony-error-detection
Agent 安装分布
opencode
7
claude-code
6
gemini-cli
5
codex
5
trae
4
github-copilot
4
Skill 文档
OpenHarmony åºç¨éè¯¯æ£æµ
æ¦è¿°
OpenHarmonyåºç¨å¼åéè¦ç³»ç»åçéè¯¯æ£æµæºå¶ãéè¿ä¸å±æ£æµï¼lint â åå æµè¯ â ç¼è¯ï¼åæ¶åç°é误ï¼å¹¶éè¿èªå¨åçç½ç»æç´¢åææ¡£æ¥æ¾å¿«éå®ä½åä¿®å¤é®é¢ã
æ ¸å¿ååï¼ å¿«é失败ãèªå¨ä¿®å¤ãæç»éªè¯
éè¯¯æ£æµæµç¨
digraph error_detection {
"代ç åæ´" [shape=diamond];
"Lintæ£æ¥" [shape=box];
"Lintéè¿?" [shape=diamond];
"åå
æµè¯" [shape=box];
"æµè¯éè¿?" [shape=diamond];
"ç¼è¯æå»º" [shape=box];
"ç¼è¯éè¿?" [shape=diamond];
"ä¿®å¤Linté误" [shape=box, style=dashed];
"ä¿®å¤æµè¯é误" [shape=box, style=dashed];
"ä¿®å¤ç¼è¯é误" [shape=box, style=dashed];
"èªå¨æç´¢åä¿®å¤" [shape=box, style=filled, fillcolor=lightblue];
"ä¿®å¤æå" [shape=box, style=filled, fillcolor=lightgreen];
"ç»§ç»å¼å" [shape=doublecircle];
"代ç åæ´" -> "Lintæ£æ¥";
"Lintæ£æ¥" -> "Lintéè¿?";
"Lintéè¿?" -> "åå
æµè¯" [label="æ¯"];
"Lintéè¿?" -> "ä¿®å¤Linté误" [label="å¦", style=dashed];
"ä¿®å¤Linté误" -> "èªå¨æç´¢åä¿®å¤";
"åå
æµè¯" -> "æµè¯éè¿?";
"æµè¯éè¿?" -> "ç¼è¯æå»º" [label="æ¯"];
"æµè¯éè¿?" -> "ä¿®å¤æµè¯é误" [label="å¦", style=dashed];
"ä¿®å¤æµè¯é误" -> "èªå¨æç´¢åä¿®å¤";
"ç¼è¯æå»º" -> "ç¼è¯éè¿?";
"ç¼è¯éè¿?" -> "ä¿®å¤æå" [label="å¦", style=dashed];
"ä¿®å¤ç¼è¯é误" -> "èªå¨æç´¢åä¿®å¤";
"ç¼è¯éè¿?" -> "ä¿®å¤æå" [label="æ¯"];
"èªå¨æç´¢åä¿®å¤" -> "ä¿®å¤æå";
"ä¿®å¤æå" -> "ç»§ç»å¼å";
}
å¿«éåè
| æ£æµé¶æ®µ | å·¥å ·/å½ä»¤ | ç®ç | å ¸åé误类å |
|---|---|---|---|
| Lint | hvigorw lint æ npm run lint |
代ç è§èæ£æ¥ | æ ¼å¼é®é¢ãæªä½¿ç¨åéãç±»åé®é¢ |
| åå æµè¯ | hvigorw test æ npm test |
åè½æ£ç¡®æ§éªè¯ | é»è¾é误ãè¾¹çæ¡ä»¶ãéæé®é¢ |
| ç¼è¯æå»º | hvigorw assembleHap |
坿§è¡æ§éªè¯ | è¯æ³é误ãä¾èµç¼ºå¤±ãAPIä¸å ¼å®¹ |
第ä¸é¶æ®µï¼Lintæ£æ¥
è¿è¡Lint
# 使ç¨hvigorwè¿è¡lint
hvigorw --no-daemon app:lintDebug
# æä½¿ç¨npmèæ¬
npm run lint
常è§Linté误åä¿®å¤
| é误类å | ç¤ºä¾ | ä¿®å¤æ¹æ³ |
|---|---|---|
| æªä½¿ç¨åé | let x: number = 10; |
å é¤åéæä½¿ç¨ // eslint-disable-next-line |
| ç±»åä¸å¹é | let x: string = 10; |
ä¿®æ£ç±»å声ææè½¬æ¢ç±»å |
| 缺å°ç±»å注解 | let x = 10; |
æ·»å ç±»åæ³¨è§£ let x: number = 10; |
| ArkTSä¸¥æ ¼æ¨¡å¼ | 使ç¨JSç¹æ§ | æ¿æ¢ä¸ºArkTSå ¼å®¹åæ³ |
| ä»£ç æ ¼å¼ | 缩è¿ä¸ç»ä¸ | è¿è¡ npm run lint -- --fix èªå¨ä¿®å¤ |
èªå¨åLintä¿®å¤
# èªå¨ä¿®å¤å¯ä¿®å¤çlinté误
npm run lint -- --fix
第äºé¶æ®µï¼åå æµè¯
ç¼åæµè¯ç¨ä¾
// example.test.ets
import { describe, it, expect } from '@ohos/hypium';
export default function exampleTest() {
describe('MathUtils', () => {
it('should add two numbers correctly', () => {
const result = add(2, 3);
expect(result).assertEqual(5);
});
it('should handle zero', () => {
const result = add(0, 0);
expect(result).assertEqual(0);
});
});
}
è¿è¡æµè¯
# è¿è¡æææµè¯
hvigorw --no-daemon test
# è¿è¡ç¹å®æµè¯
hvigorw --no-daemon test --tests example.test.ets
# çæè¦ççæ¥å
hvigorw --no-daemon test --coverage
æµè¯æä½³å®è·µ
- æµè¯å½åï¼
should + å¨ä½ + ææç»æ - è¾¹çæµè¯ï¼ æµè¯0ã空å¼ãæå¤§æå°å¼
- 弿¥æµè¯ï¼ 使ç¨
async/awaitådoneåè° - Mockä¾èµï¼ é离å¤é¨ä¾èµåUIç»ä»¶
第ä¸é¶æ®µï¼ç¼è¯æå»º
ç¼è¯å½ä»¤
# Debug模å¼ç¼è¯
hvigorw assembleHap
# Release模å¼ç¼è¯
hvigorw assembleHap --mode release
# æ¸
çæå»ºç¼å
hvigorw clean
常è§ç¼è¯é误åä¿®å¤
| é误类å | ç¤ºä¾ | ä¿®å¤æ¹æ³ |
|---|---|---|
| APIä¸å ¼å®¹ | ä½¿ç¨æªå¼å ¥çAPI | æ£æ¥APIçæ¬éå¶ï¼æ´æ°é ç½® |
| ä¾èµç¼ºå¤± | Module not found |
å®è£
缺失çä¾èµ ohpm install |
| ç±»åé误 | ç±»åæ¨æå¤±è´¥ | æ·»å æ¾å¼ç±»å注解 |
| èµæºæä»¶é误 | å¾ç/èµæºä¸åå¨ | æ£æ¥èµæºè·¯å¾ååç§° |
| ç¾åé®é¢ | è¯ä¹¦è¿ææé ç½®é误 | æ´æ°ç¾åé ç½® |
第åé¶æ®µï¼é误èªå¨æç´¢åä¿®å¤
èªå¨åä¿®å¤æµç¨
彿£æµå°é误åï¼èªå¨æ§è¡ä»¥ä¸æç´¢çç¥ï¼
// é误å¤çæµç¨ä¼ªä»£ç
async function handleError(error: Error) {
// 1. æåé误å
³é®è¯
const keywords = extractErrorKeywords(error.message);
// 2. æç´¢æ¬å°ææ¡£
const localDocs = searchLocalDocs(keywords);
// 3. æç´¢OpenHarmony宿¹ææ¡£
const officialDocs = searchOfficialDocs(keywords);
// 4. æç´¢ç½ç»èµæº
const webResults = searchWeb(keywords);
// 5. 综ååæå¹¶çæä¿®å¤å»ºè®®
const fixSuggestion = analyzeAndSuggest(error, localDocs, officialDocs, webResults);
// 6. åºç¨ä¿®å¤
await applyFix(fixSuggestion);
}
æç´¢çç¥
1. æ¬å°ææ¡£æç´¢
# æç´¢æ¬å°OpenHarmonyææ¡£
find docs-OpenHarmony* -type f -name "*.md" | xargs grep -l "é误å
³é®è¯"
2. 宿¹ææ¡£æç´¢
å¨çº¿ææ¡£ï¼
- OpenHarmonyåºç¨å¼å: https://docs.openharmony.cn/application-dev/
- APIåè: https://docs.openharmony.cn/application-dev/reference/
- 常è§é®é¢: https://docs.openharmony.cn/faq/
æç´¢å ³é®è¯æ¨¡å¼ï¼
- éè¯¯æ¶æ¯ä¸çå ³é®çè¯
- APIåç§° + “not found” / “undefined”
- ç¼è¯å¨é误代ç
- “ArkTS” + ç¹æ§åç§°
3. ç½ç»èµæºæç´¢
æç´¢æ¸ éï¼
- OpenHarmony Gitee社åº: https://gitee.com/openharmony
- OpenHarmony宿¹è®ºå: https://developer.openharmony.cn/
- Stack Overflow: æç´¢ “OpenHarmony” + å ³é®è¯
常è§é误æç´¢æ¨¡å¼
| é误类å | æç´¢å ³é®è¯ | é¢æç»ææ¥æº |
|---|---|---|
| APIçæ¬é误 | API 12+ XXX not found |
APIåèææ¡£ |
| ç±»åé误 | Type 'XXX' is not assignable to type 'YYY' |
ArkTSè¯æ³æå |
| æå»ºé误 | hvigorw build failed XXX |
æå»ºå·¥å ·ææ¡£ |
| æéé误 | Permission denied XXX |
æéç®¡çææ¡£ |
| UI渲æé误 | Component render error XXX |
UIç»ä»¶ææ¡£ |
èªå¨ä¿®å¤å®ç°
ä¿®å¤èæ¬ç¤ºä¾
import { readFile, writeFile } from '@kit.ArkTS';
async function autoFixError(filePath: string, errorPattern: string, fixPattern: string) {
const content = await readFile(filePath);
if (content.includes(errorPattern)) {
const fixedContent = content.replace(new RegExp(errorPattern, 'g'), fixPattern);
await writeFile(filePath, fixedContent);
console.info(`Fixed error in ${filePath}`);
}
}
// 使ç¨ç¤ºä¾
await autoFixError(
'entry/src/main/ets/pages/Index.ets',
'let x = 10;',
'let x: number = 10;'
);
æ¹éä¿®å¤å·¥å ·
# æ¹éä¿®å¤TypeScriptç±»åé误
find . -name "*.ets" -exec sed -i '' 's/let \([a-zA-Z_][a-zA-Z0-9_]*\) = \([0-9]\+\);/let \1: number = \2;/g' {} \;
# æ¹éæ·»å æ¾å¼ç±»å注解
find . -name "*.ets" -exec sed -i '' 's/const \([a-zA-Z_][a-zA-Z0-9_]*\) = \[/\const \1: Array<unknown> = [/g' {} \;
宿´çéè¯¯æ£æµèæ¬
import { exec } from '@kit.ArkTS';
class OpenHarmonyErrorDetector {
async detectAndFix() {
console.info('å¼å§éè¯¯æ£æµæµç¨...');
// é¶æ®µ1: Lintæ£æ¥
const lintResult = await this.runLint();
if (!lintResult.success) {
await this.autoSearchAndFix(lintResult.errors);
return; // ä¿®å¤åéæ°å¼å§
}
// é¶æ®µ2: åå
æµè¯
const testResult = await this.runTests();
if (!testResult.success) {
await this.autoSearchAndFix(testResult.errors);
return;
}
// é¶æ®µ3: ç¼è¯æå»º
const buildResult = await this.build();
if (!buildResult.success) {
await this.autoSearchAndFix(buildResult.errors);
return;
}
console.info('æææ£æ¥éè¿ï¼');
}
private async runLint(): Promise<{ success: boolean; errors: string[] }> {
try {
const result = await exec('hvigorw --no-daemon app:lintDebug');
return { success: true, errors: [] };
} catch (error) {
return { success: false, errors: this.parseErrors(error) };
}
}
private async runTests(): Promise<{ success: boolean; errors: string[] }> {
try {
const result = await exec('hvigorw --no-daemon test');
return { success: true, errors: [] };
} catch (error) {
return { success: false, errors: this.parseErrors(error) };
}
}
private async build(): Promise<{ success: boolean; errors: string[] }> {
try {
const result = await exec('hvigorw assembleHap');
return { success: true, errors: [] };
} catch (error) {
return { success: false, errors: this.parseErrors(error) };
}
}
private async autoSearchAndFix(errors: string[]) {
console.info('åç°é误ï¼å¼å§èªå¨æç´¢åä¿®å¤...');
for (const error of errors) {
const keywords = this.extractKeywords(error);
const fix = await this.searchFix(keywords);
if (fix) {
await this.applyFix(fix);
}
}
}
private extractKeywords(error: string): string[] {
// æåé误å
³é®è¯
return error.split(/\s+/).filter(word => word.length > 3);
}
private async searchFix(keywords: string[]): Promise<string | null> {
// å®ç°æç´¢é»è¾ï¼æ¬å°ææ¡£ + 宿¹ææ¡£ + ç½ç»ï¼
return null;
}
private async applyFix(fix: string) {
// åºç¨ä¿®å¤
console.info(`åºç¨ä¿®å¤: ${fix}`);
}
private parseErrors(error: unknown): string[] {
// è§£æéè¯¯æ¶æ¯
return [error as string];
}
}
// 使ç¨
const detector = new OpenHarmonyErrorDetector();
await detector.detectAndFix();
常è§é®é¢
| é®é¢ | åå | è§£å³æ¹æ¡ |
|---|---|---|
| Lintä¿®å¤åæµè¯å¤±è´¥ | ä¿®å¤å¼å ¥äºæ°çé»è¾é误 | 鿰审æ¥ä¿®æ¹ï¼ç¡®ä¿é»è¾æ£ç¡® |
| æµè¯éè¿ä½ç¼è¯å¤±è´¥ | æµè¯æªè¦çææä»£ç è·¯å¾ | å¢å æµè¯è¦ççï¼æ£æ¥ç±»åå®å ¨ |
| ç¼è¯æåä½åºç¨å´©æº | è¿è¡æ¶é误æªå¨ç¼è¯æ¶æ£æµ | æ·»å è¿è¡æ¶æ£æ¥åæ¥å¿ |
| èªå¨æç´¢æ ç»æ | éè¯¯å ³é®è¯æåä¸åç¡® | æå¨è°æ´æç´¢å ³é®è¯ |
| ä¿®å¤æ¹æ¡ä¸éç¨ | çæ¬æAPIå·®å¼ | æ£æ¥OpenHarmonyçæ¬åAPIå ¼å®¹æ§ |
æä½³å®è·µ
- é¢ç¹è¿è¡æ£æ¥ï¼ æ¯æ¬¡ä»£ç åæ´åç«å³è¿è¡lintåæµè¯
- å°æ¥æäº¤ï¼ æ¯æ¬¡æäº¤åç¡®ä¿æææ£æ¥éè¿
- æç»éæï¼ å¨CI/CDä¸éæèªå¨åæ£æ¥æµç¨
- ææ¡£ä¼å ï¼ éå°é®é¢æ¶å æ¥é 宿¹ææ¡£
- çæ¬ä¸è´ï¼ ç¡®ä¿ææ¡£åAPIçæ¬ä¸é¡¹ç®çæ¬ä¸è´
- é误æ¥å¿ï¼ ä¿ç宿´çé误æ¥å¿ç¨äºåç»åæ
åèèµæº
宿¹ææ¡£ï¼
- OpenHarmonyå¼åæå: https://docs.openharmony.cn/application-dev/
- æå»ºå·¥å ·: https://docs.openharmony.cn/application-dev/ide/
- æµè¯æ¡æ¶: https://docs.openharmony.cn/application-dev/test/
社åºèµæºï¼
- OpenHarmony Gitee: https://gitee.com/openharmony
- å¼åè 社åº: https://developer.openharmony.cn/
- é®é¢è¿½è¸ª: https://gitee.com/openharmony/community/issues