Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
NATIVE EXTENSION
のビルド
どうしてますか?
(改訂版)
kawasaki.rb #37 @ 20160623
ぺけみさお
発表者紹介
ぺけみさお
プログラマ
http://www.xmisao.com/
一言で言うと
辛い
具体的な辛み
OSやディストリビューションによってビルドに必要な
パッケージが異なる。
最近は、Dockerなどで、Alpine Linux(以下Alpine)など
の使い慣れないOSを使用する機会もある。
nokogiriはとても良いライブラ...
理想
あらゆるOSで動くこんな感じのsome-magical-
commandが作りたい。
以下はnokogiriをインストールする場合。
# nokogiriのgem installに必要なものが全部入る
some­magical­comma...
とはいえ…
さすがにどんなGEMも
ビルドできるようにする
マジカルなものは作れない
妥協したアプローチ
Linuxのディストリビューションで、gemのバイナリが提
供されていれば、そのバイナリをビルドするための情報
が何らかの形で取得できるので、それを手がかりに依存
パッケージを見つける。
時間に限りがあるので
とりあえずALPINEを
対象に試作してみる
ALPINEの調査と検証
調査
APKBUILD
Alpineで、実行時・ビルド時のパッケージの依存関係
などの情報が書かれたファイル。
このファイル中のmakedependsにビルドに必要なパ
ッケージが指定されている。
ALPINEのGITリポジトリ
APKBUILDは以下のaportsというgitリポジトリで管理
されている。
また で直接見るこ
とも可能。
http://git.alpinelinux.org/cgit/aports/
git clone ...
APORTSのブランチ構成
各バージョン毎にブランチが切られている。
(以下は抜粋)
特定のバージョンのAPKBUILDが入手可能。
2.4­stable
2.5­stable
2.6­stable
2.7­stable
3.0­stable
...
APKBUILDファイルのパス
Alpineのnokogiriのパッケージ
ruby-nokogiriの場合。
unmaintained/ruby­nokogiri/APKBUILD
unmaintainedという単語が
Rubyistの不安を...
APKBUILDの確認
ruby-nokogiriのAPKBUILDを確認する。この中で興
味があるのはmakedependsのみ。
ruby-dev, libxml2-dev, libxslt-devパッケージ
が必要とわかる。
# Cont...
検証
事前準備
依存関係にないが、Alpineの場合、
以下のパッケージはgemのビルドに必須…無念。
apk add ruby build­base
(*) rubyはgemコマンドも含む。
build-baseはgccなどビルドに必須のツールを含...
パッケージのインストール
apk add ­­no­cache ruby­dev libxml2­dev libxslt­dev
実行
gem install nokogiri
結果
Building native extensions.  This could take a while...
Successfully installed nokogiri­1.6.8
ERROR:  While executing g...
再実行
gem install ­­no­ri ­­no­doc nokogiri
結果
Building native extensions.  This could take a while...
Successfully installed nokogiri­1.6.8
1 gem installed
成功!
ちょっと整理
ALPINEでGEMをビルドする
gem名 ->
alpineパッケージ名 ->
alipneパッケージのAPKBUILD(makedepends) ->
gem installに必要なパッケージ名
他のOSに一般化
gem名 -...
試作
TIROFINALEコマンド
https://github.com/xmisao/tirofinale
(*)現在のバージョン0.1系は試作。実装は雑
で、nokogiriくらいしか動かない他、Alpine 3.4のみで
動作する。
#!/us...
TIROFINALEのインストール
gem install tirofinale
TIROFINALEコマンドの使用法
入力
コマンドライン引数にgem名を指定する。
tirofinale nokogiri
出力
gemをビルドするためのAlpineのパッケージ名がスペー
ス区切りで返る。
ruby­dev libxml2­...
デモ
NOKOGIRIのサンプルプログラム
以下サンプルをAlpineで動かしたいとする。
https://github.com/sparklemotion/nokogiri
#! /usr/bin/env ruby
require 'nokogir...
DOCKERFILE
サンプルが動作する
Dockerイメージを作成することにする。
FROM alpine:3.4
MAINTAINER xmisao
RUN apk ­­no­cache add ruby build­base
RUN ge...
実行!
docker build ­t tirofinale­demo .
docker run ­it ­­rm tirofinale­demo
結果!
### Search for nodes by css
Docs
GitHub
Installation
Tutorials
Getting Help
以下略
ちゃんと動作しました!
実用化に向けての課題
gemが依存するgemをインストールできるように、自
力でgemの依存関係をたどる必要あり。
APKBUILDファイルは変数のようなものが使えるの
で、正しくビルドするには構文解析が必要。
他のOSの対応 ... 少なくと...
まとめ
APKBUILDを手がかりに、native extensionのgemをビル
ド可能にする方法を、tirofinaleを試作して検証した。
tirofinaleは、Rubyのnative extensionに対する最後の一
射として、今...
ご清聴
ありがとう
ございました
Upcoming SlideShare
Loading in …5
×

