LoginSignup
19
14

More than 5 years have passed since last update.

Bash on Ubuntu on Windows で Rails/PostgreSQL の開発環境を構築する [Creators Update 編]

Last updated at Posted at 2017-04-09

2016 年末に Bash on Ubuntu on Windows で Rails/PostgreSQL の開発環境を構築して以来、Mac から Windows に回帰してストレスなく開発を続けています。

この開発環境に Windows 10 Creators Update が自動で降ってくる前に、まずは仮想マシンに Creators Update をクリーンインストールし、Bash on Ubuntu on Windows (以下、BoW) で Rails/PostgreSQL の開発環境を構築してみたので、その手順を Step by Step で紹介します。

はじめに

対象

  • Windows マシンのローカル上に Rails/PostgreSQL の開発環境を構築したい
  • CUI (PowerShell, BoW) のみで構築したい
  • Mac から Windows に回帰したい

動作環境

  • Windows マシンの構成 (試行錯誤用)
    • VMware Fusion 8.5 の仮想マシン (Core i5-5257U、メモリ 4GB)
    • Windows 10 Pro x64, build 15063.13
  • Ruby/Rails のバージョン
    • Ruby 2.3.0 / Rails 4.2.3
    • Ruby 2.4.1 / Rails 5.0.2

BoW のシステム要件

参考までに、BoW の Installation Guide では、以下が BoW のシステム要件となっています。(Windows 10 Home でも可)

  1. Your PC must be running a 64-bit version of Windows 10 Anniversary Update build 14393 or later

PostgreSQL の構成

Anniversary Update の BoW では、PostgreSQL のインストールに失敗する問題があったため、BoW では PostgreSQL クライアントのみをインストールし、PostgreSQL サーバーとして PostgreSQL for Windows を直接 Windows にインストールしていました。

今回の Creators Update で PostgreSQL のインストールに失敗する問題はめでたく改善したので、PostgreSQL サーバーも BoW に構成しようとしたところ…、PostgreSQL 固有ではない BoW の別の問題として、普通の Linux 的なやり方 (sysv-rc-conf <service> on) ではサービスの自動起動が設定できず、色々と面倒 (sshd の例) であることがわかりました。

これに対し、PostgreSQL for Windows では、特別な考慮は必要なく、Windows のサービスとして PostgreSQL が自動起動します。また、ここ数ヶ月、BoW の PostgreSQL クライアントから PostgreSQL for Windows に接続する構成で開発を続けていましたが、特に気になるデメリットもなく、データベースとそれ以外が分離されている方が何かと都合も良いので、Creators Update でもこの構成を踏襲します。

実行内容の凡例

PowerShell の実行内容

> command

BoW の実行内容

$ command

BoW のインストール

BoW のインストール

[Windows] キー + [X] キー > [Windows PowerShell (管理者)] を開き、以下の 2 つのコマンドでレジストリを追加することにより、開発者モードを有効にします。

> New-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock -Name AllowAllTrustedApps -PropertyType DWord -Value 1 -Force
> New-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock -Name AllowDevelopmentWithoutDevLicense -PropertyType DWord -Value 1 -Force

Windows Subsystem for Linux (beta) を有効化し、Y で OS を再起動します。

> Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
この操作を完了するために、今すぐコンピューターを再起動しますか?
[Y] Yes  [N] No  [?] ヘルプ (既定値は "Y"): Y

OS の再起動後、[Windows] キー + [X] キー > [Windows PowerShell] を開き、BoW のインストールを開始します。

> bash

y で続行します。

-- ベータ機能 --
これにより Windows に Ubuntu がインストールされます。Ubuntu は Canonical によって配布される製品であり、
次のサイトに示される条件に基づいてライセンスされています。
https://aka.ms/uowterms

続行するには、"y" を入力してください: y

処理の完了まで数分待ちます。

Windows ストアからダウンロードしています... 100%
ファイル システムを展開しています。この処理には数分かかります...

y で続行し、ロケールを ja-JP に設定します。

Ubuntu のロケールを Windows のロケール (ja-JP) と一致するように設定しますか?
既定のロケールは en_US です。
続行するには、"y" を入力してください: y

