あなたのそのgem、Windowsでも動きますか?

subtitle

2019-12-14

subtitle

平成Ruby会議01 n#heiseirubykaigi

author

うなすけ

theme

unasuke-white

はじめに

ある日のことであった……

(私がこの発表をしようと思うようになったいきさつをお話しします。)

Middleman

Ruby製の静的サイトジェネレーター middlemanapp.com/

Middlemanの拡張gemを作ったのです

過程でMiddleman本体にPull Requestを出したのです

そしたらこんなコメントが……

This is very nice. Is there a way to check if the shelling out to git is safe on Windows?

(意訳 「とてもいいね! gitコマンドを呼び出してるけどWindowsでも大丈夫?」)

github.com/middleman/middleman/pull/2294#issuecomment-540301124

MiddlemanはWindows対応を謳っている

Windows users can install both using RubyInstaller. For windows RubyInstaller-Devkit is also required.

github.com/middleman/middleman/blob/master/README.md

でもCIはLinuxでしか動いていない!!!

travis-ci.org/middleman/middleman

⇒ そして私はMiddlemanにWindowsでのCIを追加しようと思ったのであった……

いきさつのまとめ

自己紹介

align=“right” relative_margin_right=“-10” relative_margin_top=“42”}

アンケート、その前に

これから皆さんにアンケートを4つ出します。

絶対挙手してほしい!というわけではないですが、自分かどうだったかを思い出してみてください。

アンケート

みなさん、どのOSを日常で使っていますか?

アンケート2

みなさんは以下OSがインストールされているマシンを持っていますか?

アンケート3

みなさんが最初に触ったパソコンのOSは何でしたか?

アンケート4

みなさんはRubyGemを作成し、公開していますか?

OSのシェア (画像はマイナビより)

Rubygems and Bundler metrics

ecosystem.rubytogether.org/

デスクトップOSのシェア

Windows >> macOS + others

⇒ Windowsで動けばユーザーが増える!!!

WindowsでRubyを動かす方法

rubyinstaller.org/ を使うとRubyをWindowsにインストールすることができます

あなたのgem、Windowsで動きましたか?

gemをWindowsで動くようにしよう!

shell commandを使わない

def cleanup!
  Dir.chdir ROOT
  `rm -rf #{TMP}` if File.exist? TMP
end

github.com/middleman/middleman/blob/ba2098ec/middleman-core/spec/support/given.rb

Windowsには rm コマンドが存在しないので実行できない

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で実装する

なるべくPure Rubyで実装する

実のところWindows専用アプリでもないにも関わらずこれほど力を入れてWindows対応がなされているものって、なかなか見ないよ。本当に。頭が下がります。

shyouhei.tumblr.com/post/64498820681/10年代のrubyコア用語集 より

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
  #...

あきらめる

「どうしてもWindowsでこの機能を動かすのはムリ〜〜」となったときは潔く諦める

(※ そのための Gem.win_platform? による分岐)

ここまでのまとめ

ローカルのWindowsでtestがpassするよう修正できましたか? ではCIを有効にしていきます。

CIを有効にする

Windowsが使用できるCI service

CIを有効にする

Windowsが使用できるCI service

GitHub ActionsとCircleCIはcronによる定期実行をYAMLに書くことで設定できる

CIに関して

GitHub Actionsではどんなに頑張っても落ちるtestがAppVeyorではすんなりpassしたりするので、 行き詰まったらCI serviceを変えてみるのも手です

(実体験 github.com/middleman/middleman/pull/2297)

成果

github.com/middleman/middleman/pull/2297

最後に

実のところWindows専用アプリでもないにも関わらずこれほど力を入れてWindows対応がなされているものって、なかなか見ないよ。本当に。頭が下がります。ただ、ユーザー定義したライブラリとかで対応が残念な事があって、そのため結局総体としては残念なことになってしまうって場合はまま見受けられるので、その点残念。

shyouhei.tumblr.com/post/64498820681/10年代のrubyコア用語集 より

まとめ