rcmdnk's blog

The Persistence Formula: Follow Through, Stop Quitting, Stay Focused, Avoid Distraction, Achieve Your Goals, Control Your Habits, Maximize Productivity, ... Enjoy The Entire Journey (English Edition)

homebrew-file のFormulaをちょっと公式に入れてみようかな、 と思った時にチェックしたりした部分について。

ちょっと前から変わってたりした部分もあったので再度確認を兼ねてのメモ。

Homebrewの公式Formulaを作る

以前、 Homebrew用のパッケージの簡単な作り方 とか書いたことが有りますが、 Homebrew自体が結構アップデートされてて 新しい書き方とか色々変更があるので一つ一つチェック。

取り敢えず、

homebrew/Formula-Cookbook.md: https://github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/Formula-Cookbook.md#formula-cookbook

を一通り読んでおく。

brew audit

後は

$ brew audit brew-file

とすると色々とエラーなどをチェックしてくれます。

さらに

$ brew audit --strict brew-file

と、--strictを付けるとより厳しくチェックしてくれます。

このコマンドでチェックするためには/usr/local/Library/Formula/ にあるかTapしたレポジトリ内に無いとチェックできないので、 まだ入れてないFormulaをチェックしたい場合には 取り敢えず/usr/local/Library/Formula/とかに入れてチェックする必要があります。

取り敢えずスタート時のFormula:

brew-file.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
require 'formula'

HOMEBREW_BREW_FILE_VERSION = '3.4.0'
HOMEBREW_BREW_FILE_BASH_VERSION = '1.1.8'
class BrewFile < Formula
  homepage 'https://github.com/rcmdnk/homebrew-file/'
  url 'https://github.com/rcmdnk/homebrew-file.git', :tag => "v#{HOMEBREW_BREW_FILE_VERSION}"
  version HOMEBREW_BREW_FILE_VERSION
  head 'https://github.com/rcmdnk/homebrew-file.git', :branch => 'master'
  if build.include? "bash"
    url 'https://github.com/rcmdnk/homebrew-file.git', :branch => 'bash'
    version HOMEBREW_BREW_FILE_BASH_VERSION
  end

  option "python", "Use python version (same as default)"
  option "bash", "Use bash version"

  skip_clean 'bin'

  def install
    prefix.install 'bin'
    (bin+'brew-file').chmod 0755
    prefix.install 'etc'
  end
end

一応、その昔、公式にあるFormulaを参考にして作ったものです。

チェックすると

$ brew audit brew-file
brew-file:
 * Stable: version 3.4.0 is redundant with version scanned from URL
 * Stable: Git should specify :revision when a :tag is specified.

Error: 2 problems in 1 formulae
$

urltagを指定する時にversionを指定しているので、 ここからversionが取れるから

version: 3.4.0

的なのは必要ないとのこと。なので、version指定の行を削除。 ついでに別途最初にVERSIONを書いておく様なことも 最近のFormulaではしないようなので直接urlの所とかにバージョンを書くように。

brew audit: Is “#{version}” redundant? · Issue #32540 · Homebrew/homebrew

後は、gittag指定の時はrevisionも書かないといけない、とのこと。

homebrew-file をチェックアウトしてきて

$ git log v3.4.0

でチェックして記入。

url 'https://github.com/rcmdnk/homebrew-file.git',
  :tag => "v3.4.0",
  :revision => "90234dda32e09b371ed03804950e99e8de4bf11f"

な感じ。

さらに、Pull Requestとか見てるとtestを入れろ、と言うのが結構あるので、 一応超簡単なテストも入れておく。

test do
  system "brew", "file", "help"
end

他のFormulaを見てもコマンドを呼ぶ程度の簡単な物が殆どなので取り敢えず。

それから最初にある require formulaは今は必要ないので削除。 (Pull Requestで削除するよう言われてるのがあったので。)

変更点: updated formula · rcmdnk/homebrew-file@01b75e9

これで取り敢えずこれでbrew auditでは注意が出なくなったので --strictでチェック。

$ brew audit brew-file
$ brew audit --strict brew-file
==> brew style brew-file
Fetching: ruby-progressbar-1.7.5.gem (100%)
Successfully installed ruby-progressbar-1.7.5
...
7 gems installed
== /usr/local/Library/Taps/rcmdnk/homebrew-file/brew-file.rb ==
C:  2: 12: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.
...

1 file inspected, 12 offenses detected

==> audit problems
brew-file:
 * Options should begin with with/without. Migrate '--python' with `deprecated_option`.
 * Options should begin with with/without. Migrate '--bash' with `deprecated_option`.

Error: 2 problems in 1 formulae
$

出たのはシングルクォートでなくダブルクォートにしろ、という点と、 Optionをwithとかを付ける形にしろ、と言うもの。

これに従ってクォートを変更して、 --bashのオプション等を--with-bashに。

これによって、今まで

if build.include? "bash"
  ...

とやってオプションをチェックしてた部分を

if build.with? "bash"
  ...

と変更。

変更点: fixed audit –strict warnings in brew-file.rb · rcmdnk/homebrew-file@7c53888

ここまでで一度中断してしばらく Brew-fileにコマンド補完を追加 等の違う変更などをしてました。

この間、補完スクリプトを入れるためにetcとかを入れたりしています。

homebrew-file/brew-file.rb at 3da5798403a7ed4a0a1bb73ffc021a455718631e · rcmdnk/homebrew-file

ここでもう一度audit --strict

