在Windows上使用Bash的Ubuntu环境来构建Rails/PostgreSQL开发环境[创作者更新教程]
自从2016年底使用Bash on Ubuntu on Windows在Windows上搭建了Rails/PostgreSQL开发环境以来,我从Mac回到了Windows,并且顺利地继续开发而不感到压力。
在Windows 10 Creators Update自动安装到这个开发环境之前,首先在虚拟机上进行一个干净的Creators Update安装,并在Windows上的Bash on Ubuntu上构建Rails/PostgreSQL的开发环境。现在,让我一步一步地介绍这个过程。
首先
目标
-
- 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
词袋(Bag of Words)系统的要求
供参考,在BoW的安装指南中,以下是BoW的系统要求(适用于Windows 10家庭版)。
你的电脑必须运行64位的Windows 10纪念版更新版本14393或更高的版本。
PostgreSQL 配置
由于Anniversary Update的BoW中安装PostgreSQL失败的问题,BoW只安装了PostgreSQL客户端,并直接将PostgreSQL for Windows作为PostgreSQL服务器安装在Windows上。
由于本次的Creators Update,失败了PostgreSQL的安装问题被成功改善,因此我尝试将PostgreSQL服务器配置为BoW时,遇到了另一个与PostgreSQL无关的BoW问题,即不能使用通常的Linux方式(sysv-rc-conf on)来设置服务的自动启动,并且发现这很麻烦(以sshd为例)。
对于这一点,PostgreSQL for Windows 不需要任何特殊考虑,它会作为 Windows 的一个服务而自动启动。此外,在过去几个月里,我们一直在使用 BoW 的 PostgreSQL 客户端连接到 PostgreSQL for Windows 进行开发,但没有任何特别引人关注的不利之处。由于数据库与其他部分被分离,这种配置更加方便,所以在 Creators Update 中我们将继续采用这种配置。
执行内容的图例
PowerShell 的执行内容。
> command
词袋模型(BoW)的执行内容。
$ command
在中文中,”BoW のインストール”可以翻译为 “BoW的安装”。
安装 BoW
使用键盘组合 [Windows] + [X] 打开菜单,选择 [Windows PowerShell (管理员)] 并输入以下两个命令来添加注册表以启用开发者模式。
> 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(测试版),并使用 Y 重新启动操作系统。
> Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
この操作を完了するために、今すぐコンピューターを再起動しますか?
[Y] Yes [N] No [?] ヘルプ (既定値は "Y"): Y
在操作系统重新启动后,按下[Windows]键 + [X]键,然后打开[Windows PowerShell],开始进行BoW的安装。
> bash
继续进行。
-- ベータ機能 --
これにより 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$
袋装吸尘器的初始设置
将Ubuntu进行日本语Remix,将存储库的URL更改为jp。(可以根据个人喜好选择其他选项)
$ sudo sed -i -e 's/archive/jp.archive/g' /etc/apt/sources.list
默认情况下,umask是0000,所以将其更改为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
创建一个用于作业的目录
正如微软的人员所警告的那样,如果在Windows中创建/编辑位于BoW文件系统(%localappdata%\lxss)下的文件,可能会导致文件损坏的风险。
因此,在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安装完成大约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服务器直接安装在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
在Windows操作系统上安装PostgreSQL。
结束 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
以指定的密码和本地语言环境安装PostgreSQL。
> C:\workspace\postgresql-9.5.6-2-windows-x64.exe --mode unattended --superpassword <postgres ユーザーのパスワード> --locale C
当设置进度条完成后,返回到 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
下面是使用脚手架的示例。
$ rails generate scaffold surfboard model:string shaper:string company:string
$ rake db:create db:migrate
确认行动
创建完表后,检查 URI 并启动 rails 服务器。
$ 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上的浏览器中访问并进行操作确认。

随意地添加数据。

通过按下 [Ctrl] 键 + [C] 键来终止 rails server,并通过 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]。

在本地主机5432上,以右键点击PostgreSQL 9.5,打开连接,输入postgres用户的密码,点击确定连接。

通过以下顺序打开:[PostgreSQL 9.5(localhost:5432)] > [数据库] > [<应用程序名称>_development] > [模式] > [public] > [表] > [<表名称>]。

当你右键点击 [<表名>] > [数据视图] > [显示前100行],你可以打开并确认或编辑保存的数据。

故障排除 (Guzhang paichu)
在执行gem或者Rails时,会输出警告信息。
在运行gem或rails时,会输出警告信息:警告:路径中存在不安全的可写目录/mnt/c,模式为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 也出现了类似的警告,不过它们是关于路径(BoW内)/home/<用户名>/.rbenv/versions的权限的警告。因此,我们通过使用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 的基礎上,應該對日語進行了改進,但是如果使用 Visual Studio Code 的整合終端機,日語的輸出反而變得更差了…
以下是ls -la在日语语言环境下的输出示例,但是每一行内容都逐渐向下偏移。

在周年更新中并没有遇到这样的问题,但是我想起了之前将语言设置为英语的事情,所以这次我也尝试将语言设置为英语。
$ sudo update-locale LANG=en_US.UTF-8
$ source /etc/default/locale
更改区域设置后,再次确认 ls -la 的输出结果,此时已经正常显示。

我原本以为这样就解决了,但实际上,与地域设置并没有直接关系,发现输出结果中包含日语时会出现错位。在地区设置为英语的情况下,执行 echo あ ,与最初的问题一样,每一行都会逐渐错位…

這次的更新中,我對Visual Studio Code的整合終端機的使用便利性和效能非常滿意,所以從Atom轉來使用,但如果找不到解決辦法的話,我可能會將終端機放在另一個視窗裡(例如PowerShell或BoW的控制台),或者每次出現日語輸出錯位時都要執行clear命令…。我暫時會再觀察一下…。說真的,在構建的最後階段才發現這個問題,讓我覺得有些力不從心。
由于太多的试错,所以想要初始化环境。
在卸载 BoW 和 PostgreSQL for Windows 之前,请先关闭 PowerShell、BoW 和 PostgreSQL 的控制台,如果工作目录不再需要,则删除它。
按下[Windows]键 + [X]键 > 打开[Windows PowerShell (管理员)],然后卸载BoW。
> lxrun /uninstall /full /y
然后,您需要卸载Windows上的PostgreSQL。如果出现弹窗,请点击[是]或[确定]继续进行。
> 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
请参考
-
- Bash on Ubuntu on Windows で Rails/PostgreSQL の開発環境を構築する [Anniversary Update 編]
-
- Bash on Ubuntu on Windows – Installation Guide
-
- install postgresql issue · Issue #61 · Microsoft/BashOnWindows
-
- How to run sshd as a windows service ? · Issue #612 · Microsoft/BashOnWindows
-
- Do not change Linux files using Windows apps and tools
-
- chmod doesn’t work? · Issue #81 · Microsoft/BashOnWindows
- Bash on Ubuntu on Windows + VcXsrv + RubyMine でWindowsでも快適なRails開発環境を作ろう