23 个版本

0.3.9 2024年7月26日
0.3.8 2024年6月5日
0.3.5 2024年5月28日
0.2.9 2024年4月11日
0.1.0 2022年7月24日

#73开发工具 中排名

Download history 2360/week @ 2024-04-28 2443/week @ 2024-05-05 2772/week @ 2024-05-12 2936/week @ 2024-05-19 1988/week @ 2024-05-26 2332/week @ 2024-06-02 2064/week @ 2024-06-09 2284/week @ 2024-06-16 2009/week @ 2024-06-23 1672/week @ 2024-06-30 2151/week @ 2024-07-07 1687/week @ 2024-07-14 2036/week @ 2024-07-21 1809/week @ 2024-07-28 2537/week @ 2024-08-04 2162/week @ 2024-08-11

每月下载量 8,635
64 个 Crates 中使用(直接使用 4 个)

MIT/Apache 许可协议

100KB
2K SLoC

ocipkg

crate docs.rs master

包分发的 OCI 仓库。

功能

ocipkg 被设计为一个轻量级的 OCI 仓库客户端

  • 读取和写入 oci-archive 格式(OCI 图像布局 的 tar 归档)。
  • 无需外部容器运行时(例如 docker 或 podman)即可将容器镜像推送到 OCI 仓库或从 OCI 仓库拉取

此外,ocipkg 还提供了用于使用 OCI 仓库进行包分发的实用工具

  • 用于从文件、目录和具有 Cargo.toml 元数据的 Rust 项目构建容器的 CLI 工具。
  • build.rs 助手,用于获取并将库文件(例如 *.a*.so)作为容器链接

为什么选择 ocipkg?

在编写 Rust 中的 FFI crate 时,我决定启动这个项目。问题是“如何获取一个与 FFI crate 链接的共享/静态库”。这是困扰我的问题,阻碍了便携式 C++ 库的创建。

我们有三种选择

  1. 使用系统中的库
    • ✔ 系统管理员准备的库,他们最熟悉系统。
    • ❌ 开发者必须知道库在用户系统中的分布情况,例如 Ubuntu 22.04、20.04、18.04、Debian sid、11、10、9、RHEL9、8、7、ArchLinux、Gentoo Linux、FreeBSD、macOS(使用 brew)、Windows(使用 winget、chocolatey、scoop)等。
    • ❌ 一些系统不允许多版本库共存。
    • 大多数 *-sys crate 支持此选项。
  2. 从互联网获取源代码,并构建和链接它们
    • ✔ 开发者可以完全控制库。
    • ❌ 用户系统中需要开发工具,例如 cmake,并且需要额外的构建资源。
    • 一些 crate 支持此选项,并以 *-src 命名。
  3. 在构建时从互联网上获取编译好的库
    • ✔ 开发者也可以完全控制库。
    • ❌ 需要 HTTP(或其它协议)服务器来分发库
    • ❌ 开发者必须为每个支持的平台准备二进制文件,例如 x86_64-unknown-linux-gnux86_64-pc-windows-msvcaarch64-unknown-linux-gnu,...

ocipkg 专注于选项 3,即帮助通过 OCI 注册表分发开发者编译的二进制文件。

示例

Rust

C++/cmake

CLI 工具

安装

cargo install ocipkg-cli

ocipkg 命令

TBW

cargo-ocipkg 命令

一个用于创建和发布由 cargo build 构建的静态或动态库的容器的工具

$ cargo ocipkg build --release
    Finished release [optimized] target(s) in 0.00s
    Creating oci-archive (/home/teramura/github.com/termoshtt/ocipkg/examples/dynamic/rust/lib/target/release/ocipkg_dd0c7a812fd0fcbc.tar)

文件名形式为 ocipkg_{{ hash }}.tar,此哈希值是根据镜像名称和 Cargo.toml 计算得出的。

容器镜像名称使用 git 提交哈希值确定,格式为 {{ registry }}:$(git rev-parse HEAD --short),其中注册表名称由 Cargo.toml 设置。

[package.metadata.ocipkg]
registry = "ghcr.io/termoshtt/ocipkg/dynamic/rust"

可以通过 cargo-ocipkg publish 发布此容器。

$ cargo ocipkg publish --release
     Publish container (ghcr.io/termoshtt/ocipkg/dynamic/rust:be7f108)

开放容器倡议 (OCI) 是一个位于 Linux 基金会 的项目。

由于我们从不运行容器,因此该项目不依赖于 OCI 运行时规范

使用 OCI 注册表分发任何文件(非系统镜像)的想法基于 ORAS

试图使用 OCI 注册表分发软件包的类似项目

许可证

© 2020 Toshiki Teramura (@termoshtt)

该项目许可协议为以下之一

供您选择。

依赖关系

~9–21MB
~333K SLoC