index can be auto generated.
类似于 cargo 和 wapm
用例:
首先,我们有一个开发人员的用例,他想使用 ebpf 二进制文件或者程序,但不知道如何/在哪里找到它:
试着运行
./ebpm run opensnoop # 使用一个名字直接跑起来
./ebpm run https://github.com/ebpf-io/raw/master/examples/opensnoop.bpf # 使用一个http API
./ebpm run ./opensnoop.bpf # 使用一个本地路径
ECLI_REGISTRY="https://ebpf-registry.example.com"
ecli run "package-name"
->
curl "$ECLI_REGISTRY/{package-name}.json" | ecli run
“run” = “pull” + “start”
我们的第二个角色是一个开发人员,他想要创建一个通用二进制,并在任何机器和操作系统上分发它。这对于命令行工具或者可以直接在Shell中运行的任何东西都很有用:
create project
$./ebpm init opensnoop
$ cd opensnoop
$ tree -a
.
├── bootstrap.bpf.c
├── bootstrap.bpf.h
├── config.json
├── .gitignore
└── README.md
$./ebpm build opensnoop
会产生一个配置文件模板:
[package]
name = "username/my_package"
version = "0.1.0"
description = ""
license = "MIT"
[[module]]
name = "my_app"
source = "path/to/app.ebpf"
发布 ebpf 数据文件
./ebpm publish opensnoop
我应该在哪里发布它?Github?Npm?但这只是 ebpf,没有任何语言的关联…那就Github!
git push …
可以直接下载:
我们可以在任何有绑定的语言中使用 ebpf:
./ebpm get opensnoop
这会创建一个 config 文件;
或者在 config 里面定义之后:
ebpm.toml/json
[[module]]
name = "opensnoop"、
path = ”http://....."
version = 0.1
[[module]]
name = "execsnoop"
path = ”./bpftools/execsnoop.bpf”
version = 0.1
运行
./ebpm install .
就能在本地下载并运行;
import "ebpm"
handler := ebmp.open_and_run("execsnoop")
handler.stop()
handler := ebmp.open_and_run("execsnoop")
handler.stop()
或者更进一步,它应该可以被内嵌在别的包管理器里面,比如,我想安装一个 go 的 opensnoop 包,我只需要:
go get ebpm-opensnoop
import "ebpm-opensnoop"
所有这些用例促使我们重新思考包管理器的当前全景,以及我们如何创建一个只关注 ebpf 的包管理器,它将统一以下原则:
需要注意循环依赖; 有必要的话,某些库可以有供应商依赖;