删除 suite-developer/knowledge/script-dependencies.md

This commit is contained in:
2026-07-15 15:17:57 +00:00
parent 27198554e1
commit 89253741cb
@@ -1,245 +0,0 @@
# 脚本依赖管理规范
> **归属:** SuiteForge 知识库 | `knowledge/script-dependencies.md`
> **版本:** 1.0.0
> **关联:** [脚本数据类型分类规范](./script-data-types.md)
---
## 1. 核心原则
- **gis-base 保持精干** — 只放所有脚本绝对需要的核心库
- **依赖按需加载** — 不允许在基础镜像预装所有可能的依赖
- **依赖类型决定加载策略** — 轻量运行时装、中量预构建镜像、重型发布时构建
---
## 2. gis-base 内置依赖(开箱即有)
以下库在 `gis-base` 镜像中预置,脚本无需额外声明依赖即可使用:
| 类别 | 库 | 用途 |
|------|----|------|
| Python 标准库 | `os`, `sys`, `json`, `csv`, `math`, `re`, `pathlib`, `shutil`, `subprocess`, `tempfile`, `zipfile`, `tarfile`, `uuid`, `datetime`, `logging` | 基础操作 |
| 数值计算 | `numpy` | 核心数组运算 |
| GIS 核心 | `gdal`(含 `ogr`, `osr`, `gdalconst`, `osgeo` | 栅格/矢量读写 |
| GIS 扩展 | `shapely`, `geopandas`, `pyproj`, `fiona` | 空间分析 |
| 序列化 | `orjson` | 高性能 JSON |
> **注意:** gis-base 镜像内容由平台团队维护。需要新增内置库时,请通过 Issue 提出,交 Admin 处理。
---
## 3. 依赖声明方式
### 3.1 脚本 metadata 中声明
```yaml
# scripts/run.py 同目录的 metadata.yaml
name: 读取 Excel 坐标转 Shapefile
version: 1.0.0
data_type: document/xlsx
dependencies:
# 轻量运行时依赖
pip:
- openpyxl>=3.0
- python-docx>=0.8
# 系统级依赖(apt 包)
system:
- libpdal-dev # 点云处理库
# 构建时依赖(必须通过 Dockerfile.ext 安装)
build:
# 空数组表示无构建时依赖
```
### 3.2 workflow.yaml 中声明
当在套件中直接引用脚本时,也可以在步骤级别声明:
```yaml
- id: parse-excel
type: python
script_id: run
dependencies:
pip:
- openpyxl>=3.0
```
> 步骤级声明会覆盖脚本自带的依赖声明。
---
## 4. 依赖分级处理机制
### 4.1 级别一:轻量运行时依赖(pip)
**适用场景:**
- 纯 Python 包,无编译依赖
- 体积小,安装快(< 30 秒)
- 非高频调用(偶尔使用)
**处理流程:**
```bash
# 容器启动时自动安装
docker run --rm gis-base pip install openpyxl python-docx --no-cache-dir && python /tmp/scripts/run.py
```
**限速规则:** 单次任务安装的 pip 包不超过 10 个,总安装时间不超过 60 秒。
### 4.2 级别二:中量扩展镜像(预构建)
**适用场景:**
- 经常被调用的扩展依赖
- 有编译环节的包(C 扩展)
- 安装需要 30 秒以上的
**扩展镜像命名规则:**
```
gis-ext-{功能}:latest(自托管)
```
**已规划扩展镜像:**
| 镜像名 | 包含依赖 | 典型脚本场景 |
|--------|---------|-------------|
| `gis-ext-doc` | `openpyxl`, `python-docx`, `pypdf2`, `python-pptx` | Office 文档处理 |
| `gis-ext-pointcloud` | `laspy`, `pdal`, `open3d-python` | 点云处理 |
| `gis-ext-raster` | `rioxarray`, `rasterio`, `xarray`, `scipy` | 高级栅格分析 |
| `gis-ext-geoanalysis` | `scipy`, `scikit-learn`, `statsmodels` | 空间统计分析 |
| `gis-ext-ml` | `scikit-learn`, `xgboost`, `lightgbm` | 地理空间机器学习 |
| `gis-ext-web` | `requests`, `httpx`, `aiohttp`, `beautifulsoup4` | 网络数据抓取 |
| `gis-ext-db` | `psycopg2-binary`, `sqlalchemy`, `sqlite-utils` | 数据库连接 |
**匹配逻辑(调度中心):**
```
脚本声明的 pip 依赖
调度中心匹配 → 命中扩展镜像 → 使用扩展镜像运行
→ 未命中 → 回退级别一(运行时安装)
```
匹配是取**最小子集**——如果脚本只需要 `openpyxl`,就用 `gis-ext-doc`,而不是选所有包含 `openpyxl` 的镜像。
### 4.3 级别三:重型自定义镜像(构建时)
**适用场景:**
- 深度学习框架(PyTorch, TensorFlow
- 需要 GPU 加速(CUDA 依赖)
- 专有库/商业许可库(选装)
- 安装时间 > 120 秒的
**处理方式:**
脚本发布时附带 `Dockerfile.ext`
```dockerfile
# Dockerfile.ext
FROM gis-base:latest
# 安装系统依赖
RUN apt-get update && apt-get install -y --no-install-recommends libgl1-mesa-glx && rm -rf /var/lib/apt/lists/*
# 安装 Python 依赖
RUN pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu opencv-python-headless --no-cache-dir
```
**合规检测规则:**
- `FROM` 只能引用 `gis-base:*` 系列镜像
- 不允许 `FROM` 外部镜像库(安全性)
- `RUN pip` 的来源 URL 必须在白名单内(PyPI 官方默认通过)
- `RUN apt` 来源必须在 `apt allowlist`
**CI 流水线(Cron 兜底):**
```
脚本发布 → 检测到 Dockerfile.ext
→ 合规检测通过
→ 构建自定义镜像
→ 推送到自建 Docker Registry 或 Gitea Packages OCI
→ 将镜像 ID 写入脚本 metadata
```
---
## 5. 依赖来源安全白名单
### 5.1 Python 包
| 来源 | 状态 | 说明 |
|------|------|------|
| `pypi.org`(官方) | ✅ 白名单 | 默认允许 |
| `download.pytorch.org` | ✅ 白名单 | ML 框架 |
| `github.com/releases` | ⚠️ 需审核 | 非标准包需要人工审核 |
### 5.2 系统包(apt
| 来源 | 状态 | 说明 |
|------|------|------|
| `archive.ubuntu.com` | ✅ 白名单 | Ubuntu 官方源 |
| `security.ubuntu.com` | ✅ 白名单 | 安全更新 |
| `ppa.launchpad.net` | ❌ 禁止 | PPA 源不稳定 |
---
## 6. 常见场景参考
| 脚本要做什么 | 推荐方案 | 依赖示例 |
|------------|---------|---------|
| 读取 Excel 坐标转点 | 级别一 | `openpyxl` |
| PDF 空间信息提取 | 级别一 | `pypdf2` |
| 点云格式转换(LAS → LAZ)| 级别二 | 预置 `gis-ext-pointcloud` |
| 地形分析(坡度/坡向)| 内置 | `numpy` + `gdal` 已内置 |
| 地理空间分类模型 | 级别二 | 预置 `gis-ext-geoanalysis` |
| 遥感影像深度学习分类 | 级别三 | `torch`, `opencv` |
| 企业微信消息推送 | 级别一 | `requests` 已内置 |
| 大量 GeoJSON 合并 | 内置 | `geopandas` 已内置 |
---
## 7. 镜像更新策略
### 扩展镜像
- 每月重建一次(拉取最新安全更新)
- 有 CVE 时立即重建
- 版本锁定的包如无必要不升级大版本
### gis-base
- 仅在有架构级更新时重建
- 版本变更需经过完整回归测试
- 历史版本保留至少 3 个次要版本
### 自定义镜像
- 由脚本开发者管理版本
- 重新发布脚本时自动重建
- 无自动更新,需要开发者主动重新发布
---
## 8. 开发者工作流(供 SuiteForge 参考)
```
1. 想清脚本需要什么依赖
2. 查 gis-base 内置列表 → 已有的不声明
3. 查扩展镜像列表 → 匹配的用级别二
4. 都不行 → 看看能不能用轻量安装(级别一)
5. 真不行 → 写 Dockerfile.ext(级别三)
6. 完成 metadata.yaml 声明
7. 通过 API 发布(详见套件发布指南)
```
**SuiteForge 应在初始化套件时根据脚本内容自动推断依赖**,无需开发者手动填写 metadata。开发者只需要告诉 SuiteForge "我想处理 Excel 文件",剩下的由 Agent 完成。
---
## 9. 与相关服务的关系
| 服务 | 对接方式 |
|------|---------|
| **合规检测服务** | 读取 dependencies 字段 + Dockerfile.ext 进行安全校验 |
| **调度中心** | 根据依赖选择镜像层次(base / ext / custom |
| **构建流水线(Cron** | 检测到 Dockerfile.ext 时触发自定义镜像构建 |
| **镜像仓库(Registry** | 存储 gis-base、扩展镜像、自定义镜像 |