BoW の任意のユーザー名とパスワードを入力します。

既定の UNIX ユーザー アカウントを作成してください。ユーザー名は、Windows のユーザー名と一致する必要はありません。
詳細: https://aka.ms/wslusers を参照してください
新しい UNIX ユーザー名を入力してください: bowuser
新しい UNIX パスワードを入力してください: (パスワードを入力)
新しい UNIX パスワードを再入力してください: (パスワードを再入力)

インストールが完了し、Bash が起動すると、プロンプトが $ になります。

passwd: password updated successfully
インストールが正常に終了しました
環境が間もなく開始されます...
ドキュメントを参照できる場所: https://aka.ms/wsldocs
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

bowuser@win10cu:/mnt/c/Users/winuser$

BoW の初期設定

Ubuntu 日本語 Remix っぽく、リポジトリの URL を jp に変更します。(お好みで他でも可)

$ sudo sed -i -e 's/archive/jp.archive/g' /etc/apt/sources.list

デフォルトでは umask0000 なので、0022 に変更します。

$ echo 'umask 022' >> ~/.bashrc
$ source ~/.bashrc

Creators Update では、BoW から Windows 側のアプリケーションを起動できるようになりましたが、Windows 側の PATH (/mnt/c/...) が BoW に渡されることによる弊害があるため、BoW 側で /mnt/c/... の PATH を除外します。

$ echo 'export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"' >> ~/.bashrc
$ source ~/.bashrc

Visual Studio Code の統合ターミナルを使用する場合、後述のトラブルシューティングのように、日本語の出力がずれてカオスな状態になるため、ロケールを英語に変更します。(PowerShell や BoW のコンソールなら日本語でも問題ないはず。)

$ sudo update-locale LANG=en_US.UTF-8
$ source /etc/default/locale

作業用のディレクトリの作成

Microsoft の中の人が警告しているように、BoW のファイルシステム (%localappdata%\lxss) 配下のファイルを Windows 側から作成/編集すると、ファイルが破損する可能性があります。

そのため、Windows 側のファイルシステム配下に作業用のディレクトリ (C:\workspace) を作成し、BoW から扱いやすいようにシンボリックリンクを作成します。

$ mkdir /mnt/c/workspace
$ ln -s /mnt/c/workspace ~/workspace

Ruby のインストール

パッケージを更新します。

$ sudo apt-get update
$ sudo apt-get upgrade

必要なパッケージをインストールします。

$ sudo apt-get install git nodejs build-essential zlib1g-dev libssl-dev libreadline-dev libyaml-dev libxslt-dev libcurl4-openssl-dev libffi-dev sqlite3 libsqlite3-dev

rbenv をインストールします。

$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(rbenv init -)"' >> ~/.bashrc
$ source ~/.bashrc

ruby-build をインストールします。

$ git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
$ echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc
$ source ~/.bashrc

Ruby をインストールします。rbenv install の完了まで 15 分程度待ちます。(ruby 2.3.0 の例)

$ rbenv install 2.3.0
$ rbenv global 2.3.0
$ ruby -v
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux]

ドキュメントを除外し、Bundler をインストールします。

$ echo 'gem: --no-document' >> ~/.gemrc
$ gem install bundler

PostgreSQL のインストール

BoW では PostgreSQL クライアントのみをインストールし、PostgreSQL サーバーとして、PostgreSQL for Windows を直接 Windows のローカルにインストールします。

PostgreSQL クライアントのインストール

PostgreSQL クライアントをインストールします。(postgresql-client-9.5 の例)

$ sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
$ wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
$ sudo apt-get update
$ sudo apt-get install postgresql-client-9.5 libpq-dev

PostgreSQL for Windows のインストール

BoW を終了して PowerShell に戻り、PostgreSQL for Windows をダウンロードします。(postgresql-9.5.6-2 の例)

$ exit
> Start-BitsTransfer -Source http://get.enterprisedb.com/postgresql/postgresql-9.5.6-2-windows-x64.exe -Destination C:\workspace\postgresql-9.5.6-2-windows-x64.exe

postgres ユーザーの任意のパスワードと Locale を指定し、PostgreSQL をインストールします。

> C:\workspace\postgresql-9.5.6-2-windows-x64.exe --mode unattended --superpassword <postgres ユーザーのパスワード> --locale C

Setup のプログレスバーが終了したら、BoW に戻ります。

> bash

PostgreSQL の初期設定

postgres ユーザーで接続テスト後、問題なければ ¥q で抜けます。

$ psql -h localhost -U postgres
Password for user postgres: (postgres ユーザーのパスワードを入力)
psql (9.5.6)
Type "help" for help.

postgres=# \q

デフォルトで接続するホスト名を localhost に設定します。

$ echo 'export PGHOST=localhost' >> ~/.bashrc
$ source ~/.bashrc

BoW と同名のユーザーをスーパーユーザーで作成します。

$ createuser $(whoami) -s -U postgres
Password: (postgres ユーザーのパスワードを入力)

認証方法を md5 から trust に変更します。

$ sed -i -e '/^host/s/md5/trust/g' /mnt/c/Program\ Files/PostgreSQL/9.5/data/pg_hba.conf

Rails のインストール

本題の Rails をインストールし、アプリケーションを作成します。

Rails のインストール

Rails をインストールします。インストールの完了まで数分待ちます。(rails 4.2.3 の例)

$ cd ~/workspace
$ gem install rails -v 4.2.3

アプリケーションの作成

データベースに PostgreSQL を指定し、アプリケーションを作成します。(アプリケーション名が bowapp の例)

$ rails _4.2.3_ new bowapp -d postgresql

作成したアプリケーションのディレクトリに移動します。

$ cd bowapp

以降は、scaffold を使用した例です。

$ rails generate scaffold surfboard model:string shaper:string company:string
$ rake db:create db:migrate

動作確認

テーブルの作成後、URI を確認し、rails server を起動します。

$ rake routes
        Prefix Verb   URI Pattern                    Controller#Action
    surfboards GET    /surfboards(.:format)          surfboards#index
               POST   /surfboards(.:format)          surfboards#create
 new_surfboard GET    /surfboards/new(.:format)      surfboards#new
edit_surfboard GET    /surfboards/:id/edit(.:format) surfboards#edit
     surfboard GET    /surfboards/:id(.:format)      surfboards#show
               PATCH  /surfboards/:id(.:format)      surfboards#update
               PUT    /surfboards/:id(.:format)      surfboards#update
               DELETE /surfboards/:id(.:format)      surfboards#destroy
$ rails s
=> Booting WEBrick
=> Rails 4.2.3 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2017-04-09 22:08:17] INFO  WEBrick 1.3.1
[2017-04-09 22:08:17] INFO  ruby 2.3.0 (2015-12-25) [x86_64-linux]
[2017-04-09 22:08:17] INFO  WEBrick::HTTPServer#start: pid=1022 port=3000

Windows 上のブラウザからアクセスして動作確認します。

access_index.jpg

適当にデータを追加します。

create_record.jpg

rails server[Ctrl] キー + [C] キーで終了し、rails console からテーブルのデータを確認します。

$ rails c
Running via Spring preloader in process 330
Loading development environment (Rails 4.2.3)
irb(main):001:0> Surfboard.all
  Surfboard Load (1.2ms)  SELECT "surfboards".* FROM "surfboards"
=> #<ActiveRecord::Relation [#<Surfboard id: 1, model: "Sci-Fi", shaper: "ダニエル・トムソン", company: "Firewire Surfboards", created_at: "2017-04-09 13:24:41", updated_at: "2017-04-09 13:24:41">]>

また、PostgreSQL for Windows の管理コンソールから、テーブルのデータを確認することもできます。

[Windows] キー > pgadmin を検索して [pgAdmin III] を起動します。

launch_pgadmin.jpg

[PostgreSQL 9.5 (localhost:5432)] を右クリック > [接続] を開き、postgres ユーザーのパスワードを入力して [OK] で接続します。

connect_postgresql.jpg

