自制公式 - 在安装时重命名文件
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 documentation,bin.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
本身并不打算做你想做的事。
我有以下自制公式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 documentation,bin.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
本身并不打算做你想做的事。