Technically Impossible

Lets look at the weak link in your statement. Anything "Technically Impossible" basically means we haven't figured out how yet.

Ubuntu 20.04 LTS+WSL2でRailsを起動するまで-Yarnはnpmから導入する


DockerコンテナからWSLへLinuxファイル・システムをインポートできることを知ってからというもの、やってみたいことのアイデアが色々と浮かんできた。そのうちの一つが、Docker Hubで提供されているRailsイメージをWSLへ移行すれば、お手軽にRails環境を構築できるのではないか、という考えだった。

結論から言うと、この手は使えない。理由は後述するとして、結局のところ、WSL上で一から環境構築するのが手っ取り早かった。
この投稿では、Ubuntu 20.04LTS + WSL2上にRails環境を構築する手順を紹介する。

なお、この投稿で使用しているUbuntuの初期状態は、次の投稿の「aptミラー・サイトの設定、aptパッケージの更新」に記載している作業まで完了していることを前提としている。
impsbl.hatenablog.jp

前提、要件

ヴァージョン

この投稿で紹介する手順では、各種パッケージの導入時に特定バージョンを指定するようなことはしない。2021年4月28日現在、この投稿で紹介する手順に従うことで導入されるヴァージョンは、次のようになる。

wsluser@paulownia:~$ ruby -v
ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-linux-gnu]
wsluser@paulownia:~$ rails -v
Rails 6.1.3.1
wsluser@paulownia:~$ sqlite3 --version
3.31.1 2020-01-27 19:55:54 3bfa9cc97da10598521b342961df8f5f68c7388fa117345eeb516eaa837balt1
wsluser@paulownia:~$ node --version
v10.19.0
wsluser@paulownia:~$ yarn --version
1.22.10

パッケージ

Rails関連

guides.rubyonrails.org
公式ガイダンスに従い、次のパッケージを導入する。

パッケージ名
Ruby ruby-full
SQLite3 sqlite3
Node.js nodejs
Yarn 後述

Yarnについてはインストール方法が異なるので、理由を含めて後述する。

依存関係

パッケージ名
build-essential ビルド環境
libsqlite3-dev SQLite3開発用ライブラリ
npm パッケージ・マネジャー
Yarnの導入に用いる。

導入手順

パッケージの導入

導入手順は次の過程を経る。

  1. パッケージのインストール
  2. gemの更新、インストール
  3. Railsプロジェクトの作成
  4. サーバーの起動確認

まず一連のパッケージをインストールする。

sudo apt install ruby-full sqlite3 nodejs build-essential libsqlite3-dev npm
Yarnの導入

ここで注意したいのがYarnの導入についてだ。

  • npmはNode.jsのパッケージ・マネジャー
  • Yarnはnpmから導入する。

Ubuntu packagesにて、nodejsの導入に際し、npmの導入がsuggestされている。「suggest」とは、動作上必須ではないのだが、機能向上のために導入したほうが良いものとされている。
Ubuntu – Details of package nodejs in focal

実際のところ、npmはNode.jsでのパッケージ・マネージャとして機能する。そして、Yarunはnpmを通じて導入することが、Yarn公式サイトにて推奨されている。

It is recommended to install Yarn through the npm package manager, which comes bundled with Node.js when you install it on your system.

Installation | Yarn

そこでYarnの導入では、次のコマンドを実行する。
導入後、Yarnパッケージを更新している。

sudo npm install --global yarn

異なるパッケージ・マネジャーを混在運用することは、相互の環境汚染リスクから、私自身は好まないのだが、次の理由から、ここでは混在を躊躇していない。

  • 「作って壊す:使い捨て」というWSL環境の特性
  • Rails関連以外に導入するパッケージはない
Gemの導入

RubyGemを更新し、Gem環境を確認する。環境確認の出力は、投稿末尾に掲載している。
追加の手間なく、Railsをインストールするだけで問題なさそうだ。

sudo gem update --system
gem environment
gem list
sudo gem install rails

動作確認

Railsの新規プロジェクトを作成し、ブラウザからの接続を確認する。
任意のプロジェクトを作成する。ここでは”testflight”とした。
一連のプロジェクト関連ファイルが出力されたら、プロジェクト・フォルダへ移動してサーバーを起動する。

rails new testflight
cd testflight
rails server

Windowsにてブラウザを立ち上げ、"localhost:3000"に接続する。表示されるのが、この投稿の冒頭に提示した画面だ。
なおブラウザのアクセス時、コンソールにも出力が現れるが、エラーは表示されていない。万事、良好そうだ。

Railsの教科書』の導入

達人出版会が『Railsの教科書』をGitHubで公開している。これはPDFやePubではなく、Railsアプリケーションだ。Rails環境の構築が完了したら、Hello world代わりに、このアプリケーションを導入してみてはどうだろう。
次の投稿で、その導入手順を紹介している。
impsbl.hatenablog.jp

余談-Docker Hubの公式Railsイメージ