Native Extensionのビルドどうしてますか?

1,466 views

Published on

kawasaki.rb #37 で発表した内容を、ネットで公開するために加筆・修正した資料です。
Rubyのnative extensionのgemのビルドを簡単に行うコマンドを試作しました。

Published in: Engineering
  • Be the first to comment

Native Extensionのビルドどうしてますか?

  1. 1. NATIVE EXTENSION のビルド どうしてますか? (改訂版) kawasaki.rb #37 @ 20160623 ぺけみさお
  2. 2. 発表者紹介 ぺけみさお プログラマ http://www.xmisao.com/
  3. 3. 一言で言うと
  4. 4. 辛い
  5. 5. 具体的な辛み OSやディストリビューションによってビルドに必要な パッケージが異なる。 最近は、Dockerなどで、Alpine Linux(以下Alpine)など の使い慣れないOSを使用する機会もある。 nokogiriはとても良いライブラリだけれ ど、nokogiriのビルドで、いったい何人の初心者 Rubyistが心を挫かれたことだろう…。
  6. 6. 理想 あらゆるOSで動くこんな感じのsome-magical- commandが作りたい。 以下はnokogiriをインストールする場合。 # nokogiriのgem installに必要なものが全部入る some­magical­command nokogiri # nokogiriがすんなり入る gem install nokogiri
  7. 7. とはいえ… さすがにどんなGEMも ビルドできるようにする マジカルなものは作れない
  8. 8. 妥協したアプローチ Linuxのディストリビューションで、gemのバイナリが提 供されていれば、そのバイナリをビルドするための情報 が何らかの形で取得できるので、それを手がかりに依存 パッケージを見つける。
  9. 9. 時間に限りがあるので とりあえずALPINEを 対象に試作してみる
  10. 10. ALPINEの調査と検証
  11. 11. 調査
  12. 12. APKBUILD Alpineで、実行時・ビルド時のパッケージの依存関係 などの情報が書かれたファイル。 このファイル中のmakedependsにビルドに必要なパ ッケージが指定されている。
  13. 13. ALPINEのGITリポジトリ APKBUILDは以下のaportsというgitリポジトリで管理 されている。 また で直接見るこ とも可能。 http://git.alpinelinux.org/cgit/aports/ git clone git://git.alpinelinux.org/aports
  14. 14. APORTSのブランチ構成 各バージョン毎にブランチが切られている。 (以下は抜粋) 特定のバージョンのAPKBUILDが入手可能。 2.4­stable 2.5­stable 2.6­stable 2.7­stable 3.0­stable 3.1­stable 3.2­stable 3.3­stable 3.4­stable
  15. 15. APKBUILDファイルのパス Alpineのnokogiriのパッケージ ruby-nokogiriの場合。 unmaintained/ruby­nokogiri/APKBUILD unmaintainedという単語が Rubyistの不安を掻き立てる…。
  16. 16. APKBUILDの確認 ruby-nokogiriのAPKBUILDを確認する。この中で興 味があるのはmakedependsのみ。 ruby-dev, libxml2-dev, libxslt-devパッケージ が必要とわかる。 # Contributor: Fabian Affolter <fabian@affolter­engineering.ch> # Maintainer: Fabian Affolter <fabian@affolter­engineering.ch> _gemname=nokogiri pkgname=ruby­$_gemname pkgver=1.6.7.2 pkgrel=1 pkgdesc="An HTML, XML, SAX, and Reader parser" url="http://nokogiri.org/" arch="all" license="MIT" depends="ruby ruby­mini_portile2" depends_dev="" makedepends="ruby­dev libxml2­dev libxslt­dev" install="" subpackages="" source="http://gems.rubyforge.org/gems/$_gemname­$pkgver.gem"
  17. 17. 検証
  18. 18. 事前準備 依存関係にないが、Alpineの場合、 以下のパッケージはgemのビルドに必須…無念。 apk add ruby build­base (*) rubyはgemコマンドも含む。 build-baseはgccなどビルドに必須のツールを含む。
  19. 19. パッケージのインストール apk add ­­no­cache ruby­dev libxml2­dev libxslt­dev
  20. 20. 実行 gem install nokogiri
  21. 21. 結果 Building native extensions.  This could take a while... Successfully installed nokogiri­1.6.8 ERROR:  While executing gem ... (Gem::DocumentError)     RDoc is not installed: cannot load such file ­­ rdoc/rdoc 世知辛い。 Alpineではrdocなどが別パッケージ。 gem installには--no-riおよび--no-docオプシ ョンの指定が必要。
  22. 22. 再実行 gem install ­­no­ri ­­no­doc nokogiri
  23. 23. 結果 Building native extensions.  This could take a while... Successfully installed nokogiri­1.6.8 1 gem installed 成功!
  24. 24. ちょっと整理 ALPINEでGEMをビルドする gem名 -> alpineパッケージ名 -> alipneパッケージのAPKBUILD(makedepends) -> gem installに必要なパッケージ名 他のOSに一般化 gem名 -> OSのパッケージ名 -> OSのパッケージのビルド用定義 -> gem installに必要なパッケージ名
  25. 25. 試作
  26. 26. TIROFINALEコマンド https://github.com/xmisao/tirofinale (*)現在のバージョン0.1系は試作。実装は雑 で、nokogiriくらいしか動かない他、Alpine 3.4のみで 動作する。 #!/usr/bin/env ruby require 'open­uri' gem_name = ARGV[0] alpine_version = "3.4­stable" apkbuild_url = "http://git.alpinelinux.org/cgit/aports/plain/unmaintained/ apkbuild = open(apkbuild_url){|f| f.read} makedepends = apkbuild.match(/^makedepends="(.*?)"/).to_a[1].strip. print makedepends.join(' ')
  27. 27. TIROFINALEのインストール gem install tirofinale
  28. 28. TIROFINALEコマンドの使用法 入力 コマンドライン引数にgem名を指定する。 tirofinale nokogiri 出力 gemをビルドするためのAlpineのパッケージ名がスペー ス区切りで返る。 ruby­dev libxml2­dev libxslt­devy (*)実際の出力に末尾の改行は入らない
  29. 29. デモ
  30. 30. NOKOGIRIのサンプルプログラム 以下サンプルをAlpineで動かしたいとする。 https://github.com/sparklemotion/nokogiri #! /usr/bin/env ruby require 'nokogiri' require 'open­uri' # Fetch and parse HTML document doc = Nokogiri::HTML(open('http://www.nokogiri.org/tutorials/installing_no puts "### Search for nodes by css" doc.css('nav ul.menu li a', 'article h2').each do |link|   puts link.content end puts "### Search for nodes by xpath" doc.xpath('//nav//ul//li/a', '//article//h2').each do |link|   puts link.content end
  31. 31. DOCKERFILE サンプルが動作する Dockerイメージを作成することにする。 FROM alpine:3.4 MAINTAINER xmisao RUN apk ­­no­cache add ruby build­base RUN gem install ­­no­ri ­­no­doc tirofinale # ここがポイント RUN apk ­­no­cache add `tirofinale nokogiri` RUN gem install ­­no­ri ­­no­doc nokogiri COPY sample.rb /root/sample.rb CMD ruby /root/sample.rb
  32. 32. 実行! docker build ­t tirofinale­demo . docker run ­it ­­rm tirofinale­demo
  33. 33. 結果! ### Search for nodes by css Docs GitHub Installation Tutorials Getting Help 以下略 ちゃんと動作しました!
  34. 34. 実用化に向けての課題 gemが依存するgemをインストールできるように、自 力でgemの依存関係をたどる必要あり。 APKBUILDファイルは変数のようなものが使えるの で、正しくビルドするには構文解析が必要。 他のOSの対応 ... 少なくともDebianはapt-get build-dep があるのでイケそう。他のディストリビューションと MacやWindowsはどうする? そもそもOSでバイナリパッケージが提供されない場合 にどうするか。何らかのフォローが必要。 OSやgemのバージョンの相互の関係性など。このあた りの組み合わせは、CI的な方法でビルド可能なことを 検証して共有したい。
  35. 35. まとめ APKBUILDを手がかりに、native extensionのgemをビル ド可能にする方法を、tirofinaleを試作して検証した。 tirofinaleは、Rubyのnative extensionに対する最後の一 射として、今後実用的に使用できるよう開発したい。
  36. 36. ご清聴 ありがとう ございました

×