# `deft` 二进制
`deft` 二进制是 TUI 之外一切功能的唯一入口:运行脚本、REPL、测试、格式化以及包管理器。它编译为单个自包含的可执行文件,无外部依赖。
## 子命令
```
deft <script>.dft Run a script file
deft repl Start the REPL
deft test [files...] Run tests
deft fmt [files...] Format source files
deft pkg <subcommand> Package manager
deft sandbox <subcmd> Manage landlock sandbox paths
deft init [name] Scaffold a new Deft project
deft --version
deft --help
````
## 运行脚本
```
$ deft hello.dft Alice
Hello, Alice!
````
带上 shebang 后,脚本可直接执行:
#!/usr/bin/env deft set a [os/args] echo "Hello, $(a(1))!"
```
$ chmod +x hello.dft
$ ./hello.dft Alice
Hello, Alice!
````
### 命令行参数
脚本名之后的参数可通过 `os/args` 获取:
def argv [os/args] def script-name $argv(first) def user-args $argv(rest)
### 退出码
`os/exit $n` 以状态码 `$n` 退出。默认为 0(成功)。
if not([fs/exists? "config.json"]) { echo "missing config" os/exit 1 }
## 测试运行器
```
$ deft test # all tests under ./test/
$ deft test test/test_sqlite.dft # one file
$ deft test test/test_refs.dft test/test_lazy_seq.dft
````
测试以 `defsuite` / `deftest` 块组织(见测试)。匹配 `test_*.dft` 的文件会被自动发现。运行器打印每个测试的通过/失败及断言消息,然后给出汇总。
## 格式化工具
```
$ deft fmt myfile.dft # in-place
$ deft fmt src/ # whole directory
$ deft fmt --check myfile.dft # exit 1 if not formatted
````
统一空白、缩进与结尾换行。适用于 pre-commit 钩子和 CI。
## 包管理器
```
$ deft pkg install owner/name
$ deft pkg install owner/name@1.2.0
$ deft pkg uninstall owner/name
$ deft pkg list
$ deft pkg available
$ deft pkg info owner/name
$ deft pkg registry <url> # switch registry
$ deft pkg registry # show current
````
底层 `pkg/*` 标准库函数与包清单格式参见包。
## 沙箱
`deft sandbox` 管理存储在 `.deft/prelude.dft` 中 `:sandbox {:readonly @[...] :writable @[...]}` 下的 Landlock 路径列表:
```
$ deft sandbox list # show read-only and writable lists
$ deft sandbox add /srv/data # add a read-only path
$ deft sandbox add ~/code/tmp -w # add a writable path (-w/--writable)
$ deft sandbox remove /srv/data # remove from either list
````
路径支持开头的 `~`(应用沙箱时展开为 `$HOME`)。沙箱本身在运行时通过 `DEFT_SANDBOX=1` 选择启用。完整文档参见沙箱。
## 构建标志
该二进制通过 `zig build` 构建。关键标志:
| 标志 | 效果 |
|---|---|
| `-Dffi=true` | 启用 `ffi/*` 命名空间(加载共享库、调用 C 函数)。默认关闭。 |
| `-Denable-tui=true` | 构建 TUI 宿主(`retro` / `retra` 二进制)。`retro`/`retra` 目标默认开启。 |
| `-Doptimize=ReleaseFast` | 面向生产环境的优化构建。 |
| `-Dtarget=x86_64-linux-gnu` | 交叉编译。 |
```
$ zig build deft -Doptimize=ReleaseFast
$ zig build deft -Dffi=true -Doptimize=ReleaseFast
$ zig build retro
````
关于 FFI,参见 FFI。
## 能力
`[capabilities]` 返回编译时内置的特性映射。用它编写可优雅降级的可移植脚本:
def caps [capabilities] if [get $caps :ffi] { # call into a C library } { # pure-Deft fallback }
常见键:`:ffi`、`:tui`、`:websockets`、`:sqlite`、`:crypto`。
## 常见模式
### 通过管道将脚本传入 stdin
```bash
$ echo 'echo "hello from stdin"' | deft -
hello from stdin
````
### 运行单行命令
```bash
$ deft -e 'echo "2 + 2 = $(2 + 2)"'
2 + 2 = 4
````
### 与 shell 管道结合
```bash
$ deft script.dft | jq '.users[]'
````
## 快速参考
| 命令 | 用途 |
|---|---|
| `deft <file>` | 运行脚本 |
| `deft -e "code"` | 运行单行代码 |
| `deft -` | 从 stdin 读取脚本 |
| `deft repl` | REPL |
| `deft test [files]` | 运行测试 |
| `deft fmt [files]` | 格式化 |
| `deft pkg <subcommand>` | 包管理器 |
| `deft sandbox <subcommand>` | 管理 Landlock 路径列表 |
| `deft init [name]` | 搭建项目脚手架 |
| `deft --version` | 版本 |
| `deft --help` | 帮助 |