Files
sap-cli-skill/SKILL.md
T

8.4 KiB
Raw Blame History

name, description, version, author, license
name description version author license
sap-cli Use when you need to operate SAP ABAP development objects — syncing code, querying metadata, managing transports, reading tables, or any task involving SAP ADT REST API. Trigger on: ABAP objects, SAP development, transport requests, DDIC types, SE11/SE16N/SE38/SE80 equivalents, 'sync to SAP', 'download from SAP', 'activate ABAP', 'read SAP table'. NOT for developing sap-cli itself. 2.2.0 WuRangyu MIT

sap-cli — SAP ABAP 开发对象管理工具

sap-cli 是一个 Python CLI,封装 SAP ADT REST API,让你在终端完成 ABAP 开发对象的完整生命周期管理。

核心工作流:download → 本地编辑 → sync 回 SAP


首次使用:安装与配置

第 1 步:安装 sap-cli

如果 python main.py --help 无法执行,先运行安装脚本:

python <SKILL_DIR>/scripts/setup.py install

此脚本会:

  1. 安装依赖(requests
  2. 将 sap-cli 安装为可编辑的 Python 包
  3. 创建配置文件模板

安装完成后验证:

python main.py --help

第 2 步:配置 SAP 连接

编辑配置文件 assets/config.ini(从 config.ini.example 复制):

[SAP]
host = http://your-sap-server:8000
client = 100
user = your_username
password = your_password

也可通过环境变量配置(优先级高于配置文件):

  • SAP_HOST / SAP_CLIENT / SAP_USER / SAP_PASSWORD

第 3 步:验证连接

python main.py config show
python main.py transport list

调用方式

cd <SKILL_DIR>/assets && python main.py <command> [options]

全局参数(在命令之前):

参数 说明
--profile <name> 使用指定配置 profile
--verify-ssl 启用 SSL 验证(默认关闭)

命令速查

CRUD(对象生命周期)

# 创建新对象
python main.py create --name ZMY_CLASS --type class --corr_nr DEVK901XXX
python main.py create --name ZMY_DOMAIN --type domain --definition domain.json --corr_nr DEVK901XXX

# 查询元数据
python main.py info --name ZMY_CLASS --type class

# 下载源码
python main.py download --name ZMY_CLASS --type class --path ./src

# 同步到 SAPlock → write → unlock → syntax check → activate
python main.py sync --name ZMY_CLASS --type class --path ./src/zmy_class.abap --corr_nr DEVK901XXX

# 删除对象
python main.py delete --name ZMY_CLASS --type class

# 单独激活(sap-cli 内置 NW 7.40 double-activate
python main.py activate --name ZMY_CLASS --type class --corr_nr DEVK901XXX

create 关键参数

参数 说明
--description 对象描述
--source <.abap> 自定义源码文件
--definition <.json> DDIC 定义文件(domain/dataelement/table/structure/tabletype
--package <name> SAP 包(默认 $TMP
--corr_nr 传输请求号

批量操作

# 初始化项目结构
python main.py init --path ./my_project

# 刷新对象状态
python main.py refresh --path ./my_project

# 批量同步(自动按依赖拓扑排序)
python main.py sync --all --path ./my_project --corr_nr DEVK901XXX
python main.py sync --all --path ./my_project --corr_nr DEVK901XXX --dry-run

依赖排序:domain(10) → dataelement(20) → table(30) → tabletype(40) → interface(50) → class(60) → function(70) → report(80)

数据查询

# 表结构(SE11 等价)
python main.py show-table --name ZMY_TABLE

# 表数据(SE16N 等价)
python main.py read-table --name ZMY_TABLE
python main.py read-table --name ZMY_TABLE --fields "FIELD1,FIELD2" --where "FIELD1 = 'X'" --max-rows 50

# 列出对象
python main.py list --type class --package ZSAPILOT

# Where-Used
python main.py whereused --name ZMY_CLASS --type class

# 源码搜索
python main.py search --query "CALL FUNCTION 'Z_MY_FUNC'"

远程执行

# 执行 ABAP 程序(SA38 等价)
python main.py run-program --name ZSAPILOT_SETUP

# 本地 vs SAP 差异
python main.py diff --name ZMY_CLASS --type class --path ./src/zmy_class.abap

传输请求

python main.py transport list
python main.py transport info --corr_nr DEVK901XXX
python main.py transport release --corr_nr DEVK901XXX
python main.py transport objects --corr_nr DEVK901XXX

配置与认证

python main.py config show
python main.py config list-profiles
python main.py config set host s4h.example.com
python main.py auth login      # 密码保存到 keyring
python main.py auth status

其他

python main.py check --name ZMY_CLASS --type class          # ATC 检查
python main.py format --name ZMY_CLASS --type class         # Pretty Printer
python main.py package create --name ZSAPILOT               # 创建包
python main.py cds download --name ZMY_CDS --path ./src     # CDS View
python main.py analyze --path ./src                          # 依赖分析
python main.py scaffold --name ZMY_RPT --template alv-report  # 项目模板
# 模板: alv-report, bapi-wrapper, interface-class, data-model

支持的对象类型(16 种)

分类 类型 有源码
程序 report, include
OOP class, interface
函数 function
DDIC 基础 domain, dataelement, table, structure
DDIC 扩展 cdsview, view
DDIC 无源码 tabletype, messageclass, searchhelp, lockobject
程序组 functiongroup

函数命名格式:必须使用 组名/模块名 格式,如 ZMY_FGROUP/Z_MY_FUNC


常用工作流

1. 单对象编辑同步

python main.py download --name ZMY_CLASS --type class --path ./src
# 用编辑器修改 ./src/zmy_class.abap
python main.py sync --name ZMY_CLASS --type class --path ./src/zmy_class.abap --corr_nr DEVK901XXX

2. 批量项目同步

python main.py init --path ./my_project
# 添加对象到 src/ 目录
python main.py sync --all --path ./my_project --corr_nr DEVK901XXX

3. DDIC 对象创建

# 准备 JSON 定义文件
python main.py create --name ZMY_DOMAIN --type domain --definition domain.json --corr_nr DEVK901XXX

4. 数据查询

python main.py show-table --name ZMY_TABLE           # 结构
python main.py read-table --name ZMY_TABLE --max-rows 100  # 数据

5. 远程执行 ABAP 程序

python main.py run-program --name ZSAPILOT_SETUP

⚠️ 使用约束(必须遵守)

详细规则见 references/sap-tool-constraints.mdreferences/error-handling.md

  1. 只使用 python main.py <命令> 操作 SAP — 禁止用 requests、curl 直接调 ADT/SOAP
  2. 禁止修改 SAP 标准对象CL_*SAPL* 等)— 只允许只读操作
  3. 禁止未授权操作系统表TADIR、E071、SEOCLASS 等)— SELECT 诊断可以
  4. sync 必须带 --corr_nr — 否则触发交互提示
  5. NW 7.40 DDIC Lock 返回 HTTP 406 — 系统限制,报告用户去 SE09

常见问题速查

问题 原因 解决
HTTP 406DDIC Lock NW 7.40 不支持 DDIC ADT Lock 报告用户 → SE09
HTTP 403Locked 残留 enqueue lock 先试 run-program 清锁,不行 → SM12
HTTP 400SaveFailure 类 DEFINITION 与 SAP 不一致 对比本地 vs SAP 源码
HTTP 423Transport lock 对象绑定在传输请求中 报告用户 → SE09
激活失败 NW 7.40 ADT 限制 sap-cli 内置 double-activate,仍失败 → SE09
WITH EMPTY KEY dump NW 7.40 不支持 改用 WITH NON-UNIQUE KEY
函数名格式错误 缺少 / 分隔符 使用 ZGROUP/Z_FUNC 格式

NW 7.40 兼容性

  • DDIC LockHTTP 406,无法通过 ADT 锁定 DDIC 对象
  • 激活误报:首次激活可能报失败但实际成功,sap-cli 已内置 double-activate
  • ABAP 语法限制:不支持字符串模板 |...|、inline 声明 DATA(...)WITH EMPTY KEY
  • CSRF Token:所有写操作必须携带,sap-cli 自动处理

分发与安装(团队成员)

方式 1Hermes Agent

git clone <gitee-url> ~/AppData/Local/hermes/skills/productivity/sap-cli
python ~/AppData/Local/hermes/skills/productivity/sap-cli/scripts/setup.py all

方式 2Claude Code

git clone <gitee-url> ~/.claude/skills/sap-cli
python ~/.claude/skills/sap-cli/scripts/setup.py all

安装后验证:

cd <SKILL_DIR>/assets && python main.py --help