[PostgreSQL 9.5 (localhost:5432)] > [データベース] > [<アプリケーション名>_development] > [スキーマ] > [public] > [テーブル] > [<テーブル名>] の順に開きます。

view_table.jpg

[<テーブル名>] を右クリック > [データビュー] > [先頭 100 行の表示] を開くと、保存されたデータの確認や編集ができます。

view_record.jpg

トラブルシューティング

gem や rails の実行時に警告が出力される

gemrails の実行時に、warning: Insecure world writable dir /mnt/c in PATH, mode 040777 のような警告が出力されます。

$ gem install bundler
Fetching: bundler-1.14.6.gem (100%)
/home/bowuser/.rbenv/rbenv.d/exec/gem-rehash/rubygems_plugin.rb:6: warning: Insecure world writable dir /mnt/c in PATH, mode 040777
Successfully installed bundler-1.14.6
1 gem installed

Anniversary Update でも同じような警告が出力されましたが、/home/<ユーザー名>/.rbenv/versions のパス (BoW 内) の権限に関する警告となっていたため、chmod でこのパスの権限を変更することにより対応できていました。

しかし今回は、/mnt/c のパス (BoW 外) の権限に関する警告となっており、BoW の制約上、BoW 外のパスの権限は変更できないようでした。

さらに調べたところ、/mnt/c の権限に関する警告が出力されるようになったのは、Creators Update の BoW では、Windows 側の PATH (/mnt/c/...) が BoW に渡されるようになったことに起因していました。そこで、BoW から Windows アプリケーションを使いまくる要件がなければ、BoW 側の PATH から /mnt/c/... を除外することで対応します。

$ vi ~/.bashrc

...

umask 022
export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"   <<< rbenv の設定の上に追記
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"
export PGHOST=localhost

[未解決] Visual Studio Code の統合ターミナルで日本語の出力がずれる

Creators Update の BoW では日本語の扱いが改善したはずなのですが、Visual Studio Code の統合ターミナルを使用する場合、日本語の出力がむしろ悪化しています…。

以下は、ロケールが日本語の場合の ls -la の出力例ですが、行ごとにどんどんずれてしまっています。

ls_ja.jpg

Anniversary Update の BoW ではこのような問題はなかったのですが、ロケールを英語に設定していたことを思い出し、今回もロケールを英語に変更してみました。

$ sudo update-locale LANG=en_US.UTF-8
$ source /etc/default/locale

ロケールを変更後、同様に ls -la の出力結果を確認すると、今度は問題なく表示されました。

ls_en.jpg

これで解決と思いきや、ロケールとは直接的な関係はなく、出力結果に日本語が含まれる場合にずれることがわかりました。ロケールが英語の状態で、echo あ を実行してみると、当初の問題と同じように、行ごとにどんどんずれてしまいました…。

ls_en_echo.jpg

Anniversary Update では、Visual Studio Code の統合ターミナルの使い勝手やパフォーマンスが気に入り、Atom から移行してきたのですが、回避策が見つからなければ、ターミナルを別ウィンドウ (PowerShell や BoW のコンソールなど) にするか、日本語の出力でずれた都度 clear を実行するか…。こちらも一旦様子見とします…。というか構築の最終段階でこの問題が発覚して力尽きました。

試行錯誤しすぎたので環境を初期化したい

PowerShell、BoW、PostgreSQL のコンソールなどを事前に終了させた上で、BoW と PostgreSQL for Windows をアンインストールし、作業用のディレクトリも不要であれば削除します。

[Windows] キー + [X] キー > [Windows PowerShell (管理者)] を開き、BoW をアンインストールします。

> lxrun /uninstall /full /y

続いて、PostgreSQL for Windows をアンインストールします。ポップアップが表示されたら [Yes][OK] で続行します。

> C:\Program` Files\PostgreSQL\9.5\uninstall-postgresql.exe

アンインストールの終了後、C:\Program Files\PostgreSQL を削除します。

> Remove-Item -Path 'C:\Program Files\PostgreSQL' -Recurse -Force

作業用のディレクトリも不要であれば削除します。

> Remove-Item -Path C:\workspace -Recurse -Force

参考

19
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
14