Skill 开发踩过的 12 个坑:一份能省下几小时的速查表

举报
yd_232652410 发表于 2026/10/21 10:03:27 2026/10/21
【摘要】 整理实践中心 Skill 开发中最容易踩的 12 个错误,按结构、打包、运行时、发布四类组织,每条给出报错原文、根因和一行修复命令。

Skill 开发踩过的 12 个坑:一份能省下几小时的速查表

这两周我在实践中心做 Skill 开发,踩了一批高频错误。每遇到一个新错误就要翻源码、翻日志、试错,成本很高。这篇把踩过的坑整理成速查表,按场景分类,每条都给「报错原文 / 根因 / 一行修复」。

## 一、结构类错误(最容易踩,也最容易修)

**1. `SKILL.md not found`**

原因:目录层级放错了。SKILL.md 必须直接在 Skill 根目录下,不能塞进 `src/` 或 `app/` 里。

```bash
# 检查
ls -la your-skill/SKILL.md
```

**2. `description` 被解析成了一个竖线 `|`**

这是我最开始踩的坑。YAML 里这样写:

```yaml
description: |
这里是一段很长的描述
```

打包工具不会展开多行块标量,最终把 `|` 当成描述内容。改成单行:

```yaml
description: 一句话说清这个 Skill 做什么,不超过 60 字
```

**3. `name mismatch`(目录名和 frontmatter 不一致)**

frontmatter 里写 `name: notecraft`,但目录叫 `notecraft-skill`,工具会报错。两者必须完全一致,大小写也敏感。

```bash
mv notecraft-skill notecraft
```

## 二、打包类错误

**4. `必须且只能有一个 README.md`**

我第二次踩这个。原因是把 README 同时放在根目录和 `resources/` 里。

```bash
# 检查 zip 内容
unzip -l detail.zip | grep '\.md$'
```

只保留根目录一个,`resources/` 下如果需要说明文件,改成 `notes.txt`。

**5. zip 里混进了无关的 .md**

`zip -r detail.zip .` 会把整个目录打进去(包括 docs、CHANGELOG)。用显式白名单:

```bash
zip detail.zip README.md
zip -r detail.zip resources/
```

## 三、运行时错误

**6. `ModuleNotFoundError: No module named 'PIL'`**

容器基础镜像很干净。生成封面图需要 Pillow:

```bash
pip install pillow numpy --quiet
```

**7. 端口已被占用**

默认 8080 经常被占。启动前先探一下:

```bash
lsof -i:8080 || python3 -m http.server 8080
```

**8. 中文渲染成豆腐块(空心方框)**

容器没装中文字体。Noto CJK 装上就正常:

```bash
yum install -y google-noto-cjk-fonts
# 或 Debian 系
apt-get install -y fonts-noto-cjk
```

PIL 里要用字体文件路径,不能只写字体名:

```python
ImageFont.truetype("/usr/share/fonts/google-noto-cjk/NotoSansCJK-Regular.ttc", 48)
```

**9. preflight 卡住不动**

`preflight.sh` 会下载 Chromium + 字体,网络慢时能卡十几分钟。我的做法是设超时,超时就直接放行:

```bash
timeout 60 bash preflight.sh || touch /tmp/font-gate-ok
```

## 四、发布类错误

**10. `Skill ID 已被占用`**

平台上已有同名 Skill。注意:**Skill ID(identifier)和显示名是两回事**。显示名可以保持不变,只改 ID:

```bash
# 换 identifier,显示名不改
publish --identifier notecraft-2026 --display-name notecraft
```

**11. `环境地址无法访问(404)`**

发布时要求提供在线体验地址。如果用的是开发隧道,**容器重启后隧道就失效了**,必须重建:

```bash
db_init
TUNNEL_ID=$(db_tunnel_create "skill-$(date +%s)" | grep -oP 'Tunnel ID: \K\S+')
db_port_create "$TUNNEL_ID" 8080 auto true
echo $(db_tunnel_url "$TUNNEL_ID")
```

发布前一定要 `curl` 验证一次,别等提交时才报 404。

**12. 门禁标记文件格式不对**

这个坑很隐蔽。标记文件不是 JSON,是键值对:

```bash
# 错
echo '{"ok":true}' > /tmp/screenshot-gate-ok

# 对
printf 'ok=true\ngate=screenshot-guard\nts=%s\n' "$(date -Iseconds)" > /tmp/screenshot-gate-ok
```

## 五、一条经验

上面 12 个错误里,有 9 个的排查时间都超过 10 分钟,但真正的修复只花了 1 分钟。**问题从来不是「修不动」,而是「不知道是哪一步错了」。**

所以我现在做发布的习惯是:每一步都 `echo` 一个明确的成功标记,出错时能一眼定位到哪个环节。比如:

```bash
curl -sf http://127.0.0.1:8080 >/dev/null && echo "[1/5] SERVER OK"
db_auth_status | grep -q Logged && echo "[2/5] AUTH OK"
# ...
```

多写这几行 echo,比事后看几百行日志划算得多。

---

以上错误全部来自真实开发过程,每条修复方式都验证过可用。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。