この記事について…
昨年SNS上で「Webエンジニアなら○△のOSを絶対に使いましょう!」のような投稿を見かけました。各々好きなOSはあるかと思いますが、昨今は「どんなOSでも大体何とかなるんじゃね?」というように感じています。(色々なOSを扱えると知見も深まりますし。)
自身はメインOSとして「Windows 11 Pro(+ WSL2上のUbuntu 24.04 LTS)」、サブOSとして「macOS」を使用していますが、今回は「Windows」で作るRuby on Rails開発環境について紹介しようと思います!
本記事ではVol.1として「OSセットアップ」に焦点を当てたいと思います。
更新履歴
- 2025/01/01 : 新規投稿
- 2025/01/08 : 開発ツールのセットアップ手順を改善、文章校正
想定する環境
- ホストOS : Windows 11 Pro 24H2
- Windowsの標準的なセットアップ手順については割愛します
- 仮想環境 : Windows Subsystem for Linux 2(以下WSL2)
- UEFI(BIOS)にて仮想化支援技術を有効化する必要がある場合もあります
手順についてはご自身のPC型番等でお調べください
- UEFI(BIOS)にて仮想化支援技術を有効化する必要がある場合もあります
- ゲストOS : Ubuntu 24.04.1 LTS(WSL2上で動作)
- コードエディタ : Visual Studio Code
- Vol.2では、Visual Studio Codeの拡張機能をご紹介できればと思っています(執筆時期未定…。)
- データベース : PostgreSQL / Redis
- MySQLやその他のデータベースを使用することも多いですね
WSL2はWindows 11 Homeでも使用可能である為、Pro版ではなくHome版でも本記事は有効かと思います。が、手元にHome版がない為未検証です。ご了承ください。
WSLを使用してUbuntuをインストール
今回、「Windows」上に仮想でUbuntu OSをインストールします。
これを実現するのはWSLです。昨今、WSLのインストールはワンライナー(1行でサクッと作ったコマンド)でできてしまいます。
管理者権限でPowerShellを開いて、下記を実行してください。
wsl --install
この時にエラーが発生するような場合は、UEFI(BIOS)の仮想化支援技術が有効化されていない等、事前準備に漏れが予想されます。エラー内容を確認して足りない設定を行ってから再度実行しましょう。
処理が正常に終了したら、変更を有効にする為一旦Windowsを再起動します。
shutdown /r /t 0
以前は上記の後に wsl --set-default-version 2
と実行してWSL2を使用するように既定のバージョン変更を行っていたのですが、これも昨今はデフォルトでWSL2が既定として選択されていると思います。
次にUbuntuのインストール!…と言いたいところですが、実は既にこちらもインストールされています。(というか、上記再起動後に勝手にUbuntuが起動してくる気すらします。)
WSLでは標準でUbuntu OSを採用しているのです。もちろん、別のディストリビューションを任意に選択することも可能です。
Windowsのすべてのアプリを参照すると、「Ubuntu」というアプリが既に存在するのではないでしょうか?これを起動すると、次のUbuntuの設定に進むことができます。
Ubuntuの初期設定
「Ubuntu」アプリを起動すると、「username」と「password」の入力を求められます。
今後、これらのユーザ情報を多用しますので、覚えておいてください。
「username」についてはWindowsとは別の名称も指定できます。が、同じ名称にしておいた方が開発上分かりやすいかもしれません。
次に、aptパッケージを更新する際に日本国内のリポジトリを参照するよう設定変更します。これは必ずしも対応しなくとも大丈夫ですが、海外のリポジトリを参照する場合は少なからず遅延が発生するので、対応しておいて損はないかと思います。
こちらは、sed
コマンドを使用してワンライナーで対応しましょう。
sudo sed -i.bak -e "s/http:\/\/archive\.ubuntu\.com/http:\/\/jp\.archive\.ubuntu\.com/g" /etc/apt/sources.list.d/ubuntu.sources
Ubuntu 24.04以降、aptパッケージの参照先リポジトリ変更方法が以前と異なります。注意しましょう。
次に、タイムゾーンとロケールを日本仕様に変更します。(タイムゾーンは最初から変更されているかも。)
# タイムゾーンの設定
sudo timedatectl set-timezone Asia/Tokyo
# 日本語化
sudo apt update
sudo apt install -y language-pack-ja
sudo update-locale LANG=ja_JP.UTF-8
上記実行後、exit
コマンドを実行して一旦Ubuntuを閉じましょう。
改めて「Ubuntu」アプリを起動して、locale
コマンドを実行してロケールが正しく変更されたか確認してください。
date
コマンドも合わせて実行して、タイムゾーンも確認しても良いですね!
sudo apt install -y manpages-ja manpages-ja-dev
コマンドでmanコマンドの日本語マニュアルをインストールするのも良いですね。但し、日本語マニュアルは英語マニュアルに比べて情報更新されていないケースもある為気を付けましょう。
続いて、systemdへの対応状況を確認します。sudo vim /etc/wsl.conf
コマンドを実行して、/etc/wsl.conf
の中身を確認すると…
[boot]
systemd=true
最初から上記のように設定されていると思います。systemd=true
なので、systemdへの対応状況もOKです。
以前はWSL2ではsystemdが使用できないという制限がありましたが、昨今では通常開発の範囲では全く問題なく使用することが可能です。
次にこれは好みですが、私はPATH
環境変数にWindowsのPATH
を含めないよう下記の設定を追加しています。
sudo vim /etc/wsl.conf
コマンドを実行して追記してください。
[boot]
systemd=true
# 以下を追記
[interop]
appendWindowsPath=false
このように設定すると、Ubuntu上のPATH
環境変数にWindowsのPATH
が含まれなくなります。Tabキー押下時の予測変換が遅い場合、本設定を行うと改善します。が、当たり前ですがWindowsのPATH
が含まれなくなりますのでnotepad.exe
等とコマンド実行してもエラーとなるようになります。(/mnt/c/Windows/notepad.exe
とフルパス指定することは可能。)
最後に、一旦aptパッケージやLinuxカーネル等を全て最新に更新しておきましょう。
私は、開発環境の場合は下記のワンライナーでサクッと更新することが多いです。
sudo apt update && sudo apt upgrade -y && sudo apt full-upgrade -y && sudo apt autoremove -y && sudo apt autoclean -y
中には重要な脆弱性対応が配信される場合もあります。開発環境であっても定期的に更新作業を行いましょう。別途、自動更新設定を行っても良いですね。
以上でUbuntuの初期設定は完了です。次に、各種開発ツールをセットアップしていきましょう!
Ubuntu 24.04 LTSではapt
コマンドに-U
オプションを付与すると、自動的にsudo apt update
を実行してくれるようになりました。この為、上記のワンライナーは
sudo apt upgrade -yU && sudo apt full-upgrade -y && sudo apt autoremove -y && sudo apt autoclean -y
でもOKです。ちょっと短くなって良きですね。
未だUbuntu 22.04 LTSを操作する機会もあるかと思いますが、そちらではエラーとなることご注意ください。
Ubuntuに開発ツールをセットアップ
本項では、Ubuntu上にRuby on Rails開発で使用する(と思われる)開発ツールを順次セットアップしていきます。
この辺りから技術者の好みも入ってくる為、「自分好みの開発ツール」を見つけられるよう日々色々なツールを使ってみましょう。
Git : 分散型バージョン管理システム
言わずと知れたGitですが、最初からインストールされていると思います。
万が一インストールされていない場合、又は最新のgit
コマンドを使用したいという場合は、次のコマンドを実行してください。
sudo add-apt-repository -y ppa:git-core/ppa
sudo apt update
sudo apt install -y git
Vim : 高機能なテキストエディタ
テキストエディタはお好みですが、私はVimを使用しています。こちらも確か最初からインストールされていると思いますが、万が一インストールされていない場合はsudo apt install -y vim
コマンドを実行してください。
.vimrc
ファイルを使用することでVimを自分好みにカスタマイズすることが可能です。また、Vimには色々なPluginも存在します。
デフォルトでも十分使用可能ですが、慣れてきたらカスタマイズも楽しんでみましょう。
Z Shell(Zsh) : コマンドシェル
上司の影響で私はZshを使用しています。また、Preztoというフレームワークを導入してPlugin管理やテーマ管理等を行っています。
デフォルトのBashでも十分かと思いますので、この辺りもお好みでどうぞ。(尚、シェルはZsh使いですがシェルスクリプトを書くときはBash互換を重視しています。)
sudo apt install -y zsh
# コマンドシェルをBashからZshに変更
chsh -s "$(which zsh)"
通常、chsh -s
コマンドでコマンドシェルを変更する場合はパスワードを求められます。
もし処理自動化の最中にパスワードを求められるのが煩わしいという場合は下記のような方法でパスワード入力をスキップすることが可能です。
sudo sed -i.bak -e "/auth.*required.*pam_shells.so/s/required/sufficient/g" /etc/pam.d/chsh
chsh -s "$(which zsh)"
sudo sed -i.bak -e "/auth.*sufficient.*pam_shells.so/s/sufficient/required/g" /etc/pam.d/chsh
/etc/pam.d/chsh
ファイルを一時的に書き換えしているのですが、必ず上記のように元の記述に戻すよう注意してください。
Tig : 軽量なGitクライアント
Gitのコミットログをコマンドシェル上でササっと確認する際に便利、それがTigです。
コードエディタに備え付けのGitクライアントでもいいのですが、ササっとコミットログを見たいとき等に便利なのです。
sudo apt install -y tig
rustup : Rustの公式バージョン管理ツール
軽快動作するCUIアプリ等、Rust製のアプリを採用する機会が増えてきました。(後述するmiseもRust製)
また、RubyにYJITを含める場合にもRustが必要となります。
Rust自体はaptパッケージでインストールしてもいい(し、後の手順でインストールしている)のですが、今回は公式のバージョン管理ツールであるrustupを導入します。
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
上記実行後インストールオプションを指定するよう表示されますが、デフォルトの1) Proceed with standard installation (default - just press enter)
を指定して支障ないかと思います。自動的に.bashrc
ファイル等も更新してくれます。
上記実行後、exit
コマンドを実行して一旦Ubuntuを閉じましょう。
改めて「Ubuntu」アプリを起動して、rustc --version
コマンドを実行してRustも合わせてインストールされたか確認してください。
rustupインストール時に非対話型で処理したい かつ PATH
環境変数への処理を勝手に.bashrc
ファイル等に追記してほしくない場合は下記のようにも実行できます。
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --no-modify-path
... | sh -s -- -y --no-modify-path
の--
の部分が肝です。省略できません。
mise : 高機能な開発環境セットアップツール
今までrbenvに始まりnodenv、anyenv、asdfと渡り歩いてきましたが、最近かなり話題のmiseに今ハマっています。本当に何でもセットアップできてしまうので、miseに依存しすぎないように注意しないと…と思っている今日この頃です。
Ruby on Rails開発において、miseを使用してRubyとNode.jsをバージョン管理しています。また、開発環境固有の環境変数をmiseで自動登録して開発時の手間を減らしています。
curl https://mise.run | sh
# お使いのコマンドシェルに合わせて下記を実行
echo 'eval "$(~/.local/bin/mise activate bash)"' >>~/.bashrc
echo 'eval "$(~/.local/bin/mise activate zsh)"' >>~/.zshrc
上記実行後、exit
コマンドを実行して一旦Ubuntuを閉じましょう。(PATH
環境変数に手を加えそうな雰囲気の場合は一旦閉じるのが有効ですね。)
改めて「Ubuntu」アプリを起動して、mise doctor
コマンドを実行してmiseが動作するか確認してください。
次に、miseを使用してRubyとNode.jsをインストールします。取り急ぎ、latestなものをインストールしておきます。
# Rubyはruby-buildを使用してインストールされる為、事前に[依存関係](https://github.com/rbenv/ruby-build/wiki#suggested-build-environment)を確認して処理する
sudo apt install -y autoconf patch build-essential rustc libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libgmp-dev libncurses5-dev libffi-dev libgdbm6 libgdbm-dev libdb-dev uuid-dev
mise use ruby@latest
# Node.jsは特に依存関係なし
mise use node@latest
その他、Ruby on Rails開発には関係ないですが、私はmiseでPythonもインストールしています。簡単なスクリプトを書くときに便利ですよね。(生成AIも活き活きとコード生成してくれますし…)
Pythonもpython-buildを使用してインストールされる為、事前に依存関係を確認してくださいね。
Yarn : Node.jsのパッケージマネージャ
Node.jsのパッケージマネージャとしてYarnをインストールします。やることはNode.jsのCorepackを有効化するだけ…ですが、CorepackはNode.jsから削除されることが決定しているので今後インストール手順が変更となる可能性大です。
corepack enable
尚、asdfの時に必要だったasdf reshim nodejs
のようなコマンドはmiseでは不要です。(何度実行し忘れてなんだか動かない状況になったか…)
Google Chrome : Googleのウェブブラウザ
RSpecでシステムテストを実行する際に使用します。基本Headlessモードでしか使用しませんが、日本語フォントを別途ダウンロードするとWSL2上のGoogle ChromeをWindows上で使用したりもできます。
# debパッケージをダウンロード
curl -LsS "https://dl.google.com/linux/direct/google-chrome-stable_current_$(dpkg --print-architecture).deb" -o "./google-chrome-stable_current_$(dpkg --print-architecture).deb"
# `apt`コマンドでインストール
sudo apt install -y "./google-chrome-stable_current_$(dpkg --print-architecture).deb"
# 使用済みのdebパッケージ削除
rm "./google-chrome-stable_current_$(dpkg --print-architecture).deb"
上記が一番手っ取り早いと思っているのですがどうなんでしょうか…。
PostgreSQL : 高機能なオープンソースのRDBMS
本記事ではデータベースにPostgreSQLを使用します。要件に合わせてMySQLやその他データベースも使用することがあります。
今回、PostgreSQLと後述するRedisはDockerコンテナ上で動作させます。最初は普通にインストールしていたのですが、macOS上に普通にインストールした場合と文字コード関連の設定がどうしても共通化できず、「Dockerコンテナで動かせば環境依存しなくていいじゃん」との結論に至りました。(PostgreSQLの勉強不足感が否めない…。)
ということで、下記ではDockerコンテナ上のPostgreSQLに接続する為のClientツールと開発者向けライブラリのみインストールしています。
sudo apt install -y curl ca-certificates
sudo install -d /usr/share/postgresql-common/pgdg
sudo curl -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc --fail https://www.postgresql.org/media/keys/ACCC4CF8.asc
sudo sh -c 'echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
sudo apt update
sudo apt install -y postgresql-client libpq-dev
ちょこちょこインストール方法が更新されている為、定期的にインストール方法を確認すると良いです。
SQLite3 : 軽量で小規模なオープンソースのRDBMS
Ruby on Rails 8から本番環境でもどんどん利用してくれとDHHも言っているSQLite3です。小規模なWebシステムならPostgreSQLもRedisもいらない時代がやってきた感が凄い…。
下記では開発者向けライブラリも同時にインストールしています。
sudo apt install -y sqlite3 libsqlite3-dev
Redis : メモリ上で動作するインメモリデータベース
本記事ではインメモリデータベースにRedisを使用します。
RedisもDockerコンテナ上で動作させる為、Clientツールのみインストールします。
sudo apt install -y lsb-release curl gpg
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
sudo chmod 644 /usr/share/keyrings/redis-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
sudo apt update
sudo apt install -y redis-tools
余談ですが、macOSで開発ツールをセットアップする場合は大体Homebrewで何とかなってしまいます。
HomebrewにはLinux版も存在する為、UbuntuでもmacOS同様Homebrewでほぼ完結させることができそうですが、なんとなく使い慣れたaptコマンドでセットアップしてしまいますね…。
Graphviz : DOT言語からグラフを描画する為のオープンソースツール
Rails ERDを使用するとRailsプロジェクトのモデル情報を基にしてER図を自動生成してくれる便利なGemなのですが、Graphvizが依存関係となっています。
sudo apt install -y graphviz
GitHub CLI : コマンドラインからGitHubを操作できるGitHub公式CLIツール
ソースコードをGitGubリポジトリで管理することが圧倒的に多いかと思いますが、CLIでGitHub Actionsを起動したり、GitHub REST APIを利用したりする際に大変便利なのがGitHub CLIです。
(type -p wget >/dev/null || (sudo apt update && sudo apt-get install wget -y)) \
&& sudo mkdir -p -m 755 /etc/apt/keyrings \
&& out=$(mktemp) && wget -nv -O$out https://cli.github.com/packages/githubcli-archive-keyring.gpg \
&& cat $out | sudo tee /etc/apt/keyrings/githubcli-archive-keyring.gpg > /dev/null \
&& sudo chmod go+r /etc/apt/keyrings/githubcli-archive-keyring.gpg \
&& echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null \
&& sudo apt update \
&& sudo apt install gh -y
FlakyなTestを修正する際にGitHub Actionsを手動実行しまくったことがありますが、GitHub CLI経由で操作すると大変楽でした。管理するRailsプロジェクトが多岐に渡ると、gh browse
でGitHubリポジトリのページを既定のブラウザで開くことができるのもとっても便利です。
Lazygit : シンプルなターミナルベースのGitクライアント
Lazygitはシンプルなキーボード操作でGitリポジトリを色々できるターミナルベースのGitクライアントです。
追々Tigから完全移行しようと画策中。
LAZYGIT_VERSION=$(curl -s "https://api.github.com/repos/jesseduffield/lazygit/releases/latest" | \grep -Po '"tag_name": *"v\K[^"]*')
curl -Lo lazygit.tar.gz "https://github.com/jesseduffield/lazygit/releases/download/v${LAZYGIT_VERSION}/lazygit_${LAZYGIT_VERSION}_Linux_x86_64.tar.gz"
tar xf lazygit.tar.gz lazygit
sudo install lazygit -D -t /usr/local/bin/
rm lazygit.tar.gz lazygit
Lazydocker : シンプルなターミナルベースのDocker管理ツール
Lazygit同様、シンプルなキーボード操作でDockerやDocker Composeを色々できるターミナルベースの管理ツールです。Lazygitと操作感が似ている為、使いこなせるように学習中。
curl https://raw.githubusercontent.com/jesseduffield/lazydocker/master/scripts/install_update_linux.sh | bash
Docker : コンテナ技術を利用して仮想環境を簡単に構築・配布・実行する為のプラットフォーム
本記事ではPostgreSQLとRedisはDockerコンテナ上で動作させますので、Dockerもセットアップします。
Dev Containerで開発環境をまるごとコンテナ構築するプロジェクトを使用している場合もDockerのお世話になりますね。
自身の場合はまるごとコンテナ構築~とまではしなくて、周辺ツールのみコンテナ動作させる程度に留めているケースが圧倒的に多いです。規模の大きなプロジェクトでは開発環境まるごとコンテナ構築も必須なのだろうと思います。(この辺りもう少し詰めないと…。)
sudo apt install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo usermod -aG docker $USER
上記実行後、exit
コマンドを実行して一旦Ubuntuを閉じましょう。
改めて「Ubuntu」アプリを起動して、docker --version
コマンドとdocker compose version
コマンドを実行してDockerとDocker Composeが動作するか確認してください。
次に、PostgreSQLとRedisをDockerコンテナ上で動作させます。Docker Composeを使用して動作させる例です。
自身の場合はdotfilesにcompose.yaml
も含めている為、「dotfiles」という名前でDocker Composeを管理しています。
name: dotfiles
services:
postgres:
build:
context: .
dockerfile: postgres/Dockerfile
restart: always
ports:
- "${IP:-127.0.0.1}:5432:5432"
volumes:
- postgres-data:/var/lib/postgresql/data
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
LC_ALL: ja_JP.UTF-8
redis:
image: redis
restart: always
ports:
- "${IP:-127.0.0.1}:6379:6379"
volumes:
- redis-data:/data
volumes:
postgres-data:
redis-data:
FROM postgres
RUN localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8
PostgreSQLについては、LOCALEをja_JP.UTF-8にしたいが為に色々やっています。こちらのブログが当時大変参考になりました。
上記準備できたらcompose.yaml
の存在するディレクトリにてdocker compose up -d
を実行すれば、コンテナが起動します。restart: always
としてcompose.yaml
に記述している為、WSL2再起動時にも自動で起動してくれます。
これでRuby on Railsの開発を開始可能!
ここまでセットアップが完了すれば、Ruby on Railsの開発を開始可能なはずです!
もし既存のプロジェクトが存在すれば、git clone
又はgh repo clone
でリポジトリをcloneして、試しにRails Serverを起動してみましょう。
もしプロジェクトにmise.toml
が含まれるのなら、mise install
を実行すれば自動で必要なものをmiseがインストールしてくれるはずです。
後はconfig/database.yml
の内容に注意しながらbin/setup
でも実行すれば、(プロジェクトのメンテナンス具合にも因りますが)Rails Serverを起動することができるはずです。
但し、現時点ではターミナル上でVimを使用してソースコードの修正を行うこととなります。それでももちろんいいのですが、次回Vol.2ではVisual Studio CodeでWSL2に接続して開発する方法と、Ruby on Railsの開発に有用な拡張機能の紹介をしたいと思います!(※但し執筆時期未定…。)
是非皆さんの開発環境構築の参考となれば幸いです。