$ brew audit --strict brew-file
==> brew style brew-file
== /usr/local/Library/Taps/rcmdnk/homebrew-file/brew-file.rb ==
C:  4:  5: Align the elements of a hash literal if they span more than one line.

1 file inspected, 1 offense detected

==> audit problems
rcmdnk/file/brew-file:
 * Formula should have a desc (Description).

Error: 1 problem in 1 formula
$

最初の注意は

url "https://github.com/rcmdnk/homebrew-file.git", :tag => "v3.5.9",
    :revision => "575574b9e6d270dc2f3955df0add6c03ed18b663"

みたいになってる所。hashの値を,で繋いで書いてますが、複数行に別れるなら それぞれ分けて整頓しなさい、と。

url "https://github.com/rcmdnk/homebrew-file.git",
  :tag => "v3.5.9",
  :revision => "575574b9e6d270dc2f3955df0add6c03ed18b663"

みたいにしたらOK。

もう一つはdescの項目が無い、とのこと。 以前(5月位)にやった上の所では出てないのでこの2ヶ月位の間に入ったチェック だと思います。

取り敢えず適当な説明をdescに追加。

変更点: fixed audit check result · rcmdnk/homebrew-file@5a42895

これで一旦レポジトリにpushした所、 Travis CIのテストで、

Error: undefined method `desc' for BrewFile:Class

と出ました。ローカルでやる分には出ないので、 どうやらTravis CIに入ってるHomebrewのバージョンが古いのが原因の模様。 (ということでやはりdescは最近入ったももということ。)

ので、.travis.ymlの中で、before_installの項目に

- brew update

を追加。これで上のエラーは出なくなりました。

Pull Requestして見てもらう

取り敢えずbrew auditでのチェックは通る様になったので Pull Requestを作ってみることに。

初めてのpull request @ GitHub

HomebrewをGitHubでFork。

homebrew/How-To-Open-a-Homebrew-Pull-Request-(and-get-it-merged).md at master · Homebrew/homebrew: https://github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/How-To-Open-a-Homebrew-Pull-Request-(and-get-it-merged).md

それをclonebrew-fileというブランチを作って、そこにbrew-file.rbを入れます。 最初のは hub を使って短縮パスを使ってます。

$ git clone homebrew # = 'git clone [email protected]:rcmdnk/homebrew-file.git', using hub
$ cd homebrew
$ git checkout -b brew-file origin/master
Branch brew-file set up to track remote branch master from origin.
Switched to a new branch 'brew-file'
$ git branch
* brew-file
  master
$ cp ../homebrew-file/brew-file.rb ./Library/Formula/
$ git status
On branch brew-file
Your branch is up-to-date with 'origin/master'.
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        Library/Formula/brew-file.rb

nothing added to commit but untracked files present (use "git add" to track)
$ git add -A
$ git commit -m "added new formula for brew-file"
[brew-file 4888a42] added new formula for brew-file
 1 file changed, 32 insertions(+)
 create mode 100644 Library/Formula/brew-file.rb
$ git status
On branch brew-file
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)
nothing to commit, working directory clean
$ git push origin brew-file
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 837 bytes | 0 bytes/s, done.
Total 5 (delta 3), reused 0 (delta 0)
To [email protected]:rcmdnk/homebrew.git
 * [new branch]      brew-file -> brew-file
$

これでGitHubのページに行ってPull Requestを出します。

added new formula for brew-file by rcmdnk · Pull Request #41819 · Homebrew/homebrew

出した所、色々指摘してもらったので直す。

  • GitHubのレポジトリを使う場合でも、git cloneの代わりにtar ballを取ってきて使う様にする。(submoduleとかを使っててgit cloneが必要な場合は別。)
  • headの指定の時にブランチ名のmasterは冗長なので要らない。
  • bashレポジトリについてはなんとなく前のバージョンを残しておいただけだが、 なんのため?と言われて説明が面倒なのと実際不必要なのでbashオプション削除。
  • pythonオプションもデフォルトなので冗長なため削除。
  • skip_clean "bin"の行については、以前、他のFormulaとかでbinにインストールする物には必ずあって、 きちんとしたドキュメントは見つけられなかったけど取り敢えず入れておいたもの。 インストール前にリンク先にもし同じ名前のファイルがあったら消す、とかだと思うが、 何これ?と言われたので削除(今は不必要?)。
  • (prefix+"etc").install "etc/brew-wrap"としてた部分をetc.install "etc/brew-wrap"にしろ、とのこと。
    • これについては以前、etc.installでやった所、インストールは出来たがアンインストールが上手く行かなかった。
    • prefixを使って場所を指定したらアンインストールも上手く行くようになった。
    • が、今やってみるとetcだけでも上手くいった。。。
      • これも前に入れた時から後にfixされたんだと思います。(多分。。。)

で、取り敢えずFormulaとしての形はOK。

で、入ったのか

実際にやったPull Request を見てもらうと分かりますが、 Homebrew/homebrew-bundle との兼ね合いがあるので 微妙かな、とのコメント。

homebrew-bundle が意外と今も活発にコミットがあってオフィシャル的な扱いになってる感じがします。

ということで、ちょっとPythonで書いたものを Rubyで書き換えて向こうに入れてもらうことを考えようかな、 とちょっと思ってます。

Sponsored Links
Sponsored Links

« GNU/BSDでのsedにおける正規表現の扱いの違い Homebrewのコマンドを作る方法その2 »

}