项目
项目就是一个包含 sprig.toml 的目录。单文件模式永久保留: 显式文件在项目 source root 之外时不使用 manifest;在 root 内时仍使用该项目依赖图, 需要当前 lockfile。
目录与默认值
text
project/
├── sprig.toml
├── src/
│ └── main.spr
└── build/toml
[project]
name = "hello"
version = "0.1.0"
language = "0.8"source 默认为 src,entry 默认为 src/main.spr,都可以在 [project] 中覆盖。包名来自 manifest——.spr 源码不写 package。
创建与查看
bash
sprig init # 创建 sprig.toml 与 src/main.spr,绝不覆盖已有文件
sprig project # 人类可读摘要
sprig project --jsonproject --json 输出 root、name、version、language、源码根、入口、binaries、 exports、manifest 与 lockfile 路径、lock 状态与声明的依赖,Agent 无需自己解析 TOML。
运行项目
bash
sprig check # 检查项目入口
sprig build
sprig run
sprig run --bin server
sprig run path/to/file.spr # 显式文件优先于项目发现
sprig test # 运行 tests/ 下的普通 Sprig 程序项目发现会从当前目录向上查找。[[bin]] 声明命名入口:
toml
[[bin]]
name = "server"
entry = "src/server.spr"Beta SDK 中的 sprig test 使用相同的锁定依赖图,以诊断码核对预期编译失败; 参见测试契约(英文)。
依赖
本地路径与 Git 的 Sprig 依赖已经可以真正解析:编辑 sprig.toml 后运行 sprig resolve。
toml
[[dependency]]
name = "math"
path = "../math"toml
[[dependency]]
name = "math"
git = "https://example.com/math.git"
branch = "main"name是包内导入别名;依赖自己的[project] name是独立的身份元数据。sprig resolve生成确定性的sprig.lock(建议提交)。check/build/run拒绝缺失或过期的 lock,并且绝不会自己移动 Git 分支——只有resolve会。- Git 依赖锁定到精确 commit SHA;分支后续移动不会改变已锁定的构建。
- 用
import "@math/vector.spr" as vector导入被 export 的模块;只有exports列出的模块可被外部导入,路径会 canonicalize,无法逃出依赖源码根。 --offline只使用 Git 缓存(~/.sprig/git),缓存缺 revision 时以SPR-DEP-OFFLINE明确失败。- 依赖环与同一包内重复别名会被拒绝;不同包可使用相同别名。
- lock schema 5 使用
root/@a/@util标识依赖边,并为相对本地依赖记录 owner-relative locator(portable = true,可整体搬迁);绝对路径声明保持portable = false。schema 1–4 要求显式重新 resolve。lock 校验 compiler identity;bundled@std来自安装的 SDK,不记录在 project lock 中。 - symlink 通过 real path 检查;根内且逻辑路径被 export 的 symlink 允许。
- Git 缓存验证 HEAD、marker 与 tracked/untracked 内容;修改会明确失败。
Maven/JVM 依赖已实现。[[jvm]] 声明精确 release 坐标,resolve 后 check/build/run/api/doctor 自动使用锁定 JAR。 Apache Resolver 处理父 POM、BOM 和传递依赖。Schema-5 记录 JAR/POM SHA-256、图、顺序与本地 locator。 离线需要完整缓存;消费命令不会重新解析。见 依赖契约。
