今天想笔记的是把自己写的Ruby on Rails项目部署(Deploy)到Heroku!
Heroku是Salesforce公司旗下的云端服务商,支持多种程序语言像是Ruby,PHP,Python等等。
提早让应用程序能快速建置、部署的主要好处就是提早一步发现问题啰,
如果将所有功能都写好再一起丢上去,可能会不容易发现不同的错误是分别出在哪里!
而且能在网路上让全世界看到自己努力实作的成果,还是比只有在本机localhost观赏更有成就感的。
以下以我在前篇文章写的Ruby on Rails项目为例:
Step.1 Getting started on Heroku with Ruby
二话不说,我们先到Heroku的申请页面用好自己的帐号,然后进入后台选择Ruby程序语言,按下create new app:
页面会跳转至如何设定Ruby的教学文件,开始一步步研究它:
A.在Terminal确定Ruby版本:ruby -v
tingdeMacBook-Air:~ tingtinghsu$ ruby -v
ruby 2.4.2p198(2017-09-14 revision 59899)[x86_64-darwin17]
B.安装bundler:输入gem install bundler
在Ruby世界里,
Gem代表套件,是各种打包好的代码,让开发效率更加速,节省工程师的宝贵时间。*
而Bundler是管理Gem相依性(dependencies)的工具,解决不同套件之间的依存关系,避免因为版本问题而产生冲突。*
tingdeMacBook-Air:~ tingtinghsu$ gem install bundler
Fetching: bundler-1.16.4.gem(100%)
Successfully installed bundler-1.16.4
Parsing documentation for bundler-1.16.4
Installing ri documentation for bundler-1.16.4
Done installing documentation for bundler after 8 seconds
1 gem installed
可以看到指令已经自动帮我装好了bundler-1.16.4.gem
C.安装Git
如果你的还没有装Git版本控制系统的话,Heroku教学文件也附上Git官网安装连接。
以上的步骤对接下来故事的发展很重要喔!
Step2.在你的OS设定Heroku CL界面
接下来进入Set Up页面照着步骤进行(vmwork):
A.用Homebrew安装Command Line界面
由于我使用的是MacOS,除了直接下载图形化安装界面,文件提到我可以:
使用Homebrew的指令brew install heroku/brew/heroku。
什么是Homebrew呢?这里PTT的大大提到Mac专用的套件管理系统(就是像ubuntu的apt-get)。
来看看自己以前是否有装过(因为很有实验精神的我很爱乱碰一些东西):brew -v
tingdeMacBook-Air:~ tingtinghsu$ brew -v
Homebrew 1.4.0
Homebrew/homebrew-core(git revision fc09;last commit 2017-12-12)
记录显示一年前有玩弄过~
果然今年开始养成写笔记的好习惯是正确的,不然做过什么有趣的事都忘记了,就很可惜呢。:)
现在我可以放心的输入指令brew install heroku/brew/heroku:
如果还没安装的人,可移驾至Homebrew官网瞧瞧~
从以下代码brew update可看到安装heroku的同时,系统也帮我把2017年的Homebrew 1.4.0更新到Homebrew 1.7.2:
tingdeMacBook-Air:~ tingtinghsu$ brew update
Updated 1 tap(heroku/brew).
==> Updated Formulae
heroku/brew/heroku✔
tingdeMacBook-Air:~ tingtinghsu$ brew -v
Homebrew 1.7.2
Homebrew/homebrew-core(git revision 14e75;last commit 2018-08-30)
B.正式进入Heroku Command Line
关于部署Deploy,参考教学文件,首先移动到你项目的路径位置:(我的以yelpdemo文件夹为例)。
输入指令heroku login,然后输入你的heroku帐号密码:
$ heroku login
Enter your Heroku credentials.
Email: user@example.com
Password:
下一步是输入指令heroku create:代表我们已经在Heroku上建立app(应用程序)了。
https://ithelp.ithome.com.tw/upload/images/20180830/20111177Zb0XfVJgEz.png
以上显示我已经在Heroku上开一台服务器,Heroku随机分配的名称叫做dry-sea-32555,
用git remote -v指令确认一下git在heroku远端的节点:
tingdeMacBook-Air:yelpdemo tingtinghsu$ git remote -v
heroku https://git.heroku.com/dry-sea-32555.git(fetch)
heroku https://git.heroku.com/dry-sea-32555.git(push)
如果你想把网址改成好记一点的,可以输入heroku rename+你喜欢的名称:
tingdeMacBook-Air:yelpdemo tingtinghsu$ heroku rename tingsrailsdemo
Renaming dry-sea-32555 to tingsrailsdemo…done
Git remote heroku updated
接着去改完名的这个网址瞧瞧:
太好了,服务器完工!
Step3.Getting started on Heroku with Rails
重头戏「利用指令部署项目至Heroku」开始上场!
以下纪录在把Ruby on Rail项目往Heroku上面推之前,记得到程序构架里修改的步骤。
A.首先,确定Rails版本rails -v:
tingdeMacBook-Air:yelpdemo tingtinghsu$ rails -v
Rails 5.1.6
这时候一定要用力参考这篇如何设定Rails的教学文件Getting Started on Heroku with Rails 5.x,让我们的代码可以顺利在网际网络上运行。记得参考的Heroku文件必须搭配相应的rails版本,如果你的rails版本是4或更旧的版本,文件里也有连接。
B.建立Heroku gem:
还记得刚刚文章开头我们聊过打包好的代码gem(套件),这时马上是个练习的好机会。
Horoku高度推荐我们开发项目所使用的数据库是Postgresql:
If you’re using an existing app that was created without specifying --database=postgresql,you need to add the pg gem to your Rails project.
Edit your Gemfile and change this line:gem 'sqlite3'To this:gem 'pg'
所以现在来到我的本地文件夹里的gem file,新增一个gem叫做'pg'
source 'https://rubygems.org'
git_source(:github)do |repo_name|
repo_name =“#{repo_name}/#{repo_name}”unless repo_name.include?(“/”)
“https://github.com/#{repo_name}.git”
end
# Bundle edge Rails instead: gem 'rails',github: 'rails/rails'
gem 'rails','~> 5.1.6'
#gem 'sqlite3' #database for Active Record
gem 'pg' #在这个地方新增Postgresql gem
gem 'puma','~> 3.7' #app server
gem 'sass-rails','~> 5.0' #stylesheets
gem 'uglifier','>= 1.3.0' #compressor for JavaScript assets
gem 'coffee-rails','~> 4.2' #.coffee assets and views
gem 'turbolinks','~> 5' #navigate your web application faster
gem 'jbuilder','~> 2.5' #Build JSON APIs
C.利用bundle确认套件版本之间的相依性没有冲突。
如同本文开头所提到的,这个步骤很重要。
记得,只要改过任何gemfile,就要再跑过bundle install指令,确认相依性:
Fetching gem metadata from https://rubygems.org/………
Fetching gem metadata from https://rubygems.org/.
Resolving dependencies…
bundler很乖地帮我们查找到了一个,这就是刚刚修改的Pg套件:
Fetching pg 1.1.2
Installing pg 1.1.2 with native extensions
…
Bundle complete!16 Gemfile dependencies,70 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
每次头一回安装一个新套件,还跟它不熟时,
你可以输入bundle info +套件名称深入了解详细数据,增强自己的印象,以及对技术的近一步认识(以免装过什么gem玩意都很容易失忆啊):
tingdeMacBook-Air:yelpdemo tingtinghsu$ bundle info pg
* pg(1.1.2)
Summary: Pg is the Ruby interface to the {PostgreSQL RDBMS}[http://www.postgresql.org/]
Homepage: https://bitbucket.org/ged/ruby-pg
Path: /Users/tingtinghsu/.rvm/gems/ruby-2.4.2/gems/pg-1.1.2
D.利用git指令,部署项目至Heroku:git push heroku master
tingdeMacBook-Air:yelpdemo tingtinghsu$ git push heroku master
Counting objects: 129,done.
Delta compression using up to 4 threads.
Compressing objects: 100%(112/112),done.
Writing objects: 100%(129/129),28.60 KiB | 0 bytes/s,done.
Total 129(delta 9),reused 105(delta 3)
…
* [new branch] master -> master
好了!既然推上去了,就跑去Heroku网站看一眼长什么样子:
疑?我精美的网站呢?
E.最后的最后…记得要输入指令heroku run rake db:migrate更新数据库
为了解决刚刚的问题,在这里解释:
Rails的环境分成三种
development开发模式,
test测试模式,和
production产品正式上线模式。在这里的Heroku就是我们的产品模式(zflwx)。
这个指令的意思,每次更改数据库时,记得最后要在Heroku(产品正式上线模式)跑migration。
tingdeMacBook-Air:yelpdemo tingtinghsu$ heroku run rake db:migrate
Running rake db:migrate on⬢tingsrailsdemo…up,run.3211(Free)
================================
-- create_table(:restaurants)
-> 0.0102s
== 20180823054504 CreateRestaurants: migrated(0.0107s)=======================
跑完rake db:migrate后,页面终于顺利出现。:)
后记,在最后的处理数据库部分的时候,我卡了快2小时…因为我之前预设的rails项目是使用sqlite3而不是PostgreSQL!不过为了解决bug,之后近一步参考why you cannot use Sqlite3 on Heroku,再搜寻错误讯息的关键字,增加了更多知识,顺便连下一篇文章主题都想好了:如何把你的Rails app数据库从sqlite移转成postgre。开心!XD