Text
Page: 1
あなたのそのgem、
Windowsでも動きます
か?
2019-12-14
平成Ruby会議01
#heiseirubykaigi
うなすけ
Page: 2
はじめに
ある日のことであった……
(私がこの発表をしようと思うようになったいきさつを
お話しします。)
Page: 3
Middleman
Ruby製の静的サイトジェネレーター
https://middlemanapp.com/
Page: 4
Middlemanの拡張gemを作ったのです
Middlemanで生成したHTMLの<img>に
loading=”lazy”を付与するgemを作りました | うなす
けとあれこれ
https://blog.unasuke.com/2019/middleman-lazy-
img-loading/
https://github.com/unasuke/middleman-
img_loading_attribute
Page: 5
過程でMiddleman本体にPull Requestを出
したのです
https://github.com/middleman/middleman/pull/
2294
“Conform generated gemspec to bundle gem style”
middleman extension コマンドによって生成される
gemspec を bundle gem の形式に揃えるもの
Page: 6
そしたらこんなコメントが……
This is very nice. Is there a way to check if the
shelling out to git is safe on Windows?
(意訳 「とてもいいね! gitコマンドを呼び出してるけど
Windowsでも大丈夫?」)
https://github.com/middleman/middleman/pull/
2294#issuecomment-540301124
Page: 7
MiddlemanはWindows対応を謳っている
Windows users can install both using
RubyInstaller. For windows RubyInstaller-Devkit
is also required.
https://github.com/middleman/middleman/blob/
master/README.md
でもCIはLinuxでしか動いていない!!!
https://travis-ci.org/middleman/middleman
⇒ そして私はMiddlemanにWindowsでのCIを追加しよ
うと思ったのであった……
Page: 8
いきさつのまとめ
MiddlemanにPull Requestを出したらWindowsでの挙
動を確認されたので、Windows環境でのCIを追加する
ことにした
その過程で得られた知見をお話しします
Page: 9
自己紹介
名前 : うなすけ
仕事 : プログラマー (フリーランス)
インフラ寄りサーバーサイドエンジニア
Ruby, Rails, Kubernetes…
Itamae gem maintainer
GitHub @unasuke
Mastodon @unasuke@mstdn.unasuke.com
Twitter @yu_suke1994
Page: 10
アンケート、その前に
これから皆さんにアンケートを4つ出します。
絶対挙手してほしい!というわけではないですが、自分
かどうだったかを思い出してみてください。
Page: 11
アンケート
みなさん、どのOSを日常で使っていますか?
macOS
Catalina
Mojave
Linux
Ubuntu
Arch Linux (発表者のマシン)
Windows
Page: 12
アンケート2
みなさんは以下OSがインストールされているマシンを
持っていますか?
macOS
Linux
Windows
Page: 13
アンケート3
みなさんが最初に触ったパソコンのOSは何でしたか?
macOS
Linux
Windows
その他
Page: 14
アンケート4
みなさんはRubyGemを作成し、公開していますか?
はい
まだ
Page: 15
OSのシェア (画像はマイナビより)
https://netmarketshare.com/operating-system-
market-share.aspx
Page: 16
Rubygems and Bundler metrics
https://ecosystem.rubytogether.org/
Page: 17
デスクトップOSのシェア
Windows >> macOS + others
⇒ Windowsで動けばユーザーが増える!!!
Page: 18
WindowsでRubyを動かす方法
https://rubyinstaller.org/ を使うとRubyをWindowsに
インストールすることができます
https://railsgirls.jp/
install#setup_for_windows_without_wsl
Page: 19
あなたのgem、Windowsで動きましたか?
Page: 20
gemをWindowsで動くようにしよう!
MiddlemanのtestがWindowsでpassするようになる
までにやったことを紹介します
Page: 21
shell commandを使わない
def cleanup!
Dir.chdir ROOT
`rm -rf #{TMP}` if File.exist? TMP
end
https://github.com/middleman/middleman/blob/
ba2098ec/middleman-core/spec/support/given.rb
Windowsには rm コマンドが存在しないので実行できな
い
Page: 22
shell commandを使わない
def cleanup!
Dir.chdir ROOT
- `rm -rf #{TMP}` if File.exist? TMP
+ FileUtils.remove_entry_secure(TMP) if File.exist? TMP
end
FileUtils を使うなど、なるべく Pure Rubyで実装する
Page: 23
なるべくPure Rubyで実装する
実のところWindows専用アプリでもないにも関わ
らずこれほど力を入れてWindows対応がなされて
いるものって、なかなか見ないよ。本当に。頭が
下がります。
https://shyouhei.tumblr.com/post/64498820681/10年
代のrubyコア用語集 より
Page: 24
Gem.win_platform? で分岐する
Windowsとその他のOSで処理を分けたい場合、
Gem.win_platform? を使用する
Cucumber::Rake::Task.new do |t|
exempt_tags = ["--tags 'not @wip'"]
exempt_tags = if Gem.win_platform?
["--tags 'not(@wip or @skip-windows)'"]
else
["--tags 'not @wip'"]
end
#...
Page: 25
あきらめる
「どうしてもWindowsでこの機能を動かすのはム
リ〜〜」となったときは潔く諦める
(※ そのための Gem.win_platform? による分岐)
Page: 26
ここまでのまとめ
Pure Rubyで実装する
Gem.win_platform? で処理を分岐する
あきらめも時には大事
ローカルのWindowsでtestがpassするよう修正できまし
たか?
ではCIを有効にしていきます。
Page: 27
CIを有効にする
Windowsが使用できるCI service
GitHub Actions
AppVeyor
CircleCI
Page: 28
CIを有効にする
Windowsが使用できるCI service
GitHub Actions ← ☆
AppVeyor
CircleCI ← ☆
GitHub ActionsとCircleCIはcronによる定期実行をYAML
に書くことで設定できる
Page: 29
CIに関して
GitHub Actionsではどんなに頑張っても落ちるtestが
AppVeyorではすんなりpassしたりするので、
行き詰まったらCI serviceを変えてみるのも手です
(実体験 https://github.com/middleman/middleman/pull/
Page: 30
成果
https://github.com/middleman/middleman/pull/2297
Page: 31
最後に
実のところWindows専用アプリでもないにも関わ
らずこれほど力を入れてWindows対応がなされて
いるものって、なかなか見ないよ。本当に。頭が
下がります。ただ、ユーザー定義したライブラリ
とかで対応が残念な事があって、そのため結局総
体としては残念なことになってしまうって場合は
まま見受けられるので、その点残念。
https://shyouhei.tumblr.com/post/64498820681/10年
代のrubyコア用語集 より
Page: 32
まとめ
Pure Rubyで実装すればWindowsでも動く(可能性が
高い)
CIはcronで定期的に実行できると便利
Windows対応やっていきましょう
「総体としてのRuby」は我々で良くしていける