Open8

GitHubみたいなサービスを今一から作るならどの言語・フレームワークを使うか

Webアプリとしての表層のフロントエンドや、主となるバックエンドは正直いってどんな言語・フレームワークでも良いと思う。ただ「GitHubみたいなサービス」のキモはやはりGitリポジトリの取り扱いになるので、その部分のライブラリに良いものを選ぶことが重要となる。ちなみにGitBucketの場合はJGitを使っている

GitHub自体がどうなっているかは分からないが、同種のサービスであるGitLabはソースが公開されている部分もあるので参考になる。よく「GitLabはRuby on Rails」と言われるが、実はGitリポジトリ操作・連携の部分は別サービスに切り出されていて、それはGoで書かれていたはず。なんかソース読んでたら突然Goになったんで覚えている。ライブラリとしては多分git2goかな。Rubyにもruggedがあるが、多分パフォーマンスとかの問題で切り替えたのだろうと思われる

Gitライブラリは多くの言語ではlibgit2のラッパーを使うことになるでしょう。JVM系の言語を選んだ場合はJGitベースになるでしょう

  • そのラッパーライブラリが元のlibgit2の機能をどこまで網羅しているか
  • その言語固有のパラダイムなどにどれだけフィット出来ているか
  • 開発や利用の活発さ
    この辺りが評価ポイントかな、と。最後の一つはどんなライブラリにも言えることだろうけど

libgit2, JGit以外の選択肢は多分、Javascript系言語でisomorphic-gitが出てくるくらいかな。
Rustでの実装みたいな、さすがにサービスの基盤に使うまでにはちょっと・・・っていうものなら他にもあるだろうけど

ちなみにJGitの場合、git push / git pull を処理するServletが簡単に作れるというメリットもある(なのでGitBucketはこれで楽しているし、逆に言えばServletに囲い込まれてるともいえる)。libgit2の場合どうなってたかはよく知らないけど、Go言語で実装されたGitHub類似WebアプリのGogs, Giteaはsshで特別なコマンドを叩くユーザを作っておけ、だったような覚え・・・(ここは特にうろ覚え)

なんとなくお気持ちを垂れ流すと、このgitライブラリの部分は本当に面倒くさくて、大変。更に言えばそのライブラリを使ってGitリポジトリを取り扱うコードを書いたとして、次はトランザクションの問題が出てくる。ユーザとかリポジトリ名とかPull RequestとかはRDBMSなりなんなりを使って別で管理しているだろうから、データストアが2つ以上になってしまうわけで。タイミングによって悪いケースで「PRをマージしたことになってるけどGitリポジトリには反映されてない」とか、「マージされてないはずが、Gitリポジトリは反映されている」とかなるともう大変・・・(GitBucketでもゴニョゴニョ・・・)

というわけで、「Gitライブラリを中心として選択すべし」というのが回答ですねー。おしまい!

ログインするとコメントできます