跳转到主要内容

单命令安装源代码的二进制文件的实用工具

项目描述

Whack允许使用单个命令安装Linux程序,如nginx和Apache HTTP服务器。例如,要将nginx安装到~/apps/nginx

whack install git+https://github.com/mwilliamson/whack-package-nginx.git ~/apps/nginx

大多数Linux二进制文件不可重定位,这意味着它们是为您的文件系统上的特定路径编译的。这意味着如果您想在不同的路径上安装完全相同的程序,您需要重新编译整个程序。Whack允许您创建这些程序的重定位版本。在第一次安装时,程序将被编译并复制到目标目录。在后续安装中,将复制应用程序的缓存版本到目标目录。

安装

在您可以使用Whack之前,您需要安装一个名为whack-run的工具。您可以从GitHub下载whack-run

$ curl -L https://github.com/mwilliamson/whack-run/archive/1.0.0.tar.gz > whack-run-1.0.0.tar.gz
$ tar xzf whack-run-1.0.0.tar.gz
$ cd whack-run-1.0.0
$ make

并且作为root

# make install

这将把二进制文件whack-run安装到/usr/local/bin。一旦whack-run被安装,您就可以像普通Python包一样安装Whack

pip install whack

用法

whack install PACKAGE_SOURCE DESTINATION

例如,要将nginx安装到~/apps/nginx

whack install git+https://github.com/mwilliamson/whack-package-nginx.git ~/apps/nginx

然后可以使用以下命令运行nginx

~/apps/sbin/nginx

