Homebrew公式变量定义与使用问题:install方法无法访问变量
Homebrew Formula变量作用域问题:os/arch无法在install方法访问的原因与修复
问题原因
你定义的os和arch是类作用域下的局部变量,而install是Formula的实例方法——两者作用域完全隔离:
- 类级代码(比如
on_macos、url设置)在公式加载阶段执行,此时局部变量os/arch处于类作用域内,所以url能正常解析; install方法在安装阶段以实例对象的方式调用,无法访问类作用域的局部变量,因此报错undefined local variable or method。
修复方案
方案1:改用类实例变量(@前缀)
将局部变量改为带@的类实例变量,让实例方法可以访问:
class Foobar < Formula desc "..." homepage "https://github.com/..." version "0.17" license "Apache-2.0" @os = "XXX" @arch = "XXX" on_macos do @os = "osx" if Hardware::CPU.arm? @arch = "arm64" sha256 "..." elsif Hardware::CPU.intel? @arch = "x86_64" sha256 "..." end end on_linux do @os = "linux" if Hardware::CPU.intel? @arch = "x86_64" sha256 "..." elsif Hardware::CPU.arm? && Hardware::CPU.is_64_bit? @arch = "arm64" sha256 "..." end end url "https://github.com/.../releases/download/mycmd-v#{version}/mycmd-#{@os}-#{@arch}" def install bin.install "mycmd-#{@os}-#{@arch}" => "mycmd" end test do system "#{bin}/mycmd", "--version" end end
方案2:在install方法内直接推导文件名(更推荐)
避免变量作用域问题,直接在install里根据当前环境重新判断,逻辑和类级代码一致:
class Foobar < Formula desc "..." homepage "https://github.com/..." version "0.17" license "Apache-2.0" on_macos do if Hardware::CPU.arm? sha256 "..." elsif Hardware::CPU.intel? sha256 "..." end end on_linux do if Hardware::CPU.intel? sha256 "..." elsif Hardware::CPU.arm? && Hardware::CPU.is_64_bit? sha256 "..." end end url do os = OS.mac? ? "osx" : "linux" arch = if Hardware::CPU.arm? && Hardware::CPU.is_64_bit? "arm64" else "x86_64" end "https://github.com/.../releases/download/mycmd-v#{version}/mycmd-#{os}-#{arch}" end def install os = OS.mac? ? "osx" : "linux" arch = if Hardware::CPU.arm? && Hardware::CPU.is_64_bit? "arm64" else "x86_64" end bin.install "mycmd-#{os}-#{arch}" => "mycmd" end test do system "#{bin}/mycmd", "--version" end end
这种写法更符合Homebrew的设计规范,避免作用域依赖,同时保证url和install的逻辑一致。
内容的提问来源于stack exchange,提问作者emmby
相关产品推荐
相关产品推荐

