brew install mikutter

MikutterInstallBattle on macOS 2016

Posted by midchildan on November 8, 2016

今日Homebrewにmikutterのフォーミュラを追加したmikutterとはプラグイン拡張可能なツイッタークライアントであり、主に日本のLinuxユーザーに愛用されてる。Debianなどではmikutterのパッケージが用意されていてコマンド一発でインストールすることができるが、macOSでのインストールは少し面倒な手順を踏む必要があった。そこで以前インストールスクリプトを書くなどしたがやはり面倒だからmacOSで人気のあるパッケージマネージャーのHomebrew向けにフォーミュラを作ることにした。今回はmikutterのインストール方法とフォーミュラ作成の流れについて書く。

インストール方法

Homebrewで一発(完)。Homebrewでは利用が少ないないフォーミュラは無慈悲に消されるのでじゃんじゃんインストールしよう。

1
$ brew install mikutter

あとはターミナルに mikutter と打ち込むだけで実行できる。さらに以下の手順を踏めばより使いやすくすることができる。

mikutter-mac プラグイン

初期状態ではいくつかの機能が使えないため、mac向けのプラグインを用意した。これをインストールすると

  • 音声の有効化
  • 通知の有効化
  • Dockにアイコンの表示
  • LaunchpadやSpotlightから起動

などが可能になる。

GTK テーマ

GTKテーマを導入することによって見た目を良くすることができる。まずは必要なパッケージを導入する。

1
brew install gtk-engines gtk-murrine-engine

そして好きなテーマを見つけて導入するれば良い。自分はZukitreというテーマを利用してる。

1
2
3
4
mkdir ~/.themes
cd ~/.themes
git clone https://github.com/lassekongo83/zuki-themes.git
echo "include \"$HOME/.themes/zuki-themes/Zukitre/gtk-2.0/gtkrc\"" > ~/.gtkrc-2.0

フォーミュラ作成の流れ

ドキュメントを読む

最初に公式ドキュメントに目を通した。以下の3つが特に重要だった。

細かい書き方などはドキュメントに書かれてなく、レポジトリのコードを参考にする必要があった。しかし最近Homebrew本体そのフォーミュラが別々のレポジトリで管理されるようになったため、フォーミュラで使えるメソッドの定義と使用例を別々に検索することができて便利だった。

問題点

ドキュメントに目を通したところ、ある問題が浮上した。Homebrewでは gempip などを使ってHomebrewを介さずにダウンロードを行うフォーミュラは基本的に受け付けない。したがってgemやPythonのパッケージを依存関係に利用する場合はHomebrewのresource文を利用して必要なパッケージごとにURLとハッシュ値を指定する決まりになっている

しかしパッケージの依存関係やそれら全てのURLとハッシュ値を手動で調べるのは大変な手間がかかる。mikutterの場合は最終的に必要なgemが40個存在し、これを手動でやるとそれなりに時間がかかる。PythonやGoで書かれたものであれば homebrew-pypi-poetgdm などのツールが面倒を見てくれるが、Rubyのgemに関してはこういったツールは存在しなかった。そういう訳で GemfileからHomebrewの resource 文を自動生成するツールresonaを作った。なおresonaという名称は”Homebrew resource stanza generator for RubyGems dependencies”の略であり決して大蔵りそなと関係はない。拙者はオタクではござらんので(コポォ

また、resonaを元にしてmikutterフォーミュラを更新するスクリプトも公開した

テストの作成

Homebrewのフォーミュラにはパッケージングに問題がないかを確認するためのテストが書かれる。GUIのツイッタークライアントをどうやってテストするか少し悩んだが、GUIなどを無効にしつつ読み込んでからしばらくして終了するプラグインを用意することによって対処した。

1
2
3
4
5
6
7
8
9
10
test do
  test_plugin = <<-EOS.undent
    # -*- coding: utf-8 -*-
    Plugin.create(:brew) do
      Delayer.new { Thread.exit }
    end
  EOS
  (testpath/"plugin/brew.rb").write(test_plugin)
  system bin/"mikutter", "--confroot=#{testpath}", "--plugin=brew", "--debug"
end

プルリクを送る

いくつかHombrewのバグ(brew#1209, hombrew-core#5413, homebrew-core#5482, brew#1404)を踏むなどしたが、無事マージ できてよかった。