包源可以是git或hg仓库(分别用git+hg+前缀表示),通过HTTP获取的tar包(由http://前缀检测),或本地路径(由前缀/./../之一检测)。

您可以使用参数 --add-parameter KEY=VALUE 或其简写别名 -p KEY=VALUE 来传递构建参数。可设置的构建参数取决于包。例如,要安装特定版本的 nginx

whack install git+https://github.com/mwilliamson/whack-package-nginx.git ~/apps/nginx \
    -p nginx_version=1.2.7

如果未设置构建参数,则通常包会有一个合理的默认值。

创建包源

包源描述了如何从无到有,安装特定程序的实例。包含已安装程序输出目录的输出目录被称为包。

以下是对如何构建包的相当详细的描述,但当你查看具体示例时可能更有意义。例如 nginx 源包 是一个好例子,因为它相对简单。

每个包源通常至少包含三个文件

  • whack/whack.json:一个描述包源的 JSON 文件

  • whack/downloads:一个可执行文件,将所需的下载输出到 stdout

  • whack/build:一个可执行文件,用于构建包

whack/whack.json

whack/whack.json 应该是一个包含以下属性的 JSON 对象

  • name:包的名称,例如 nginx。它应仅包含小写字母、数字和连字符。

  • sourcePaths(可选):源包中用于构建包的路径。默认为 ["whack"]

  • defaultParameters(可选):包含包默认构建参数的对象。

构建参数

执行 whack/downloadswhack/build 时,任何构建参数都作为环境变量传递。构建参数根据 whack/whack.json 中的默认值设置。然后添加用户明确传递的构建参数,覆盖任何默认参数。每个构建参数的名称在环境中转换为大写。例如,构建参数“version”作为环境变量“VERSION”可用。

whack/downloads

在构建包之前,执行 whack/downloads,并将输出捕获到 stdout。输出应该是构建包所需的 URL 列表,由换行符分隔。下载被缓存,因此如果您有一个内容可能会改变(例如,程序的最新 tarball)的 URL,您可以选择以下任一操作:

  • 尝试找到该特定版本的 URL

  • 在构建步骤中手动下载文件

构建包

执行以下步骤以构建包

  • 读取 whack/whack.json 以获取包描述。

  • 根据 whack/whack.json 中设置的默认值和用户提供的参数设置构建参数的值。

  • 创建一个临时目录,称为构建目录。

  • 将源包中指定的 sourcePaths 目录和文件复制到构建目录中。

  • 使用作为环境变量的构建参数执行 whack/downloads,并将文件下载到构建目录中。

  • 执行 whack/build

  • 将构建参数设置为环境变量

  • 将当前工作目录设置为构建目录

  • 将包的目标目录作为命令行参数传递

当构建软件包时,所有可执行文件应放置在 .bin.sbin 目录中,而不是 binsbin 目录。当使用 Whack 安装软件包时,binsbin 将包含轻量级包装器,这些包装器设置文件系统正确,然后委托给 .bin.sbin 中的等效可执行文件。有关更多详细信息,请参阅“Whack 的工作原理”部分。

软件包源示例

Whack 的工作原理是什么?

许多 Linux 应用程序可以通过运行以下命令或类似命令进行编译和安装:

$ ./configure
$ make
$ make install

这通常会在 /usr/local 下安装应用程序。然而,有时我们想在非 root 用户权限下安装应用程序的独立实例。例如,如果我们正在开发一个使用 Apache 的 Web 应用程序,拥有 Apache 的独立安装将很有帮助。我们可以在运行 ./configure 时更改安装前缀。

$ ./configure --prefix=/home/user/projects/web-app/apache
$ make
$ make install

虽然这样做是可行的,但每次我们想在不同的位置安装应用程序时,都需要重新编译应用程序。根据应用程序的不同,编译可能需要很长时间。

Whack 通过使用 unsharemount 来更改单个进程的文件系统,从而解决了这个问题。每个应用程序都编译为前缀设置为 /usr/local/whack。在运行应用程序的二进制文件之前,Whack 使用 unshare 系统调用创建一个私有的挂载命名空间。这意味着任何 mount 调用只对进程内部可见。然后我们将应用程序安装的目录挂载到 /usr/local/whack,并执行二进制文件。

例如,假设我们通过以下命令安装了 nginx 到 ~/web-app/nginx

whack install git+https://github.com/mwilliamson/whack-package-nginx.git \
    ~/web-app/nginx

实际的 nginx 二进制文件位于 ~/web-app/nginx/.sbin 中(注意二进制文件位于名为 .sbin 的目录中,而不是 sbin 目录)。如果我们直接尝试运行 ~/web-app/nginx/.sbin/nginx,我们会得到一个错误:

$ ~/web-app/nginx/.sbin/nginx
nginx: [alert] could not open error log file: open() "/usr/local/whack/logs/error.log" failed (2: No such file or directory)
2013/02/18 11:25:17 [emerg] 11586#0: open() "/usr/local/whack/conf/nginx.conf" failed (2: No such file or directory)

nginx 预期安装于 /usr/local/whack,但实际上安装在 ~/web-app/nginx。为了成功运行 nginx,我们需要使用 whack-run

$ whack-run ~/web-app/nginx ~/web-app/nginx/.sbin/nginx

使用 whack-run 时,以下操作会发生:

  1. whack-run 调用 unshare(CLONE_NEWNS),创建一个私有的挂载命名空间。

  2. whack-run~/web-app/nginx 挂载到 /usr/local/whack。由于我们之前调用了 unshare,此挂载只对当前进程可见。

  3. whack-run 放弃其用户和组权限。由于 whack-run 安装时设置了 setuid 位,因此它可以调用 unsharemount

  4. whack-run 使用传递给它的参数调用 exec,即 exec ~/web-app/nginx/.sbin/nginx

使用 whack-run 来运行 nginx 稍显繁琐。然而,我们可以直接调用 ~/web-app/nginx/sbin/nginx(而不是 ~/web-app/nginx/.sbin/nginx),这样就会以适当的参数调用 whack-run

虽然 whack-run 设置了 setuid 位,但它只使用 root 权限调用 unsharemount。之后,将丢弃用户和组权限。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分发

whack-0.7.0.tar.gz (18.1 kB 查看哈希值

上传时间

支持