こんにちは、大阪万博に行ってきて大量のミャクミャクグッズを買ってしまい、部屋のどこをみてもミャクミャクに囲まれて暮らしている柴田です。
今日は最近力を入れている Ruby を Windows で開発するための環境についてご紹介します。
Windows 向け Ruby の歴史
Ruby を使うためには自分で Ruby インタプリタをコンパイルして作成するか、誰かが作成した Ruby インタプリタを再利用する必要があります。
近年では Docker を利用することで Ruby のバイナリにだけではなく Debian や Alpine などの Linux ディストリビューションの選択も含めてポータブルに利用することが可能ですが、 性能を最大限に引き出すためには OS ネイティブな環境を用意したいことが多いと思います。
Linux なら deb や rpm パッケージなどのディストリビュータによるバイナリ提供、もしくは ruby-build などを用いたソースコードからのバイナリビルド、macOS なら MacPorts によるバイナリ提供や Linux 同様に各自でビルドしたバイナリを使うことが多いと思います。一方で Windows の場合はどうすればいいのでしょうか。その方法を紹介する前に Windows と Ruby の歴史をおさらいしたいと思います。
Cygwin版 Ruby
Windows には Cygwin と呼ばれる Windows上にPOSIX準拠のAPI層を構築する互換レイヤーを提供するソフトウェアがあります。Ruby も 2000年代初頭から Cygwin の公式パッケージとして提供され、インストール手順でCygwinのsetup.exeを実行後、パッケージ選択画面でrubyを選択することで利用可能となります。
Cygwin 版 Ruby はあくまでも Cygwin という互換プラットフォームの中で動く Ruby のため、Ruby を実行するためには cygwin1.dll
を必要とし、Cygwin の bash などを経由しないで Ruby を使うことは困難です。また WSL の登場により、Windows 上で Linux を使うために Cygwin を積極的に選択する理由がなく、今は利用者が少なくなっているという時間の経過の問題もあります。
なお、余談となりますがつい最近 Cygwin で Ruby がビルドできなくなった、というバグ報告を受けて Cygwin でビルドをチェックする GitHub Actions ワークフロー を私が追加しました。利用者が減っている、とはいえ使ってる人はいるのですから省力でもビルドくらいはチェックする、という方針です。
RubyInstaller と ActiveScriptRuby
続いて 2007年に登場したのがRubyInstallerです。RubyInstaller は Cygwin などを用いずに GNU の toolchain を提供する MinGW を用いてビルドされたネイティブWindowsバイナリを提供し、Cygwin環境に依存しないRuby実行環境を実現しました。
また同時期に Ruby コミッタである arton さんが開発した ActiveScriptRuby が登場しました。ActiveScriptRuby は MSVC によってビルドされたいわゆる Windows にネイティブ対応した Ruby であり、 COMインターフェイスを用いて VBScript などと相互利用が可能という特徴があります。
しかし、いずれの Ruby パッケージも時間の経過とともに2015-16年以降(おおよそRuby 2.3-2.4以降)はメンテナンスが停滞してしまいました。
RubyInstaller2
そのような中、2010年代後半に MSYS2(Minimal SYStem 2)と呼ばれる Cygwin と MinGW の技術を用いた新たな POSIX 互換レイヤーを提供するソフトウェアをベースに Ruby をビルドした RubyInstaller2 が登場します。RubyInstaller2 は Ruby を動かす分には MSYS2 の dll などは不要とし単独で動作します。
RubyInstaller2 には ridk と呼ばれる Ruby のプログラミング環境をサポートするツールが付属しています。ridk を用いることで C 拡張を提供する gem をインストールするために必要な GCCツールチェーンを MSYS2 の pacman を用いてインストールしたり、複数Rubyバージョンの切り替えが可能となります。
また、2025年リリースのv3.4.1-2でWindows on ARMを正式サポートし、現在 Windows で Ruby を使うなら RubyInstaller2 を使うのが一番簡単な方法となっています。例えば、私も愛用している scoop
で Ruby をインストールすると RubyInstaller2 のパッケージが使われます。
PS C:\Users\hsbt> scoop install ruby Installing 'ruby' (3.4.4-2) [64bit] from 'main' bucket Loading rubyinstaller-3.4.4-2-x64.7z from cache Checking hash of rubyinstaller-3.4.4-2-x64.7z ... ok. Extracting rubyinstaller-3.4.4-2-x64.7z ... done. Linking ~\scoop\apps\ruby\current => ~\scoop\apps\ruby\3.4.4-2 Adding ~\scoop\apps\ruby\current\bin to your path. Adding ~\scoop\apps\ruby\current\gems\bin to your path. Persisting gems Running post_install script...Successfully installed rake-13.2.1 1 gem installed done. 'ruby' (3.4.4-2) was installed successfully! Notes ----- Install MSYS2 via 'scoop install msys2' and then run 'ridk install' to install the toolchain! PS C:\Users\hsbt> ruby -v ruby 3.4.4 (2025-05-14 revision a38531fd3f) +PRISM [x64-mingw-ucrt]
scoop
でインストールされた Ruby が PATH に追加され、ruby -v
の出力から Ruby インタプリタは mingw でビルドされていることがわかります。
Windows で Ruby を開発する
さて前置きが長くなってしまいましたが、現在 Windows で Ruby をビルドするための手段は以下のように多数存在します。
- Cygwin を使う
- MinGW を使う
- MSYS2 を使う、基本的には MinGW を使う場合の類似だが MSYS2 の互換レイヤを通しているのが差異
- MSVC を使う
今回は上記のうち MinGW と MSVC について紹介します。
共通の前準備
MinGW、MSVC のいずれの場合においても必要なソフトウェアは Ruby と Git です。Ruby をビルドするためには Ruby が必要、というのは面白いところですが必要なので scoop install ruby git
などと実行してインストールしてください。
MinGW を使って Ruby をビルドする
MinGW を使って Ruby をビルドする場合は ridk
コマンドを用いて必要な GCC などのビルドツールをインストールします。
ridk install
今回は省略しますがデフォルトで選択されているオプションをそのまま return キーで選択をすると各種ツールがインストールされます。続いて、Ruby の開発バージョンで必要となる依存ライブラリをインストールします。
ridk enable ucrt64 pacman -S mingw-w64-ucrt-x86_64-openssl mingw-w64-ucrt-x86_64-libyaml mingw-w64-ucrt-x86_64-libffi
パッケージの mingw-w64-ucrt-x86_64
の prefix は今回のビルドアーキテクチャの ucrt
の 64bit のバイナリパッケージを意味します。続いてソースコードを clone してからビルドします。今回はソースコードは src
ディレクトリ、ビルドバイナリは build
に作成します。
git clone https://github.com/ruby/ruby src mkdir build cd build sh ../src/autogen.sh sh ../src/configure -C --disable-install-doc make
いずれの手順も公式リポジトリの下にある私がメンテナンスしているドキュメントから持ってきています。ビルド完了後に ruby.exe を実行してみます。
PS V:\build> ./ruby -v ruby 3.5.0dev (2025-05-22T04:08:39Z master ec41b1e823) +PRISM [x64-mingw-ucrt]
確かに mingw で ucrt 64bit なアーキテクチャの Ruby インタプリタができました。なお、私のマシンでは make test-spec
は完走するものの make test-all
は RubyGems のテストで失敗してしまいます。全部テストが通るように頑張ろうと思います。
MSVC を使って Ruby をビルドする
続いて MSVC、ネイティブな Windows のランタイムを使ったビルド手順を紹介します。必要なコンパイラなどは MSYS2 などと異なり、Miscrosoft の Visual Studio のインストーラを用います。必要なコンポーネントは Visual C++ と Windows SDK です。最近、これらのバージョンの食い合わせが問題となりビルドができない状態が続いています。そのため、インストールの際には以下のバージョンを個別に指定するよう気をつけてください。
- Visual Studio 2017, 2019, 2022、2022 の場合は 17.14.0 以降、17.13.x は不具合がありビルドができない、参考: https://bugs.ruby-lang.org/issues/21167
- Windows 10/11 SDK 10.0.22621 、最新バージョンの 10.0.26100 は不具合のためビルドができない、参考: https://bugs.ruby-lang.org/issues/21255
MinGW 版と同様に OpenSSL などの依存ライブラリのインストールを行います。MSVC バージョンでは Microsoft が提供している C 向けの依存ライブラリマネージャである vcpkg
を用います。
git clone https://github.com/ruby/ruby src cd src vcpkg --triplet x64-windows install
上記は vcpkg の manifest モードと呼ばれる、Gemfile のように必要なライブラリとバージョンを定義したファイルから openssl などをインストールするコマンドです。興味のある方は vcpkg.jsonをご覧ください。お使いの Visual Studio に付属している vcpkg のバージョンによっては マニフェストモードがサポートされていない場合があります。その場合は scoop install vcpkg
などを利用して個別に新しいバージョンをインストールしてください。
cd .. mkdir build cd build ..\win32\configure.bat --with-opt-dir=V:/src/vcpkg_installed/x64-windows nmake
続いて configure を実行して VC の nmake を使ってビルドしますが、MSVC バージョンでは専用のバッチスクリプトとして win32/configure.bat
を実行します。また vcpkg でインストールした OpenSSL などを参照するために --with-opt-dir
に src
ディレクトリ配下の vcpkg_installed/x64-windows
を指定します。この指定を忘れると nmake 実行時に openssl, psych, zlib などのビルドに失敗してしまいます。
PS V:\... > ./ruby -v ruby 3.5.0dev (2025-05-19T17:34:29Z master a7ef9a44a6) +PRISM [x64-mswin64_140]
上記のように mswin64
と表示されていることから MSVC でビルドした Ruby が実行されていることがわかります。この Ruby インタプリタを用いてテストを実行する場合は以下の手順で実行します。
nmake prepare-vcpkg nmake check
prepare-vcpkg
タスクは src
ディレクトリなどに存在する openssl の dll を build ディレクトリに symlink をはり、build ディレクトリの ruby.exe
実行時に参照できるようにします。Windows では、これらの dll をパスが通っている場所に配置する必要があるため、環境変数 PATH が通っている箇所にコピーしても問題ありませんが、私は他のアプリケーションへの影響を避けるために src ディレクトリに存在する dll を参照するようにしています。
まとめ
今回は Windows で使える Ruby とその歴史、現在開発する際の2つの手段についてご紹介しました。手順については私がメンテナンスをしているオリジナルバージョンが Ruby のリポジトリにあるので興味がある方はこちらも参考にしてください。
私は Ruby を使う人がもっと増えればいいなあと思いフルタイムコミッタとして毎日 CI を直したりしていますが、世界の PC やサーバーの7割は Windows という事実に対して現状の Ruby の Windows サポートはまだまだ...という実感があります。例えば、上記の nmake check
も昨年までは動きませんでした。
なぜならテストコードの中に Windows には存在しない Unix コマンドを実行してその結果を用いるものが多数あったからです。私がそれらのコードを、Windows でも代替可能な組み込みコマンドに書き換えることでなんとか nmake check
までは動くようになりましたが、bundler や bundled gems のテストにはまだまだ同様のものが残っています。
また、MSYS2 の最近のアグレッシブな GCC アップデートにより、MinGW バージョンで C 拡張の gem がビルドできなくなるという問題もありました。
個人的には上記のようなローリングアップデートなプラットフォームを安定バージョンなどを提供するソフトウェアでサポートし続けるのはブランチメンテナの負担が大きいため、MinGW ではなく MSVC バージョンを使った方が良いのではないか、と考えています。しかし、サードパーティーの C 拡張をどうビルドするのか、dll はどこに置くのかという問題や、そもそもインストーラが存在しないので使う人がいない、という問題が残っています。
WSL を使えば良い、というのも一つの考えですが、WSL も難しい、というユーザーにリーチするのが Ruby の未来にとっては重要と考えています。もし、読者の方で テストを完走させる、とかインストーラを作る、とか zlib を ruby で書いて dll 依存を消した!というような、何か手伝えることがある方はぜひお声がけください。