google/rpmpack
GitHub: google/rpmpack
rpmpack 是一个纯 Go 实现的 RPM 包创建库和命令行工具,让用户无需 rpmbuild 和 spec 文件即可将文件快速打包为 RPM 格式。
Stars: 129 | Forks: 36
# rpmpack (tar2rpm) - 轻松打包 rpm 的方法
## 免责声明
这不是一款官方的 Google 产品,它只是恰好由 Google 拥有所有权的代码。
## 概述
`tar2rpm` 是一个接收 tar 并输出 rpm 的工具。`rpmpack` 是一个用于创建 rpm 的 golang 库。两者均使用纯 go 编写,无需使用 rpmbuild 或 spec 文件。有关 `rpmpack` 的 API 文档可在 [](https://godoc.org/github.com/google/rpmpack) 中找到。
## 安装
```
$ go get -u github.com/google/rpmpack/...
```
这会将 `tar2rpm` 工具安装在 `${GOPATH}/bin` 目录下,默认路径为 `~/go/bin`。
## 二进制程序用法 (tar2rpm)
`tar2rpm` 接收一个 `tar` 文件(通过 `stdin` 或指定的文件名),并输出一个 `rpm`。
```
Usage:
tar2rpm -name NAME -version VERSION [OPTION] [TARFILE]
Read tar content from stdin, or TARFILE if present. Write rpm to stdout, or the file given
by -file RPMFILE. If a filename is '-' use stdin/stdout without printing a notice.
Options:
-file RPMFILE
write rpm to RPMFILE instead of stdout
-name string
the package name
-release string
the rpm release
-version string
the package version
```
## 库用法 (rpmpack)
有关 `rpmpack` 的 API 文档可在 [](https://godoc.org/github.com/google/rpmpack) 中找到。
```
import "github.com/google/rpmpack"
...
r, err := rpmpack.NewRPM(rpmpack.RPMMetaData{Name: "example", Version: "3"})
if err != nil {
...
}
r.AddFile(rpmpack.RPMFile{
Name: "/usr/local/hello",
Body: []byte("content of the file"),
})
if err := r.Write(w); err != nil {
...
}
```
## 在 bazel 构建系统中的用法 (pkg_tar2rpm)
在 [example_bazel](example_bazel/) 中有一个可用的示例
在 `WORKSPACE` 中
```
load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository")
git_repository(
name = "rpmpack",
remote = "https://github.com/google/rpmpack.git",
branch = "master",
)
# 以下将加载构建 rpmpack 的 requirements
http_archive(
name = "io_bazel_rules_go",
sha256 = "69de5c704a05ff37862f7e0f5534d4f479418afc21806c887db544a316f3cb6b",
urls = [
"https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.27.0/rules_go-v0.27.0.tar.gz",
"https://github.com/bazelbuild/rules_go/releases/download/v0.27.0/rules_go-v0.27.0.tar.gz",
],
)
http_archive(
name = "bazel_gazelle",
sha256 = "62ca106be173579c0a167deb23358fdfe71ffa1e4cfdddf5582af26520f1c66f",
urls = [
"https://mirror.bazel.build/github.com/bazelbuild/bazel-gazelle/releases/download/v0.23.0/bazel-gazelle-v0.23.0.tar.gz",
"https://github.com/bazelbuild/bazel-gazelle/releases/download/v0.23.0/bazel-gazelle-v0.23.0.tar.gz",
],
)
load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies")
load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies")
go_rules_dependencies()
go_register_toolchains(version = "1.16")
gazelle_dependencies()
load("@com_github_google_rpmpack//:deps.bzl", "rpmpack_dependencies")
rpmpack_dependencies()
```
在 `BUILD` 或 `BUILD.bazel` 中
```
load("@bazel_tools//tools/build_defs/pkg:pkg.bzl", "pkg_tar")
load("@com_github_google_rpmpack//:def.bzl", "pkg_tar2rpm")
pkg_tar(
name = "rpmtest-tar",
srcs = [":content1.txt"],
mode = "0644",
ownername = "root.root",
package_dir = "var/lib/rpmpack",
)
pkg_tar2rpm(
name = "rpmtest",
data = ":rpmtest-tar",
pkg_name = "rpmtest",
release = "3.4",
version = "1.2",
prein = "echo \"This is preinst\" > /tmp/preinst.txt",
)
```
## 功能特性
- 你可以将文件放入 rpm 中,以便 rpm/yum 将它们安装到主机上。
- 简单易用。
- 无需 `spec` 文件。
- 不执行任何构建操作。
- 不会尝试自动检测依赖项。
- 不会试图神奇地推断你运行的计算机架构。
- 不需要任何 rpm 数据库或其他状态,并且不使用文件系统。
## 缺点
- 与构建 rpmlib 的团队没有关联。
- 很容易对基于 rpm 的系统造成严重破坏。导致 rpm 在处理损坏的 rpm 文件时发生段错误 (segfault) 出奇地容易。
- 缺少许多功能。
- 所有构建产物都存储在内存中,有时甚至不止一次。
- 向后兼容性不如 `rpmbuild`。
## 设计理念
有时你只是希望将文件传送到主机上,并由包管理器进行管理。`rpmbuild` 可以使用 `spec` 文件,结合特定的目录布局和本地数据库来构建/安装/打包你的文件。但你并不需要所有这些。你想要的是类似于 tar 的工具。
随着项目的推进,我们必须维持复杂度/价值的比率。这包括代码复杂度和接口复杂度。
## 免责声明
这不是一款官方的 Google 产品,它只是恰好由 Google 拥有所有权的代码。
标签:EVTX分析, Golang, RPM打包, 安全编程, 打包工具, 文档结构分析, 日志审计, 系统部署