2018/1/7

第十九天:發布網站到 Heroku (續)

markdown # 前情提要 昨天我們在發布網站的過程中遇到了錯誤: ``` remote: In Gemfile: remote: sqlite3 remote: ! remote: ! Failed to install gems via Bundler. remote: ! Detected sqlite3 gem which is not supported on Heroku: remote: ! https://devcenter.heroku.com/articles/sqlite3 ``` heroku:「ㄉㄅㄑ,我不會用 sqlite3。」 所以我們必須移除 sqlite3 這個套件才行。 # 認識 Gemfile Gemfile 在專案的根目錄下: ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCIgrMqVSdlHVBvicaxARz43nBR6GIk2IXl34zKwvZhme-qNPh0R1k-bOjbnzC8TnK7uuK8Rve3G917Pd9MfFpduvVFziskR90ecxIlhaFL8L0mnqvHHBS4zw8AKDo7y2KH_iFjPzAEnw/s1600/28.jpg) 第12行寫著:`gem 'sqlite3'` 表示這個專案會使用 sqlite3 這個套件。套件是一群佛心來的人寫好後公開給大家用的程式。如果你想要安裝套件,就會需要在這裡加一行程式,如果想要移除某個套件,就要刪掉那一行程式。 這裡有所有能裝的套件:[https://rubygems.org/gems](https://rubygems.org/gems)。如果你想要成佛也可以在這裡貢獻一下你的程式。 每當修改過 Gemfile 之後,你要在小黑框輸入 `bundle install`。 bundle 是一個管理套件的套件,他會幫你下載套件程式碼。 如果你輸入 `bundle install` 之後看到的是這樣: ``` D:\只要有心,人人都可以作卡米狗\ironman>bundle install 'bundle' 不是內部或外部命令、可執行的程式或批次檔。 ``` 表示你的電腦沒有裝過 bundler,需要在小黑框輸入 `gem install bundler` 來安裝。 ``` D:\只要有心,人人都可以作卡米狗\ironman>gem install bundler Fetching: bundler-1.16.1.gem (100%) Successfully installed bundler-1.16.1 Parsing documentation for bundler-1.16.1 Installing ri documentation for bundler-1.16.1 Done installing documentation for bundler after 20 seconds 1 gem installed ``` # 移除 rails 專案中所使用的 sqlite3 套件 我們開始進行 sqlite3 的移除工作吧。 前面提到 Gemfile 第12行寫著:`gem 'sqlite3'`,我們可以在這行的最前面加一個 `#` 號把這行變成註解,像這樣: ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgesrc7RuIRieOnpvrexe3RDXuhWATO1w3oYLFCDc73Hh0CiwuSX2cDpj98O0bTqAvVe8Jfte_17iHc0XtHQO-T1DHgHIe_ZLziLGVlQlLNTSSKT-6B_6csR0DFym_4OHEkze9AjjtDMRE/s1600/29.jpg) 當然你要直接刪掉那行也不是不行啦,弄好之後記得存檔,存完檔之後,在小黑框輸入 `bundle install`。 ``` D:\只要有心,人人都可以作卡米狗\ironman>bundle Using rake 12.3.0 Using concurrent-ruby 1.0.5 Using i18n 0.9.1 Using minitest 5.10.3 Using thread_safe 0.3.6 Using tzinfo 1.2.4 Using activesupport 5.1.4 Using builder 3.2.3 Using erubi 1.7.0 Using mini_portile2 2.3.0 Using nokogiri 1.8.1 (x64-mingw32) Using rails-dom-testing 2.0.3 Using crass 1.0.3 Using loofah 2.1.1 Using rails-html-sanitizer 1.0.3 Using actionview 5.1.4 Using rack 2.0.3 Using rack-test 0.8.2 Using actionpack 5.1.4 Using nio4r 2.2.0 Using websocket-extensions 0.1.3 Using websocket-driver 0.6.5 Using actioncable 5.1.4 Using globalid 0.4.1 Using activejob 5.1.4 Using mini_mime 1.0.0 Using mail 2.7.0 Using actionmailer 5.1.4 Using activemodel 5.1.4 Using arel 8.0.0 Using activerecord 5.1.4 Using public_suffix 3.0.1 Using addressable 2.5.2 Using bindex 0.5.0 Using bundler 1.16.1 Using byebug 9.1.0 Using xpath 2.1.0 Using capybara 2.16.1 Using ffi 1.9.18 (x64-mingw32) Using childprocess 0.8.0 Using coffee-script-source 1.12.2 Using execjs 2.7.0 Using coffee-script 2.4.1 Using method_source 0.9.0 Using thor 0.20.0 Using railties 5.1.4 Using coffee-rails 4.2.2 Using multi_json 1.12.2 Using jbuilder 2.7.0 Using puma 3.11.0 Using sprockets 3.7.1 Using sprockets-rails 3.2.1 Using rails 5.1.4 Using rb-fsevent 0.10.2 Using rb-inotify 0.9.10 Using rubyzip 1.2.1 Using sass-listen 4.0.0 Using sass 3.5.4 Using tilt 2.0.8 Using sass-rails 5.0.7 Using selenium-webdriver 3.8.0 Using turbolinks-source 5.0.3 Using turbolinks 5.0.1 Using tzinfo-data 1.2017.3 Using uglifier 4.0.2 Using web-console 3.5.1 Bundle complete! 12 Gemfile dependencies, 66 gems now installed. Use `bundle info [gemname]` to see where a bundled gem is installed. D:\只要有心,人人都可以作卡米狗\ironman> ``` 你會看到目前專案正在使用的所有套件。 # 進行本機測試 開啟 `rails server` 看看是否一切正常: ``` D:\只要有心,人人都可以作卡米狗\ironman>rails s => Booting Puma => Rails 5.1.4 application starting in development => Run `rails server -h` for more startup options *** SIGUSR2 not implemented, signal based restart unavailable! *** SIGUSR1 not implemented, signal based restart unavailable! *** SIGHUP not implemented, signal based logs reopening unavailable! Puma starting in single mode... * Version 3.11.0 (ruby 2.4.2-p198), codename: Love Song * Min threads: 5, max threads: 5 * Environment: development * Listening on tcp://0.0.0.0:3000 Use Ctrl-C to stop ``` 看似正常,開網頁 [http://localhost:3000/](http://localhost:3000/) 看卻發現: ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj93wiegLHmtoY-k2IRmlMGYVNKyZhyphenhyphen6qTAu6tHSLpXhvler7QPjocLv9CQyhcf_viBMoQxaTFmKFMTfLZ6SXhcaG533T1sb6hUzm-Fd91vsjAhJsFm4gB-xPmPezAfPO3xFeS-AIMN118/s1600/4.jpg) 他說:「你的程式有用到 sqlite3,但是你沒有安裝 sqlite3,所以我又爆啦。」 # 我們在那裡用到了 sqlite3? 我們在 `config/database.yml` 中使用了 `sqlite3`。 ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgE39PLsv_vnojsSJxkQaFkTQZXyHEIswHOauk6ientPAQMK-iLOeX89kGPJJnEgiH1xTVnM1RefKbCpz-w1nj6H1m3qDEaG3x091pa_uqthbAZgV6XRYxMk3F21iC92wSUpNVfxraO95o/s1600/5.jpg) 原來 `sqlite3` 是一個資料庫的套件,但是由於 heroku 不支援 `sqlite3`,所以我們必須找另一款 heroku 能支援的資料庫換上去,這裡我們要換的是 `postgresql`。 # 改用 postgresql 我們需要把 `config/database.yml` 中第 8 行的 `adapter: sqlite3` 改為 `adapter: postgresql`。 ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsgFjtli1QcsRvWdHgxph2z6bNOMw1D0deBt_N6s_MXYFdtuHVF1G_POByKLUbiRISdlMX_DAp-Bb2V8YN-k8nUbBKu5inDVMhb3gtZao_rjiw8sna4tNSgwGPHrRWxkJfELMQHdtkv3U/s1600/6.jpg) 我們還需要安裝 `postgresql` 這個套件,這個套件叫 `pg`,所以修改 Gemfile 如下: ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQJNWxf8scoyZvVR3-pzHLOsdmt52X9CNE6RV_qded2mGB6vLjmw2nmnWMrNBdM8hCSt5uGw5FtpxhvU4pTadtETSkfeUBlDv7xJDbQxAAMhpBd7VZw0Q4LthVPcGqYGbD5vX5S6cFayc/s1600/7-2.jpg) 我在第 13 行寫 `gem 'pg', '~> 0.21.0'`,其實要寫在第幾行都行。不過第 37 行有一個 group: ``` group :development, :test do # Call 'byebug' anywhere in the code to stop execution and get a debugger console gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] # Adds support for Capybara system testing and selenium driver gem 'capybara', '~> 2.13' gem 'selenium-webdriver' end ``` `group :development, :test do` 這行的意思是,只有在開發和測試環境下才需要安裝的套件。因為我們的 heroku 的環境是 :production,所以我們如果把 `gem 'pg', '~> 0.21.0'` 寫在這個 group 裡的話,heroku 就還是壞的。 其中`~> 0.21.0` 表示版本號,一個套件會隨著時間不斷更新,就像 iOS 和 Android 也會一直系統更新一樣。我們可以指定想要安裝的版本。 改完 Gemfile 之後,先關閉網頁伺服器,然後在小黑框輸入 `bundle install` 安裝新套件完之後再打開網頁伺服器。 # 再次進行本機測試 打開網頁:[http://localhost:3000/](http://localhost:3000/) ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjukkeD979LVT-WiYhFVPtZBIFTtaufDMGn06OyOe4JGxRk0xpHKA1LyoHyJeFyWco7WwCTv7625TpkEVIEIJL2XctPikaAQYDymtb6uJMd14ncnpVOi1SZKFcSQGP7FDVEls8804EqNxY/s1600/8.jpg) 正常! # 把改動後的程式碼上傳到 heroku 上傳到 heroku 之前要先建立一個 git 版本,之前提到過的上傳三步驟: ``` git add . git commit -m "註解" git push heroku master ``` 如果你覺得註解亂寫沒關係的話,我是沒差,你可以直接複製上面三行程式碼到小黑框貼上。不過我就一步步來。 ### `git add .` 選擇所有檔案加入這次的版本: ``` D:\只要有心,人人都可以作卡米狗\ironman>git add . warning: LF will be replaced by CRLF in Gemfile. The file will have its original line endings in your working directory. warning: LF will be replaced by CRLF in Gemfile.lock. The file will have its original line endings in your working directory. warning: LF will be replaced by CRLF in config/database.yml. The file will have its original line endings in your working directory. ``` ### `git commit -m "改用pg"` 建立一個版本,我的註解是寫 `改用pg` 說明我們這次的改動: ``` D:\只要有心,人人都可以作卡米狗\ironman>git commit -m "改用pg" [master e6f3871] '改用pg' 3 files changed, 5 insertions(+), 2 deletions(-) D:\只要有心,人人都可以作卡米狗\ironman> ``` ### `git push heroku master` 上傳程式碼到 heroku: ``` D:\只要有心,人人都可以作卡米狗\ironman>git push heroku master Counting objects: 3, done. Delta compression using up to 4 threads. Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 297 bytes | 297.00 KiB/s, done. Total 3 (delta 2), reused 0 (delta 0) remote: Compressing source files... done. remote: Building source: remote: remote: -----> Ruby app detected remote: -----> Compiling Ruby/Rails remote: -----> Using Ruby version: ruby-2.3.4 remote: ###### WARNING: remote: Removing `Gemfile.lock` because it was generated on Windows. remote: Bundler will do a full resolve so native gems are handled properly. remote: This may result in unexpected gem versions being used in your app. remote: In rare occasions Bundler may not be able to resolve your dependencies at all. remote: https://devcenter.heroku.com/articles/bundler-windows-gemfile remote: remote: -----> Installing dependencies using bundler 1.15.2 remote: Running: bundle install --without development:test --path vendor/bundle --binstubs vendor/bundle/bin -j4 remote: The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java`. remote: Fetching gem metadata from https://rubygems.org/.......... remote: Fetching version metadata from https://rubygems.org/.. remote: Fetching dependency metadata from https://rubygems.org/. remote: Resolving dependencies... remote: Using rake 12.3.0 remote: Using concurrent-ruby 1.0.5 remote: Using minitest 5.11.1 remote: Using thread_safe 0.3.6 remote: Using builder 3.2.3 remote: Using erubi 1.7.0 remote: Using mini_portile2 2.3.0 remote: Using crass 1.0.3 remote: Using rack 2.0.3 remote: Using nio4r 2.2.0 remote: Using websocket-extensions 0.1.3 remote: Using mini_mime 1.0.0 remote: Using arel 8.0.0 remote: Using bundler 1.15.2 remote: Using coffee-script-source 1.12.2 remote: Using execjs 2.7.0 remote: Using method_source 0.9.0 remote: Using thor 0.20.0 remote: Using ffi 1.9.18 remote: Using multi_json 1.12.2 remote: Fetching pg 0.21.0 remote: Using puma 3.11.0 remote: Using rb-fsevent 0.10.2 remote: Using tilt 2.0.8 remote: Using turbolinks-source 5.0.3 remote: Using tzinfo 1.2.4 remote: Using nokogiri 1.8.1 remote: Using i18n 0.9.1 remote: Using rack-test 0.8.2 remote: Using sprockets 3.7.1 remote: Using websocket-driver 0.6.5 remote: Using mail 2.7.0 remote: Using coffee-script 2.4.1 remote: Using uglifier 4.1.2 remote: Using rb-inotify 0.9.10 remote: Using turbolinks 5.0.1 remote: Using loofah 2.1.1 remote: Using activesupport 5.1.4 remote: Using sass-listen 4.0.0 remote: Using rails-html-sanitizer 1.0.3 remote: Using rails-dom-testing 2.0.3 remote: Using globalid 0.4.1 remote: Using activemodel 5.1.4 remote: Using jbuilder 2.7.0 remote: Using sass 3.5.5 remote: Using actionview 5.1.4 remote: Using activejob 5.1.4 remote: Using activerecord 5.1.4 remote: Using actionpack 5.1.4 remote: Using actioncable 5.1.4 remote: Using actionmailer 5.1.4 remote: Using railties 5.1.4 remote: Using sprockets-rails 3.2.1 remote: Using coffee-rails 4.2.2 remote: Using rails 5.1.4 remote: Using sass-rails 5.0.7 remote: Installing pg 0.21.0 with native extensions remote: Bundle complete! 13 Gemfile dependencies, 56 gems now installed. remote: Gems in the groups development and test were not installed. remote: Bundled gems are installed into ./vendor/bundle. remote: Bundle completed (11.93s) remote: Cleaning up the bundler cache. remote: The latest bundler is 1.16.1, but you are currently running 1.15.2. remote: To update, run `gem install bundler` remote: -----> Installing node-v6.11.1-linux-x64 remote: -----> Detecting rake tasks remote: -----> Preparing app for Rails asset pipeline remote: Running: rake assets:precompile remote: Yarn executable was not detected in the system. remote: Download Yarn at https://yarnpkg.com/en/docs/install remote: Asset precompilation completed (1.50s) remote: Cleaning assets remote: Running: rake assets:clean remote: remote: ###### WARNING: remote: You have not declared a Ruby version in your Gemfile. remote: To set your Ruby version add this line to your Gemfile: remote: ruby '2.3.4' remote: # See https://devcenter.heroku.com/articles/ruby-versions for more information. remote: remote: ###### WARNING: remote: Removing `Gemfile.lock` because it was generated on Windows. remote: Bundler will do a full resolve so native gems are handled properly. remote: This may result in unexpected gem versions being used in your app. remote: In rare occasions Bundler may not be able to resolve your dependencies at all. remote: https://devcenter.heroku.com/articles/bundler-windows-gemfile remote: remote: ###### WARNING: remote: No Procfile detected, using the default web server. remote: We recommend explicitly declaring how to boot your server process via a Procfile. remote: https://devcenter.heroku.com/articles/ruby-default-web-server remote: remote: -----> Discovering process types remote: Procfile declares types -> (none) remote: Default types for buildpack -> console, rake, web, worker remote: remote: -----> Compressing... remote: Done: 36.7M remote: -----> Launching... remote: Released v8 remote: https://people-all-love-kamigo.herokuapp.com/ deployed to Heroku remote: remote: Verifying deploy... done. To https://git.heroku.com/people-all-love-kamigo.git e6f3871..5ec30ea master -> master D:\只要有心,人人都可以作卡米狗\ironman> ``` 這次看似上傳成功了,從最後面往上看,倒數第 5 行有一個網址:[https://people-all-love-kamigo.herokuapp.com/](https://people-all-love-kamigo.herokuapp.com/),以及三個 WARNING。 先不管 WARNING,我們複製網址進去看(你的網址會跟我的不同,取決於你之前下 `heroku create` 指令時輸入的網站名稱)。 ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixnZmC7ickUcyXxmw0QLPOKrbJ3DnkfEjt5R8bK2yArxyhnHlsZhgBL3eNC5An0l4J3x7wPsP8IKtevKR9dG-7c7XeIUUTbBWkavVNsEsXj9Ku5A099RrfUfZfmurJX463Kw3DBh7sYlA/s1600/9.jpg) Heroku說:「找不到網頁。」 這是因為在我們本機的首頁,其實是不在專案資料夾裡面的,記得一開始修改網頁([第九天:作一個最簡單的 Rails 網站](https://ithelp.ithome.com.tw/articles/10194359))時,我們是去哪改嗎?是在 `C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/railties-5.1.4/lib/rails/templates/rails/welcome/index.html.erb`,而這個檔案並不是在專案資料夾下,所以遠端伺服器沒有這個檔案也是很合邏輯的。 事實上,只有在 `config/routes.rb` 檔案裏面有寫到的那些路徑才是我們應該測的路徑,所以我們應該連到這裡:[https://people-all-love-kamigo.herokuapp.com/kamigo/eat](https://people-all-love-kamigo.herokuapp.com/kamigo/eat)。 ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaenErZrdsI21jtkv98KRqSFI9KfemS3ixGIHVKNz28z1yVU-Do-prtjZDToBdzaODgl5cA3tTAZrTXO5EMm0xgfzRLt_MCI1V4AsQ0l57EuqycTMDnCpFfegMDcdekKT8zl10dsjL06I/s1600/10.jpg) 吃土啦~ # 總結 程式碼除錯的流程大致上為: - 閱讀錯誤訊息 - 修改程式碼 - 測試網站,若失敗則回到第一步 - 發布網站 工程師的日常就是除了一個錯之後看到的不是正常,而是看到下一個錯誤訊息。 要有耐心。

沒有留言: