バグ #1145
完了README の「必須アプリ−ケーション」の Ruby バージョン表記が古い
説明
mikutter 3.6.0 から Ruby 2.3 以降のみのサポートになりましたが
READMEの「必須アプリケーション」の記載は以下のように古いままになっています。
- 必須アプリケーション:
- ruby (2.1 - 2.3)
……という pkgsrc のバグ報告が来ました。 http://gnats.netbsd.org/52884
READMEをどこまでリアルタイムに追従させるのかという話はありますが、
3.6.0 時点での必須アプリについて Ruby と gem とに分けて書いてみました。
README.diff
他にも直そうとするとエンドレスですが、どんなもんでしょう。
ファイル
toshi_a 初音 さんがほぼ7年前に更新
これを書いた当時は、ここに書いているgemくらいにしか対応していませんでしたが、今ではBundlerを利用することを前提に多数のgemに依存しているので、表記するのは現実的ではないで、Gemfileだけでいいと思います。様々なパッケージリポジトリで扱ってもらっている今、Gemfile{,.lock}は、この情報が本当に必要な人間にとっては読めるものだと思います。
RubyのバージョンもGemfileに書いてもよさそうですが、GemfileにRubyのバージョンを書くことには、あまりメリットがなかったと思うので多少調べて対応しない方向で考えます。
どちらにしても、READMEにこれらの情報を書くのはもはや混乱しか生まないため、削除することを検討しています。
Izumi Tsutsui さんがほぼ7年前に更新
直接関係ありませんが
https://mikutter.hachune.net/faq
のFAQでの動作条件も Ruby 2.1.0 以降になっていますね……
toshi_a 初音 さんがほぼ7年前に更新
- ステータス を 新規 から レビュー待ち に変更
- 担当者 を Izumi Tsutsui にセット
#1145-1 で言っていたことを a3af31aa でやりました。
ruby-gtk2が必要などは、パッケージマネージャでそれを入れることを前提に考えて書いていました。gtk2 gemはlibgtk2パッケージの依存関係でついてくるはずだというふうに考えていたということです。bundlerを使っていればそちらでruby-gtk2はインストールされてしまうため、これは成り立ちません。
言葉足らずだったため補足すると、同じ情報があちこち(READMEとGemfile)に散らばっていると、読む方も更新する方も大変なので、bundlerまたはパッケージマネージャを使ってmikutterをインストールする現代において、READMEにこの情報を書いておくのは本件のような問題を起こすだけなのではないかと思いました。
パッケージメンテナ的にはどうなんでしょうか。お互いにとってこれが最善と思ってやっているので、都合が悪いということがあれば教えてほしいです。
Izumi Tsutsui さんがほぼ7年前に更新
- 担当者 を Izumi Tsutsui から toshi_a 初音 に変更
立場によって見方がいろいろあると思うので、参照用につらつら書いてみます。
(注意:経験値ベースのみの話なので、知っている人から見たら見当違いのことを書いているかもしれません)
結論¶
- 「bundlerまたはパッケージマネージャを使ってmikutterをインストールする」という前提では、一般ユーザーに対しては
Ruby のバージョンについて「ruby :: Gemfile に記載されているRubyのバージョンを参考にしてください」と言及する
だけで良いと思います
- パッケージシステムのメンテナ(もしくはバグレポを送るような人であるが ruby にあまり詳しくない人たち)に対しては
「必要な gem については Gemfile および core/plugin/*/Gemfile を参照してください」
という言及があると助けになる、という気はします
パッケージシステムでの gem 依存の記述¶
- bundler では Gemfile の記載に従って必要な gem のバージョンが適切に入る(んですよね?)
- パッケージシステムにおいては、 Gemfile の記載は参照されず、パッケージシステム固有の依存関係として指定される
- つまり、パッケージシステムの管理者はパッケージ作成時・更新時に、
各 gem もしくはアプリの Gemfile もしくは Rakefile 等を参照して適切な依存関係記述をする必要がある- pkgsrc はこんな感じに Makefile 等に記載
http://cvsweb.netbsd.org/bsdweb.cgi/pkgsrc/net/mikutter/Makefile?rev=1.151&content-type=text/x-cvsweb-markup - debian はこの control のファイル?
https://anonscm.debian.org/cgit/collab-maint/mikutter.git/tree/debian/control
https://anonscm.debian.org/cgit/pkg-ruby-extras/ruby-gnome2.git/tree/debian/control
- pkgsrc はこんな感じに Makefile 等に記載
パッケージシステムで gem 依存関係の問題が出る原因¶
- パッケージシステム管理者すべてが gem に詳しいわけではないので、
upstream 側の変更として Gemfile 等で依存関係記載が更新されたことに気づかず
パッケージシステム側の記載をミスっていることがある- 必要な gem がたまたま他のパッケージの依存関係で入ってしまっていると動いてしまうので、
Live Image のようなまっさらな環境でテストしないと検出されなかったりする
- 必要な gem がたまたま他のパッケージの依存関係で入ってしまっていると動いてしまうので、
- 例: ruby-gnome2 の pango gem は 3.1.1 → 3.1.2 で cairo-gobject, gobject-introspection の依存が追加された
https://github.com/ruby-gnome2/ruby-gnome2/commit/35f5c1fd3413322f84049c0d725cff0e879be0d8#diff-96b71829ec51dd9bfcd2ae88683448fc- pkgsrc では 3.1.1 → 3.1.6 に一気に上げた時に依存関係をチェックするのを忘れてエラーになって後から直した
http://cvsweb.netbsd.org/bsdweb.cgi/pkgsrc/devel/ruby-gnome2-pango/Makefile#rev1.54 - debian, ubuntu のパッケージでも 3.1.8 まで依存の記載が漏れていた
- debian では修正されているっぽい
https://anonscm.debian.org/cgit/pkg-ruby-extras/ruby-gnome2.git/commit/?h=debian/3.1.8-7&id=f6a8f4dc0175ca94c2e556e620aa9dadc4bd7e68 - ubuntu はまだ直っていない?
https://launchpad.net/ubuntu/artful/arm64/ruby-pango/3.1.8-6
https://bugs.launchpad.net/ubuntu/+source/mikutter/+bug/1733041
- pkgsrc では 3.1.1 → 3.1.6 に一気に上げた時に依存関係をチェックするのを忘れてエラーになって後から直した
自分自身は pkgsrc 担当として Gemfile や Rakefile の依存関係記載に差分がないかをチェックするようにしましたが、
ruby-gnome2 を見ると upstream のソースツリーから依存関係記載が漏れていることもある
https://github.com/ruby-gnome2/ruby-gnome2/issues/1107
ので、「必要な gem についての依存関係についてはまず Gemfile を見よ」という情報があると助かるかも、
というくらいです。
その他のパッケージシステム側都合¶
- mikutter 3.6.0 で twitter-text gem 2.1.0 必須という変更が入りましたが、
debian では mikutter 本体側にパッチを当てて twitter-text gem 1.14.7 等でも動くような設定にしているようです。
https://twitter.com/dai_lxr/status/945220489760333824
https://twitter.com/dai_lxr/status/945596816493391872
https://anonscm.debian.org/cgit/collab-maint/mikutter.git/tree/debian/patches/require_twitter_text_1.14.6.patch
- 一般に、パッケージシステムにおいては同一のパッケージの複数バージョンの共存というのが面倒なので、
パッケージシステム独自の細工が入っていることはよくあります。- Gemfile で非互換指定があっても動いていそうであればむりやり Gemfile の依存関係記載を上書きする
- 複数バージョンを共存する場合にパッケージ名を別のものにする(suffixを付ける等)
このあたりの問題になってくると mikutter 本体の問題なのかパッケージシステム側の問題なのか、
(つまり、 mikutter 自体をどうやってインストールしたのか)という話になってきます。
ArchLinux の AUR だと mikutter.3.6.x.tar.gz の tarball の vendor 以下のファイルを使っているとすると、
これはまたそういう前提で検証が必要になると思います。
toshi_a 初音 さんがほぼ7年前に更新
- ステータス を レビュー待ち から 実装待ち に変更
そういうことであれば、 a3af31aa に
必要な gem については Gemfile および core/plugin/*/Gemfile を参照してください
のような記述を加えれば大丈夫そうですね。
Izumi Tsutsui さんがほぼ7年前に更新
本題からは少し外れますが
mikutter/Gemfile には
gem 'json_pure', '~> 1.8'
と書かれているのですが、 require 'json_pure' しているファイルは無いようです。
twitter プラグインの中で require 'json' しているものはありますが。
json_pure gem は必要・不要 いずれでしょうか。
toshi_a 初音 さんがほぼ7年前に更新
- ステータス を 実装待ち から レビュー待ち に変更
- 担当者 を toshi_a 初音 から Izumi Tsutsui に変更
- ブランチ を topic/1145-update-environment-requirements にセット
pushしました。確認お願いします。
json_pure¶
json_pureは現在も利用しています。json_pureは標準のJSONライブラリを、Rubyだけで書かれた実装に置き換えるために利用しています。
Twitterプラグインでは、マルチスレッドのデータ競合問題を起こしにくいJSONのパースはメインスレッド以外で行って、UI処理がブロックされないようにしているので全てRubyで書かれていることに価値があります。
しかし今はRuby1.8とは状況が大幅に異なっているし、サーバAPIが返してくる程度のJSONの処理にそこまで時間がかかるのかといった疑問もあります(なので、YajlやOjといったより高速なJSONパーサの存在を知っていて利用していません)。
一方でjson_pureを外してどのような影響が出てくるか調査するコストを払うことに特にメリットは無さそうだと思っているので、何もしていません。
パッケージするgemが一つ減って負担が軽くなるということであれば、十分やる理由にはなるかなと思います。
Izumi Tsutsui さんがほぼ7年前に更新
- ステータス を レビュー待ち から マージ待ち に変更
テキストファイルなので差分確認しました。問題ありません。
json_pure¶
pkgsrc だと json_pure の指定方法がいつの間にか変わっていて
気がつくと json_pure が入っていない状態で mikutter を動かしていたのですが、
その状態でも動作自体は問題ありませんでした。
json_pure を入れた場合に処理負荷というかフィーリングが変わるかどうかはしばらく試してみます。
(といってもこのチケットはクローズされてしまうので、違いがなさそうなら別チケット入れます)