在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上的浏览器中访问并进行操作确认。

access_index.jpg

随意地添加数据。

create_record.jpg

通过按下 [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]。

launch_pgadmin.jpg

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

connect_postgresql.jpg

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

view_table.jpg

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

view_record.jpg

故障排除 (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在日语语言环境下的输出示例,但是每一行内容都逐渐向下偏移。

ls_ja.jpg

在周年更新中并没有遇到这样的问题,但是我想起了之前将语言设置为英语的事情,所以这次我也尝试将语言设置为英语。

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

更改区域设置后,再次确认 ls -la 的输出结果,此时已经正常显示。

ls_en.jpg

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

ls_en_echo.jpg

這次的更新中,我對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開発環境を作ろう
广告
将在 10 秒后关闭
bannerAds