📦 OpenClaw Skill依赖管理

你的Skill要调用另一个Skill,那个Skill又依赖第三个Skill...这不就是npm吗?是的,依赖管理是复杂系统逃不掉的课题。管好了是模块化,管不好是依赖地狱。

依赖类型

1. Skill依赖

一个Skill调用另一个Skill的功能。

# skills/content-pipeline.yaml
name: content-pipeline
description: 内容生产流水线

dependencies:
  skills:
    - name: web-search
      version: '>=1.0.0'
      optional: false
      
    - name: content-humanizer
      version: '^2.1.0'
      optional: false
      
    - name: seo-optimizer
      version: '~1.5.0'
      optional: true  # 可选依赖

2. 工具依赖

Skill需要的外部工具或API。

dependencies:
  tools:
    - name: pandoc
      version: '>=2.0'
      install: 'brew install pandoc'
      
    - name: ffmpeg
      version: '>=4.0'
      install: 'apt-get install ffmpeg'

3. 库依赖

编程语言库依赖。

dependencies:
  python:
    - openai>=1.0.0
    - pandas>=2.0.0
    - numpy>=1.24.0
    
  node:
    - axios: '^1.6.0'
    - cheerio: '^1.0.0'

版本语法

使用语义化版本(SemVer):

语法含义示例
精确版本必须完全匹配1.2.3
^版本兼容版本(主版本相同)^1.2.3 → 1.x.x
~版本近似版本(主+次版本相同)~1.2.3 → 1.2.x
>=版本大于等于>=1.2.0
范围版本区间>=1.0.0 <2.0.0

依赖解析

依赖树

content-pipeline@2.0.0
├── web-search@1.5.0
│   ├── http-client@3.0.0
│   └── cache@1.2.0
├── content-humanizer@2.1.0
│   ├── nlp-utils@1.0.0
│   └── tokenizer@2.0.0
└── seo-optimizer@1.5.0 (optional)
    └── keyword-extractor@1.0.0

冲突解决

// 依赖冲突解决策略
function resolveConflict(dep1, dep2) {
  // 策略1:选择最新版本
  if (dep1.version > dep2.version) {
    return dep1;
  }
  
  // 策略2:检查兼容性
  if (isCompatible(dep1.version, dep2.requiredRange)) {
    return dep1;
  }
  
  // 策略3:报错让用户决定
  throw new DependencyConflict(
    `依赖冲突: ${dep1.name} 需要 ${dep1.version}, 但 ${dep2.parent} 需要 ${dep2.requiredRange}`
  );
}

自动安装

// 安装Skill依赖
async function installDependencies(skillPath) {
  const skill = await loadSkill(skillPath);
  const deps = skill.dependencies;
  
  // 安装Skill依赖
  for (const dep of deps.skills) {
    if (!await isInstalled(dep.name, dep.version)) {
      console.log(`安装 ${dep.name}@${dep.version}...`);
      await installSkill(dep.name, dep.version);
    }
  }
  
  // 安装工具依赖
  for (const tool of deps.tools) {
    if (!await checkToolExists(tool.name)) {
      console.log(`安装工具 ${tool.name}...`);
      await exec(tool.install);
    }
  }
  
  // 安装库依赖
  if (deps.python) {
    await exec(`pip install ${deps.python.join(' ')}`);
  }
  if (deps.node) {
    await exec(`npm install ${deps.node.join(' ')}`);
  }
}

锁定文件

类似package-lock.json,锁定实际安装的版本:

# skill-lock.yaml
version: 1
generated: 2026-04-29T01:00:00Z

skills:
  web-search:
    version: 1.5.2
    resolved: clawhub://skills/web-search@1.5.2
    integrity: sha256-abc123...
    dependencies:
      http-client: 3.0.1
      cache: 1.2.0
      
  content-humanizer:
    version: 2.1.1
    resolved: clawhub://skills/content-humanizer@2.1.1
    integrity: sha256-def456...

最佳实践

✅ DO

❌ DON'T

常见问题

Q: 依赖安装失败怎么办?

# 检查依赖状态
openclaw skill check-deps content-pipeline

# 强制重新安装
openclaw skill install content-pipeline --force

# 查看详细错误
openclaw skill install content-pipeline --verbose

Q: 如何更新依赖?

# 检查可更新
openclaw skill outdated content-pipeline

# 更新到最新兼容版本
openclaw skill update content-pipeline

# 更新到最新版本(可能破坏兼容)
openclaw skill update content-pipeline --latest

Q: 如何解决版本冲突?

# 查看依赖树
openclaw skill tree content-pipeline

# 查看冲突详情
openclaw skill conflicts content-pipeline

# 手动指定版本
openclaw skill install content-pipeline --override web-search@1.4.0

最后更新:2026-04-29 | 作者:妙趣AI