34次发布

0.1.1 2024年7月21日
0.0.32 2024年6月1日
0.0.29 2023年12月17日
0.0.28 2023年9月9日
0.0.6 2021年1月17日

#228 in Web编程

Download history 3/week @ 2024-04-26 204/week @ 2024-05-10 49/week @ 2024-05-17 23/week @ 2024-05-24 639/week @ 2024-05-31 340/week @ 2024-06-07 280/week @ 2024-06-14 245/week @ 2024-06-21 147/week @ 2024-06-28 209/week @ 2024-07-05 141/week @ 2024-07-12 537/week @ 2024-07-19 279/week @ 2024-07-26 184/week @ 2024-08-02 141/week @ 2024-08-09

每月1,155次下载

MIT/Apache

130KB
3K SLoC

通用二进制安装程序库和CLI工具

当我提到“通用”,我的意思是它会从GitHub发布中下载二进制文件。

当我提到“二进制”,我的意思是它处理类似于大多数Go和Rust项目创建的单文件可执行文件。

当我提到“安装程序”,我的意思是它会将二进制文件放在你指定的任何位置。

最后,当我提到“UBI”,我的意思不是通用基本收入,但那也很好。

作为库使用UBI

[dependencies]
ubi = "0.1.0"

有关更多详细信息,请参阅ubi在docs.rs上的文档

安装它

您可以通过从发布页面下载最新的版本来手动安装它。

还有提供ubi半成品实现的引导安装脚本

Linux和macOS

curl --silent --location \
    https://raw.githubusercontent.com/houseabsolute/ubi/master/bootstrap/bootstrap-ubi.sh |
    sh

如果您以非root用户身份运行此脚本,它将ubi安装到$HOME/bin。以root身份运行时,它将安装到/usr/local/bin

环境变量参数

引导脚本支持多个环境变量作为参数。

变量 描述
TARGET 安装ubi的目录。对于非root用户默认为$HOME/bin,对于root用户默认为/usr/local/bin
TAG 要下载的ubi版本标签。默认为最新发布版。
FILENAME 要下载的发布文件资产的名称。这会跳过平台检测,仅下载具有此名称的文件。如果引导脚本无法检测您的平台,请使用此选项(但请考虑提交PR以修复检测)。
GITHUB_TOKEN 用于下载发布版本的GitHub API令牌。仅在私有仓库或达到GitHub API匿名使用限制时才需要此令牌。在CI环境中重复运行引导脚本时,很可能会遇到这些限制。

要设置这些变量,您可以在运行脚本之前在环境中设置它们,或者您可以在命令行上设置它们。请注意,您需要在管道的右侧设置它们。例如,要使用TAG环境变量安装ubi的特定版本

curl --silent --location \
    https://raw.githubusercontent.com/houseabsolute/ubi/master/bootstrap/bootstrap-ubi.sh |
    TAG=v0.0.15 sh

Windows

powershell -exec bypass -c "Invoke-WebRequest -URI 'https://raw.githubusercontent.com/houseabsolute/ubi/master/bootstrap/bootstrap-ubi.ps1' -UseBasicParsing | Invoke-Expression"

您可以从命令行或PowerShell命令行运行此命令。这将把ubi.exe安装到当前目录中。

如何使用它

USAGE:
    ubi [OPTIONS]

