如何仅使用脚本创建自制程序公式

Jer*_*oen 6 homebrew

我想将一些 shell 脚本 + 支持文件打包成一个 homebrew 公式,将这些脚本安装在用户的某处$PATH。我将从我自己的水龙头中提供配方。

通读公式食谱,这些示例似乎假设上游库中的 cmake 或 autotools 系统。如果我的项目只包含几个脚本和配置文件怎么办?我应该手动将它们复制到#{prefix}/公式中吗?

bfo*_*ine 8

这里有两种情况:

独立脚本

binusing下安装它们bin.install。您可以选择重命名它们,例如去除扩展名:

class MyFormula < Formula
  # ...

  def install
    # move 'myscript.sh' under #{prefix}/bin/
    bin.install "myscript.sh"

    # OR move 'myscript.sh' to #{prefix}/bin/mybettername
    bin.install "myscript.sh" => "mybettername"

    # OR move *.sh under bin/
    bin.install Dir["*.sh"]
  end
end
Run Code Online (Sandbox Code Playgroud)

带有支持文件的脚本

这种情况很棘手,因为您需要让所有路径都正确。最简单的方法是在安装的一切#{libexec}/,然后写exec脚本下#{bin}/。这是 Homebrew 公式中非常常见的模式。

class MyFormula < Formula
  # ...

  def install
    # Move everything under #{libexec}/
    libexec.install Dir["*"]

    # Then write executables under #{bin}/
    bin.write_exec_script (libexec/"myscript.sh")
  end
end
Run Code Online (Sandbox Code Playgroud)

给定包含以下内容的 tarball(或 git repo):

  • script.sh
  • supportfile.txt

上面的公式将创建以下层次结构:

#{prefix}/
  libexec/
    script.sh
    supportfile.txt
  bin/
    script.sh
Run Code Online (Sandbox Code Playgroud)

Homebrew#{prefix}/bin/script.sh使用以下内容创建它:

#{prefix}/
  libexec/
    script.sh
    supportfile.txt
  bin/
    script.sh
Run Code Online (Sandbox Code Playgroud)

这意味着您的脚本可以期望在其自己的目录中有一个支持文件,同时不会污染bin/ 并且不对安装路径做出任何假设(例如,您不需要../libexec/supportfile.txt在脚本中使用类似的东西)。

我的这个答案与Ruby脚本和一个例子是一个用于联机手册的例子。

注意 Homebrew 还有其他帮助程序,例如不仅可以编写exec脚本,还可以设置环境变量执行.jar.