自制公式 - 在安装时重命名文件

Homebrew formula - renaming files on install

我有以下自制公式L

class Software < Formula
    desc "Software"
    homepage "https://blabla"
    version "1.6.0"
  
    if OS.mac? && Hardware::CPU.intel?
      url "https://blabla/releases/download/v1.6.0/software-darwin-10.12-amd64"
      sha256 "ce02a97fb95aca9bba44413d4158f5f2c182f5eb2823bedf1400f556bb9b"
    end
  
    if OS.mac? && Hardware::CPU.arm?
      url "https://blabla/releases/download/v1.6.0/software-darwin-10.12-arm64"
      sha256 "1c69849ba82c10d15706d110ae63bd97c387da2a8cf925653e1bb5c6fc"
    end
  
    if OS.linux? && Hardware::CPU.intel?
      url "https://blabla/releases/download/v1.6.0/software-linux-amd64"
      sha256 "9b7245823a60c85e027929b776753848d4fbdaaa333a49ae171684893"
    end
  
    def install
      bin.install "software*" => "software"
    end
  
    test do
      system "#{bin}/software --version"
    end
  end

有问题的部分是:

    def install
      bin.install "software*" => "software"
    end

下载的文件取决于 OS 用户所在的位置 安装前。我想自动找到下载的文件(无论名称是什么),因此我尝试将正则表达式用作 bin.install "software"* 带星标找到下载的文件并将其安装为 软件

但是,我收到一条错误消息,指出无法找到 软件*

请问我该如何解决这个问题?

一些建议(但请参阅下面的注意事项)

根据 Homebrew bin.install documentationbin.install 的目的是重命名 Cellar 中公式位置内的文件,并且密钥似乎不接受 glob 或正则表达式。但是,由于除了 Homebrew 公式 DSL 之外,您还可以使用 Ruby 的全部功能,因此您可以考虑执行以下操作:

def install
  binfile_with_extension =
    File.basename(Dir.glob "#{prefix}/bin/software*")
  bin.install binfile_with_extension => "software"
end

这当然假设只有一个 software-* 可执行文件。如果不止一个,那么你可能需要做一些事情来 return glob 的值(应该是一个数组)到 select 适合你的架构的正确值。

或者,您可能不想重命名文件本身,而只想对其进行符号化link,这样您就不会更改应用程序可能期望的内容。该文档说您可以完全访问 FileUtils 和 DSL 的 bin.install_symlink 方法,因此您可以考虑使用它们的某种组合。例如,要在 cellar 中为您的体系结构命名文件创建一个 hardlink,然后使用相对 symlinks 将其 symlink 放入正确的 bin 目录中,以下应该有效:

def install
  file = Dir.glob("#{prefix}/bin/software*").first
  FileUtils.ln file, "#{prefix}/bin/software"
  bin.install_symlink bin/"software"
end

对于重命名 symlinks 可能有更好的 Homebrew-native 选项,不同于他们 link 到的文件,但我找不到一。不过,这并不意味着不存在。

此外,hardlinking 或 symlinking 是否 必需 首先取决于应用程序。一些应用程序关心调用它们的名称(以 busybox 为例),而其他应用程序则不关心。 YMMV.

注意事项

我目前不是 Homebrew 开发人员,因此可能有其他或更好的方法来执行此操作。尽管如此,Ruby globs 和 Hombrew DSL 特性的组合应该可以让你到达你想去的地方。

请注意,我自己还没有对此进行测试,因此如果不进行调整,上述建议可能会或可能不会奏效。我提供它只是作为一个起点,因为我认为 bin.install 本身并不打算做你想做的事。