impsbl.hatenablog.jp
先日、Dockerコンテナをエクスポートして、WSLへインポートする方法を紹介した。この投稿に倣い、Docker Hubで公開されているRailsイメージをインポートすればお手軽に環境構築できるのではないか、というのが冒頭に触れた話題だった。この手が使えない理由というのは、イメージそのものは更新されているのに、内容は2016年末のままだからだ。
このイメージの存在価値は、Node.jsやDB関連パッケージがまとめてインストールされていることだ、と言及されている。

For most usages of this image, it was already not bringing in rails from this image, but actually from your project's Gemfile, so the only "value" being added here was the pre-installing of nodejs, mysql-client, postgresql-client, and sqlite3 for various uses of the rails framework.

Docker

だからと言って、作業の簡素化に貢献できるパッケージではなく、結局のところ、以上の手順で一から仕上げたイメージを、WSLからエクスポートして再利用する方が手軽で、手っ取り早いのだ。

Gem環境

gem environment

🔎出力結果

wsluser@paulownia:~$ gem environment
RubyGems Environment:
  - RUBYGEMS VERSION: 3.1.2
  - RUBY VERSION: 2.7.0 (2019-12-25 patchlevel 0) [x86_64-linux-gnu]
  - INSTALLATION DIRECTORY: /var/lib/gems/2.7.0
  - USER INSTALLATION DIRECTORY: /home/wsluser/.gem/ruby/2.7.0
  - RUBY EXECUTABLE: /usr/bin/ruby2.7
  - GIT EXECUTABLE: /usr/bin/git
  - EXECUTABLE DIRECTORY: /usr/local/bin
  - SPEC CACHE DIRECTORY: /home/wsluser/.gem/specs
  - SYSTEM CONFIGURATION DIRECTORY: /etc
  - RUBYGEMS PLATFORMS:
    - ruby
    - x86_64-linux
  - GEM PATHS:
     - /var/lib/gems/2.7.0
     - /home/wsluser/.gem/ruby/2.7.0
     - /usr/lib/ruby/gems/2.7.0
     - /usr/share/rubygems-integration/2.7.0
     - /usr/share/rubygems-integration/all
     - /usr/lib/x86_64-linux-gnu/rubygems-integration/2.7.0
  - GEM CONFIGURATION:
     - :update_sources => true
     - :verbose => true
     - :backtrace => false
     - :bulk_threshold => 1000
  - REMOTE SOURCES:
     - https://rubygems.org/
  - SHELL PATH:
     - /usr/local/sbin
     - /usr/local/bin
     - /usr/sbin
     - /usr/bin
     - /sbin
     - /bin
     - /usr/games
     - /usr/local/games
     - /mnt/c/Users/.../DOCUME~1/MobaXterm/slash/bin
     - /mnt/c/WINDOWS/
     - /mnt/c/WINDOWS/system32/
     - /snap/bin
wsluser@paulownia:~$


gem list

🔎出力結果

wsluser@paulownia:~$ gem list

*** LOCAL GEMS ***

benchmark (default: 0.1.0)
bigdecimal (default: 2.0.0)
bundler (default: 2.1.2)
cgi (default: 0.1.0)
csv (default: 3.1.2)
date (default: 3.0.0)
dbm (default: 1.1.0)
delegate (default: 0.1.0)
did_you_mean (default: 1.4.0)
etc (default: 1.1.0)
fcntl (default: 1.0.0)
fiddle (default: 1.0.0)
fileutils (default: 1.4.1)
forwardable (default: 1.3.1)
gdbm (default: 2.1.0)
getoptlong (default: 0.1.0)
io-console (default: 0.5.3)
ipaddr (default: 1.2.2)
irb (default: 1.2.1)
json (default: 2.3.0)
logger (default: 1.4.2)
matrix (default: 0.2.0)
minitest (5.13.0)
mutex_m (default: 0.1.0)
net-pop (default: 0.1.0)
net-smtp (default: 0.1.0)
net-telnet (0.1.1)
observer (default: 0.1.0)
open3 (default: 0.1.0)
openssl (default: 2.1.2)
ostruct (default: 0.2.0)
power_assert (1.1.7)
prime (default: 0.1.1)
pstore (default: 0.1.0)
psych (default: 3.1.0)
racc (default: 1.4.16)
rake (13.0.1)
rdoc (default: 6.2.1)
readline (default: 0.0.2)
readline-ext (default: 0.1.0)
reline (default: 0.1.2)
rexml (default: 3.2.3)
rss (default: 0.2.8)
rubygems-update (3.2.16)
sdbm (default: 1.0.0)
singleton (default: 0.1.0)
stringio (default: 0.1.0)
strscan (default: 1.0.3)
test-unit (3.3.5)
timeout (default: 0.1.0)
tracer (default: 0.1.0)
uri (default: 0.10.0)
webrick (default: 1.6.0)
xmlrpc (0.3.0)
yaml (default: 0.1.0)
zlib (default: 1.1.0)
wsluser@paulownia:~$