DarkNode

Life, the Universe and Everything

Home­brew 软件包的编写与提交

本文发表于:
最后修改于:
分类:system
合计信息量:7.00kb

相关说明

目前国内已有很多关于如何使用 Home­brew 的文章,但是却很难找到一份关于如何编写 Home­brew 的软件包的介绍,Home­brew 是一个基于 git 的软件包管理器,每个人都可以向 Home­brew 提交新的软件包或是提交已有软件包的更新。本文将用两个例子分别介绍如何提交已有软件包的更新以及如何提交新的软件包。

编写已有软件包的更新

Home­brew 的软件包被称为 for­mula,对应一个 ruby 脚本。我们以 shad­ow­sock-libev 为例,介绍如何编写已有软件包的更新。首先在 ter­mi­nal 中执行:

$ brew edit shad­ow­socks-libev

brew 将使用$ED­I­TOR 变量中指定的编辑器打开对应的 ruby 脚本,要更新一个软件包,我们只需要更改脚本的前三行:

class Shad­ow­sock­sLibev < For­mula
  home­page "https://github.com/shad­ow­socks/shad­ow­socks-libev"
  url "https://github.com/shad­ow­socks/shad­ow­socks-libev/archive/v2.1.4.tar.gz"
  sha256 "d4e665e375224ba1d4844b97e7263491ce07a60f08c9cb55c3128a6d3aad13e7"

这是 shad­ow­socks-libev v2.1.4 版本对应的脚本代码,脚本的第三行对应的就是这个软件包源代码的下载地址,修改第三行的 url 为新版本 v2.2.0 的软件包源代码下载地址,保存并执行如下命令:

$ brew re­in­stall shad­ow­socks-libev

此时我们会获得这样的提示:

Er­ror: SHA256 mis­match
Ex­pected: d4e665e375224ba1d4844b97e7263491ce07a60f08c9cb55c3128a6d3aad13e7
Ac­tual: 49688f39649f0f61e323ddba8b02daa5dfe88bf2e051ed91181d266fe824df69

我们再次编辑软件包脚本,将第四行的 SHA256 值修改为新版本的 49688f39649f0f61e323ddba8b02daa5dfe88bf2e051ed91181d266fe824df69 即可。

重新执行命令测试安装 shad­ow­socks-libev:

$ brew re­in­stall shad­ow­socks-libev

现在没有错误出现了,我们的软件包更新的编写就完成了,接下来需要提交这个更新。

提交已有软件包的更新

首先访问 Home­brew-Core 的项目主页,随后点击 fork。本文已经假设你拥有一个 Github 帐号,并且拥有一些基本的 git 使用经验。

执行命令:

$ brew up­date
$ cd $(brew --repo home­brew/core)
$ git check­out -b shad­ow­socks
$ git add For­mula/shad­ow­socks-libev.rb
$ git com­mit

我们首先将 Home­brew 更新到了最新版本,然后切换到了 Home­brew 的本地根目录,随后创建并切换到了一个名叫 shad­ow­socks 的 branch,添加了新的脚本文件修改记录,最后进行 com­mit。

Home­brew 推荐的 com­mit mes­sage style 是非常简洁的:只需要软件包名加上版本号即可,比如:shad­ow­socks-libev 2.2.0。注意使用 foo­bar x.x.x 这样的格式,不要加入字符 v 或者 ver 等来表示版本号,直接使用数字就可。

将这个 branch push 到自己 fork 的 Home­brew 下:

$ git push https://github.com/Github 用户名/home­brew-core/ shad­ow­socks

回到 Home­brew-Core 的项目主页 并提交一个 pull re­quest,ti­tle 同样使用 shad­ow­socks-libev 2.2.0 即可。接下来只需要等待这个更新被接收即可。

最后,我们切换回 mas­ter 分支,并且删除掉 shad­ow­socks 分支。

$ git check­out mas­ter
$ git branch -D shad­ow­socks

创建全新的软件包

首先我们需要获取软件源代码包的地址,以 cidrmerge 为例,直接从 source­forge 上下载时可以获得这个路径:

http://iweb.dl.source­forge.net/project/cidrmerge/cidrmerge/cidrmerge-1.5.3/cidrmerge-1.5.3.tar.gz

这个路径仅仅是 source­forge 使用的镜像站点的地址,实际上我们应该使用这个地址以方便世界各地的用户从不同的镜像站下载源代码:

https://down­loads.source­forge.net/project/cidrmerge/cidrmerge/cidrmerge-1.5.3/cidrmerge-1.5.3.tar.gz

执行命令:

$ brew cre­ate https://down­loads.source­forge.net/project/cidrmerge/cidrmerge/cidrmerge-1.5.3/cidrmerge-1.5.3.tar.gz

