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 文档可在 [![GoDoc](https://godoc.org/github.com/google/rpmpack?status.svg)](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 文档可在 [![GoDoc](https://godoc.org/github.com/google/rpmpack?status.svg)](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打包, 安全编程, 打包工具, 文档结构分析, 日志审计, 系统部署