#repo #tarball #compliance #macro #agpl #git #include-repo

macro include-repo-impl

这是include-repo的内部实现crate;请勿直接使用此版本

1 个不稳定版本

使用旧的Rust 2015

0.1.0 2018年8月30日

#11 in #tarball


include-repo使用

AGPL-3.0-only

5KB
74

include-repo

include_repo rust crate提供了一个宏,可以将项目git仓库中的所有文件嵌入到最终的可执行文件中。它不会嵌入git历史记录或元数据,而是包含一个类似于git archive产生的tarball。

为什么你可能需要这个?我想到的主要用例(实际上我就是这样用它)是提供一个AGPL合规的端点。

如果你的源代码被编译进二进制文件中,那么提供源代码是非常简单的。

用法

这个crate使用起来非常简单。只需在代码的某个位置包含以下内容

use include_repo::include_repo;

const SOURCE_CODE: &[u8] = include_repo!();
// Expands to:
// const SOURCE_CODE: &[u8] = [128, 80, ...];
// The bag of bytes is a tarball, so serve it with a .tar extension please!

如果你不想包含所有文件,这也是可能的。例如,如果你不想包含'img'和'third_party'文件夹的内容,可以这样做

use include_repo::include_repo;

const SOURCE_CODE: &[u8] = include_repo!(".", ":!/img/", ":!/third_party");
// Any valid pathspec (see
// https://git-scm.cn/docs/gitglossary#gitglossary-aiddefpathspecapathspec) may
// be used. Pathspecs *must* be string literals. Any number may be provided to
// the macro.
// The "." portion is optional on newer versions of git, but for backwards
// compatibility it's best to add it if all other pathspecs are exclusions.

如果你想让tarball被gzip压缩,请使用include_repo_gz!宏。如果你在二进制文件中没有包含gzip解压缩,你可能需要在请求源代码时使用tar -xzv -f -,或者为用户提供.tar.gz文件。

假设

以下假设必须成立,此crate才能正常工作

  • 你使用git进行版本控制,并且在你的PATH中有一个现代版本的git
  • 你希望以tarball(可选gzip压缩)的形式提供你的源代码,而不是zip或其他格式
  • 你希望你的代码作为一个巨大的const嵌入到你的二进制文件中(例如,而不是磁盘上的静态文件)
  • 你不在意进程宏在构建过程中运行'git'

许可证

此代码在AGPL下方便地可用。

依赖关系

~2MB
~52K SLoC