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:
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 |
|
一応、その昔、公式にある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
$
url
でtag
を指定する時にversion
を指定しているので、
ここからversion
が取れるから
version: 3.4.0
的なのは必要ないとのこと。なので、version
指定の行を削除。
ついでに別途最初にVERSIONを書いておく様なことも
最近のFormulaではしないようなので直接url
の所とかにバージョンを書くように。
brew audit: Is “#{version}” redundant? · Issue #32540 · Homebrew/homebrew
後は、git
のtag
指定の時は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で削除するよう言われてるのがあったので。)
これで取り敢えずこれで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を作ってみることに。
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
それをclone
。
brew-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で書き換えて向こうに入れてもらうことを考えようかな、 とちょっと思ってます。