Home­brew 会按照模板创建一个默认的脚本:

# Doc­u­men­ta­tion: https://github.com/Home­brew/Home­brew/blob/mas­ter/share/doc/Home­brew/For­mula-Cook­book.md
#                /usr/lo­cal/Li­brary/Con­tri­bu­tions/ex­am­ple-for­mula.rb
# PLEASE RE­MOVE ALL GEN­ER­ATED COM­MENTS BE­FORE SUB­MIT­TING YOUR PULL RE­QUEST!

class Cidrmerge < For­mula
  home­page ""
  url "http://iweb.dl.source­forge.net/project/cidrmerge/cidrmerge/cidrmerge-1.5.3/cidrmerge-1.5.3.tar.gz"
  ver­sion "1.5.3"
  sha256 "21b36fc8004d4fc4edae71dfaf1209d3b7c8f8f282d1a582771c43522d84f088"

  # de­pends_on "cmake" => :build
  de­pends_on :x11 # if your for­mula re­quires any X11/XQuartz com­po­nents

  def in­stall
    # ENV.de­par­al­lelize  # if your for­mula fails when build­ing in par­al­lel

    # Re­move un­rec­og­nized op­tions if warned by con­fig­ure
    sys­tem "./con­fig­ure", "--dis­able-de­bug",
                          "--dis­able-de­pen­dency-track­ing",
                          "--dis­able-silent-rules",
                          "--pre­fix=#{pre­fix}"
    # sys­tem "cmake", ".", *std_cmake_args
    sys­tem "make", "in­stall" # if this fails, try sep­a­rate make/make in­stall steps
  end

  test do
    # `test do` will cre­ate, run in and delete a tem­po­rary di­rec­tory.
    #
    # This test will fail and we won't ac­cept that! It's enough to just re­place
    # "false" with the main pro­gram this for­mula in­stalls, but it'd be nice if you
    # were more thor­ough. Run the test with `brew test cidrmerge`. Op­tions passed
    # to `brew in­stall` such as `--HEAD` also need to be pro­vided to `brew test`.
    #
    # The in­stalled folder is not in the path, so use the en­tire path to any
    # ex­e­cuta­bles be­ing tested: `sys­tem "#{bin}/pro­gram", "do", "some­thing"`.
    sys­tem "false"
  end
end

这个小程序没有任何依赖项,只需要执行 make 就能完成编译,只需要保留编译完成得到的 cidrmerge 程序即可,所以只需要添加上项目主页的网址,并编写简单的安装脚本:

class Cidrmerge < For­mula
  home­page "http://cidrmerge.source­forge.net"
  url "https://down­loads.source­forge.net/project/cidrmerge/cidrmerge/cidrmerge-1.5.3/cidrmerge-1.5.3.tar.gz"
  sha256 "21b36fc8004d4fc4edae71dfaf1209d3b7c8f8f282d1a582771c43522d84f088"

  def in­stall
    sys­tem "make"
    bin.in­stall "cidrmerge"
  end
end

使用 sys­tem 表示执行后续的命令:

sys­tem "make"

使用 bin.in­stall 表示在 bin 目录下安装 cidrmerge 主程序:

bin.in­stall "cidrmerge"

类似的还有:sbin.in­stalletc.in­stall 等诸多命令可以使用,具体请查阅 官方说明

最后加上测试脚本:

test do
  in­put = <<-EOS.un­dent
    10.1.1.0/24
    10.1.1.1/32
    192.1.4.5/32
    192.1.4.4/32
  EOS
  as­sert_equal "10.1.1.0/24\n192.1.4.4/31\n", pipe_out­put("#{bin}/cidrmerge", in­put)
end

这样,一个完整的安装包脚本就编写完成了。

提交全新的软件包

提交全新的软件包和提交软件包更新的方法类似,也是单独开一个 branch、com­mit、push to re­mote,不过 com­mit mes­sage 需要使用 foo­bar 7.3 (new for­mula)这样的形式。pull re­quest 的 ti­tle 也需要使用相同的形式。

通常你的软件包并不会一次过关,常常需要按照要求更改几次,在本地进行修改之后重新 com­mit,然后 push 到你的 Home­brew 的 fork 的相同的分支下。此时可以随意填写 com­mit mes­sage。比如 cidrmerge 就被提了 许多建议

当你的软件包通过审核之后,你的所有 com­mits 会被 squash 到第一个 foo­bar 7.3 (new for­mula)的 com­mit 下,然后被 merge 到 Home­brew 项目,随后 pull re­quest 被关闭。

最后你就会收到祝贺与感谢,比如:

Thanks for the pull re­quest! 🎉 Home­brew de­pends on con­tri­bu­tions from com­mu­nity mem­bers like you and we're grate­ful for your sup­port.