OPTIONS:
    -d, --debug                  Enable debugging output
    -e, --exe <exe>              The name of this project's executable. By default this is the same
                                 as the project name, so for houseabsolute/precious we look for
                                 precious or precious.exe. When running on Windows the ".exe" suffix
                                 will be added as needed.
    -h, --help                   Print help information
    -i, --in <in>                The directory in which the binary should be placed. Defaults to
                                 ./bin.
    -m, --matching <matching>    A string that will be matched against the release filename when
                                 there are multiple files for your OS/arch, i.e. "gnu" or "musl".
                                 Note that this will be ignored if there is only used when there is
                                 only one matching release filename for your OS/arch
    -p, --project <project>      The project you want to install, like houseabsolute/precious or
                                 https://github.com/houseabsolute/precious.
    -q, --quiet                  Suppresses most output
        --self-upgrade           Use ubi to upgrade to the latest version of ubi. The --exe, --in,
                                 --project, --tag, and --url args will be ignored.
    -t, --tag <tag>              The tag to download. Defaults to the latest release.
    -u, --url <url>              The url of the file to download. This can be provided instead of a
                                 project or tag. This will not use the GitHub API, so you will never
                                 hit the GitHub API limits. This means you do not need to set a
                                 GITHUB_TOKEN env var except for private repos.
    -v, --verbose                Enable verbose output
    -V, --version                Print version information

使用GitHub令牌

如果设置了GITHUB_TOKEN环境变量,那么它将用于所有API调用。这是下载私有项目发布版本所必需的。如果您在一个频繁运行作业的CI环境中运行ubi,您可能也需要它,因为GitHub对匿名API请求的速率限制非常低。

但是,您也可以使用--url选项通过直接提供下载链接来绕过GitHub API。

升级ubi

您可以使用ubi --self-upgrade命令使用ubi来升级ubi。请注意,您必须对包含ubi的目录有写权限才能使此操作生效。

在Windows上,这会留下一个名为ubi-old.exe的文件,必须手动删除。

在CI中使用ubi的最佳实践

当在CI中使用ubi时,您需要考虑以下几点。

首先,有GitHub API速率限制。在没有提供GITHUB_TOKEN的情况下,此限制可能低至每小时每个IP 60个请求,所以您几乎肯定需要提供它。在GitHub Actions中运行时,您可以使用${{ secrets.GITHUB_TOKEN }}语法来设置此环境变量,在这种情况下,速率限制是按仓库计算的。

- name: Install UBI
  shell: bash
  run: |
    curl --silent --location \
        https://raw.githubusercontent.com/houseabsolute/ubi/master/bootstrap/bootstrap-ubi.sh |
        sh
  env:
    GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: Install tools with UBI
  shell: bash
  run: |
    "$HOME/bin/ubi" --project houseabsolute/precious --in "$HOME/bin"
  env:
    GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

如果您仅在单个平台上运行ubi,您可以通过使用--url参数来避免完全使用GitHub API。但如果您在多个平台上运行,这可能很繁琐,而且很大程度上抵消了使用ubi的目的。

如果您从您不控制的仓库下载可执行文件,并且您没有使用--url参数,那么您应该使用--tag参数来指定您想要安装的发布版本。否则,ubi将始终下载最新版本,这可能会导致意外,特别是如果您在CI中运行您下载的工具。

为什么这很有用

随着Go和Rust的兴起,像ripgrep这样的非常有用的工具越来越多地以包含单个可执行文件的tarball或zip文件的形式发布。有一个能够下载适合您平台的正确二进制的单个工具是非常方便的。

是的,在Unix系统上的shell中可以完成这项操作,但您知道如何在PowerShell中完成等效操作吗?

一旦安装了 ubi,您就可以使用它来在 Linux、macOS 和 Windows 上安装这些单二进制工具。

这是否比从源代码安装更好?

我认为是的。虽然当然可以使用 gocargo 安装这些工具,但这需要完整的语言工具链。然后您必须实际编译该工具,这可能需要下载和编译许多依赖项。这将比安装二进制文件慢得多,并且更容易出错。

这是否比从 deb/RPM/homebrew/chocolatey 软件包安装更好?

这值得商榷。使用 ubi 的主要优点是您可以在 Linux、macOS 和 Windows 上使用完全相同的工具。主要缺点是您不会获得包含元数据(如许可文件)的完整软件包或额外的工具,如 shell 完成文件,并且您也不能轻松使用软件包管理器卸载它。

依赖项

~19–35MB
~559K SLoC