Gitでローカルのブランチをコピーする方法
先日、GitでローカルのブランチAをコピーして同内容のブランチBを作る方法がないじゃん!とあれこれ悩んだので、このことをすっかり忘れて今後悩む時が来た時のために忘備録を残しておきます。
TL;DR
コピーしたいブランチから git checkout -b
でブランチを作成する。
以下全てが余談
なぜ、いつもやっていることなのに変に難しく考えてしまってこんな簡単なことに気づかなかったんだという気持ちしかないですね。よく考えなくても、ブランチを作成した直後って派生元のブランチと全く同じ状態だから、言うなればそれがコピーじゃん!
当初は変に難しく「 -m
でブランチの名前を変更することはできるけど、ブランチをコピーする方法はないな。リモートリポジトリを経由するしか方法はないか……」と考えてしまって
- ローカルのブランチAをリモートにpushする
git push origin branchA
- ローカルのブランチAの名前を変更する
git branch -m branchA branchB
- リモートのブランチAをローカルでcheckoutする
git checkout branchA
上記の手順でブランチAをコピーしてブランチBを作るしかないかと思っていたけど、全然そんなことはなかった!ただ単にブランチAから git checkout -b
するだけでよかった!
結局、Twitterでボソッと呟いた時にフォロワーからもらった助言で気づけたので、やはり悩みは外に出してみた方がいいなと思いました。
Heroku+RailsでLine botを作る 第10回 ローカル開発環境での動作確認
前回までのあらすじ
第1回: http://shifumin.hatenablog.com/entry/2018/04/20/000500
第2回: http://shifumin.hatenablog.com/entry/2018/04/22/002000
第3回: http://shifumin.hatenablog.com/entry/2018/04/23/000500
第4回: http://shifumin.hatenablog.com/entry/2018/04/24/000500
第5回: http://shifumin.hatenablog.com/entry/2018/04/25/000500
第6回: http://shifumin.hatenablog.com/entry/2018/04/26/000500
第7回: http://shifumin.hatenablog.com/entry/2018/04/27/000500
第8回: http://shifumin.hatenablog.com/entry/2018/04/29/000500
第9回:
shifumin.hatenablog.com
公式サンプルコードのオウム返しbotをRailsへ実装(移植)しました。
またそのRailsアプリをHerokuへとデプロイし動作することを確認しました(第一部完)
今回はローカル開発環境での動作確認をやっていきたいと思います。
ngrok
ローカル開発環境での動作確認はngrokというツールを使います。
このツールを使うとローカル開発環境で動かしているサーバに対してパブリックなURLを割り当てることができます。
詳しくは下記をご参照ください。
LINE bot開発だと、そのURLをbotのチャンネル設定の「Webhook URL」に設定することによっていちいちHerokuにデプロイしなくても修正したコードの動作確認を行えるようになります。
便利ですね。
Homebrew-Cask
ngrokは公式の通りにインストールしてもいいのですが、面倒なのでHomebrew-Caskを使ってインストールしましょう。
Homebrew-Caskについては詳しくは下記をご参照ください(投げ)
簡単にいうと、macOSアプリケーションについてのHomebrewです。
参考: Homebrew-Cask
Homebrew-Caskを利用するためにHomebrewでtapします。
brew tap caskroom/cask
これでHomebrew-Caskを利用できるようになったのでngrokをインストールします。
brew cask install ngrok
direnv
前回の記事でRailsアプリを動かすために LINE_CHANNEL_SECRET
と LINE_CHANNEL_TOKEN
の環境変数をHerokuにセットしました。
同様に、ローカル開発環境でも動かすために同じ環境変数をセットする必要があります。
ローカル開発環境の環境変数のセットには direnv を使いましょう。
direnvについては詳しくは下記をご参照ください。
「Rails 環境変数」の文脈だとdotenvが有名な気がしますが、僕はdirenvの方が好きなのでこの連載ではdirenvを使います。
direnvの方が好きな理由は、下記のリンク先の記事にもありますが、dotenvだとアプリ内に明示的にdotenvのロードを記述する必要があるからです。
direnvはそれをする必要がありません(最初にシェルに設定を書く必要がありますが)
参考: DotenvではなくDirenvを使う | SOTA
それではHomebrewでdirenvをインストールしましょう。
brew install direnv
次にシェルに設定を記述します。
下記はシェルがbashの場合です。
他のシェルをお使いの方はよしなにやってください。
echo 'eval "$(direnv hook bash)"' >> ~/.bash_profile
初期設定が完了したので環境変数を設定していきます。
公式的には direnv edit
ですが、各種エディタでプロジェクトディレクトリのルートに .envrc
を作成すれば大丈夫なはずです。
direnv edit . # path/to/your-project/.envrc をエディタで作成/編集する
必要な環境変数は LINE_CHANNEL_SECRET
と LINE_CHANNEL_TOKEN
の2つなので、 .envrc
には下記の2行を書きます。
export LINE_CHANNEL_SECRET=<your_line_channel_secret> export LINE_CHANNEL_TOKEN=<your_channel_token>
あとはdirenvが自動で環境変数を設定してくれるはずですが、読み込まれていなかったりエラーが発生した場合は direnv allow
すればいいようです。
dieenv allow
試しにそれぞれの環境変数が設定されていることを確認してみましょう。
echo $LINE_CHANNEL_SECRET <設定したLINE_CHANNEL_SECRETが出力される>
echo $LINE_CHANNEL_TOKEN <設定したLINE_CHANNEL_TOKENが出力される>
ちゃんと環境変数が設定されているようです。
ローカル開発環境での動作確認
ここまででローカル開発環境で動作確認を行う準備が整いました。
なので、実際に動作確認を行なっていきましょう。
PostgreSQLサーバは起動しているものとします。
起動していない場合は下記のコマンドでPostgreSQLサーバを起動させます。
brew services start postgresql # 停止コマンドは brew services stop postgresql
続いて、Railsサーバを起動させます。
bin/rails s # あるいは bundle exec rails s
Railsサーバを起動させた状態でターミナルの別ウィンドウを開くなどして別のコマンドライン上でngrokを起動させます。
ngrok http 3000 # 停止は Ctrl + C
表示が切り替わり、例えば下記のような出力となるはずです。
ngrok by @inconshreveable Session Status online Session Expires 7 hours, 59 minutes Version 2.2.8 Region United States (us) Web Interface http://127.0.0.1:4040 Forwarding http://cb413e80.ngrok.io -> localhost:3000 Forwarding https://cb413e80.ngrok.io -> localhost:3000 Connections ttl opn rt1 rt5 p50 p90 0 0 0.00 0.00 0.00 0.00
重要なのは、 Forwarding の2つ目の値で、これが意味するところは、
「ローカルでRailsサーバが動いている localhost:3000
を https://cb413e80.ngrok.io
というパブリックなURLにポートフォワーディングしている」
となります。
パブリックURLなので、自分のMac以外からも、つまりLINE Messaging APIからも自分のMacで動いているRailsサーバにアクセスさせることができます。
というわけで、このURLをLINE botの「Webhook URL」に設定しましょう。
これで、 rails s
を起動しているかつ ngrok http 3000
を起動している状態だとローカル開発環境から直でLINE botの動作を確認することができます。
例えば、コードを修正してbotの動作を変更させた時に、いちいちHerokuにデプロイすることなく動作を確認することができます。
楽でいいですね。
ちなみ、ngrokの起動を止めるとパブリックURLへのフォワーディングも止まります。
また、割り当てられるパブリックURLも起動のたびに異なるものとなります(= ngrokの起動のたびにWebhook URLの設定の変更は必要)
終わりに
今回はローカル環境での動作確認をやっていきました。
次回は今回の続きでローカル環境でのデバッグをやっていきましょう。
参考
ngrok - secure introspectable tunnels to localhost
https://ngrok.com/
ngrokを使用してローカル環境を外部に公開する - Qiita
https://qiita.com/kitaro729/items/44214f9f81d3ebda58bd
Homebrew-Cask
https://caskroom.github.io/
direnv/direnv: Unclutter your .profile
https://github.com/direnv/direnv
direnvを使おう - Qiita
https://qiita.com/kompiro/items/5fc46089247a56243a62
DotenvではなくDirenvを使う | SOTA
https://deeeet.com/writing/2014/05/06/direnv/
Heroku+RailsでLine botを作る 第9回 Herokuへのデプロイ
前回までのあらすじ
第1回: http://shifumin.hatenablog.com/entry/2018/04/20/000500
第2回: http://shifumin.hatenablog.com/entry/2018/04/22/002000
第3回: http://shifumin.hatenablog.com/entry/2018/04/23/000500
第4回: http://shifumin.hatenablog.com/entry/2018/04/24/000500
第5回: http://shifumin.hatenablog.com/entry/2018/04/25/000500
第6回: http://shifumin.hatenablog.com/entry/2018/04/26/000500
第7回: http://shifumin.hatenablog.com/entry/2018/04/27/000500
第8回:
shifumin.hatenablog.com
LINEデベロッパー登録を終え、必要なAPIキーである「Channel Secret」と「アクセストークン」を手に入れました。
また、Railsアプリを作成し、動作することを確認しました。
そして、Railsアプリに公式サンプルコードのオウム返しbotを移植しました。
今回は作成したbotをHerokuにデプロイしていきたいと思います。
git commit
前回でオウム返しbotの実装(移植)が完了しましたので、ここらで git commit
をしておきましょう。
git add . git commit -m "implement echo bot"
git log --stat commit 8fa85e05cdc2617e31e07b3260ca06417ca9862e (HEAD -> master) Author: shifumin <hogehogehogehoge@mail.com> Date: Sun Apr 29 21:58:24 2018 +0900 implement echo bot app/controllers/webhook_controller.rb | 40 ++++++++++++++++++++++++++++++++++++++++ config/routes.rb | 2 +- 2 files changed, 41 insertions(+), 1 deletion(-)
前回の変更内容ですね。
ちなみに、GitHubにリポジトリを作成し、ここまでのコードを上げておきました(随時更新予定)
Herokuへのデプロイ
それではHerokuへのデプロイを進めていきましょう。
なお、Herokuのアカウントを作成していることは前提とします。
今回のHerokuアプリケーションの作成は全体的に下記の公式ドキュメント2つを参考にしました。
Herokuでサンプルボットを作成する
Getting Started with Rails 5.x on Heroku | Heroku Dev Center
Heroku CLIのインストール
最初に、コマンドライン上でHerokuを操作するためにHeroku CLIをインストールしましょう。
例のごとくHomebrewを使ってインストールします。
# brew install heroku/brew/heroku でも可
brew install heroku
Herokuアプリの作成
Heroku CLIをインストールできたら、コマンドライン上でHerokuアプリの作成を進めていきます。
まずはHerokuにログインします。
heroku login (登録したEmailとPasswordの入力)
次にアプリを作成します。
heroku create
でherokuが名前を勝手につけてアプリを作成してくれますが、今回は heroku create <app_name>
でアプリ名を付けて作成しましょう。
heroku create <your-app-name>
Creating ⬢ <your-app-name>... done https://<your-app-name>.herokuapp.com/ | https://git.heroku.com/<your-app-name>.git
Herokuの各種設定
アプリのデータベースにPostgreSQLを利用しているので、それ用のHerokuのアドオンを追加します。
heroku addons:create heroku-postgresql:hobby-dev
また、LINE Messaging APIの利用には下記の環境変数が必要なので登録します。
値は、この連載の第1回で確認した Channel Secret と アクセストークン となります。
heroku config:set LINE_CHANNEL_SECRET=<your_line_channel_secret> heroku config:set LINE_CHANNEL_TOKEN=<your_channel_token>
Herokuへのpush
アプリの作成と各種設定が完了したので、ようやくHerokuへpushします。
git push heroku master
しばらく時間がかかります。
Herokuへのpushが完了したら、Herokuアプリの情報を確認してみましょう。
確認は heroku info
で行います。
heroku info
=== amurosan-bot Addons: heroku-postgresql:hobby-dev Auto Cert Mgmt: false Dynos: web: 1 Git URL: https://git.heroku.com/<your-app-name>.git Owner: your-mail-address@mail.com Region: us Repo Size: 36 KB Slug Size: 47 MB Stack: heroku-16 Web URL: https://<your-app-name>.herokuapp.com/
一番下の Web URL がbotが動作しているURLとなります。
こちらのURLをLINE DevelopersのChannel設定で登録しましょう。
例えば以下のような設定となります。
LINE botの完成
これでようやく連載第9回にして、オウム返しを行うだけの簡単なLINE botですが、動くものを作成することができました。
めでたいですね。
諸事情によりQRコードを消しました><(ツイートからも読み取れないことを確認済)
動作は前回の記事で貼りましたが、現在は本当にオウム返ししか行いません(行えません)。
俺たちの戦いはこれからだ!
しふみん先生の次回作にご期待ください。
次回以降でこのbotの機能改善をしていこうと思います。
終わりに
今回は作成したLINE botをHerokuへとデプロイしました。
次回はローカル環境での動作確認とデバッグについて行なっていきましょう。
参考
shifumin/sample-bot-for-line-bot-api: Sample bot using Line :: Bot :: API implemented in Rails on Heroku.
https://github.com/shifumin/sample-bot-for-line-bot-api
Herokuでサンプルボットを作成する - LINE Developers
https://developers.line.me/ja/docs/messaging-api/building-sample-bot-with-heroku/
Getting Started with Rails 5.x on Heroku | Heroku Dev Center
https://devcenter.heroku.com/articles/getting-started-with-rails5
Heroku CLI | Heroku Dev Center
https://devcenter.heroku.com/articles/heroku-cli
Heroku Postgres | Heroku Dev Center
https://devcenter.heroku.com/articles/heroku-postgresql
Configuration and Config Vars | Heroku Dev Center
https://devcenter.heroku.com/articles/config-vars
Heroku+RailsでLine botを作る 第8回 LINE botの雛形の作成
前回までのあらすじ
第1回: http://shifumin.hatenablog.com/entry/2018/04/20/000500
第2回: http://shifumin.hatenablog.com/entry/2018/04/22/002000
第3回: http://shifumin.hatenablog.com/entry/2018/04/23/000500
第4回: http://shifumin.hatenablog.com/entry/2018/04/24/000500
第5回: http://shifumin.hatenablog.com/entry/2018/04/25/000500
第6回: http://shifumin.hatenablog.com/entry/2018/04/26/000500
第7回:
shifumin.hatenablog.com
LINEデベロッパー登録を終え、必要なAPIキーである「Channel Secret」と「アクセストークン」を手に入れました。
また、Railsアプリを作成し、動作することを確認しました。
そして、記念すべき(?)はじめてのgit commitを行いました。
今回はLINE botの雛形を作成していきたいと思います。
line-bot-sdk-ruby
上記がLINE bot開発に使うRuby用のLINE Messaging APIのSDK(Software Development Kit)となります。
このリポジトリのREADMEのSynopsisにサンプルコードが載せられています。
Railsと同じくRubyのWAF(Web Application Framework)であるSinatraのコードです。
オウム返しを行う実装となっているようですね。
GitHub - line/line-bot-sdk-ruby: Line: :API - SDK of the LINE Messaging API for Ruby.
このサンプルコードをRailsで動くように移植します。
Railsへの移植では下記も大いに参考させていただきました。
Railsへの移植
追加修正・新規作成したファイルは下記の2つです。
- config/routes.rb (変更)
- app/controllers/webhook_controller.rb (新規作成)
概要としては、LINE Messaging APIから受け取ったリクエストについてのルーティングを設定して(config/routes.rb)、その際に行うアクションを追加しています(app/controllers/webhook_controller.rb)。
Railsへ移植したコードと一言解説を下記に載せます。
config/routes.rb
Rails.application.routes.draw do post '/callback' => 'webhook#callback' end
<HerokuアプリのURL>/callback
にPOSTメソッドのリクエストを受け取った場合にWebbookコントローラのcallbackアクションに割り当てるようにしています。
app/controllers/webhook_controller.rb
require 'line/bot' class WebhookController < ApplicationController protect_from_forgery except: :callback def callback body = request.body.read signature = request.env['HTTP_X_LINE_SIGNATURE'] unless client.validate_signature(body, signature) error 400 do 'Bad Request' end end events = client.parse_events_from(body) events.each { |event| case event when Line::Bot::Event::Message case event.type when Line::Bot::Event::MessageType::Text message = { type: 'text', text: event.message['text'] } client.reply_message(event['replyToken'], message) end end } head :ok end private def client @client ||= Line::Bot::Client.new { |config| config.channel_secret = ENV["LINE_CHANNEL_SECRET"] config.channel_token = ENV["LINE_CHANNEL_TOKEN"] } end end
APIでトークンを使って認証するため、下記のコードでCSRF対策を無効にしています。
callbackメソッドを除く -> callbackメソッドでは無効。
というか、無効にしないとローカル開発環境で動作確認する時にエラーが出る気がします。
protect_from_forgery except: :callback
参考:
qiita.com
それ以外はほぼコピペですね。
一応clientメソッドをprivateメソッドに移した以外は。
def client @client ||= Line::Bot::Client.new { |config| config.channel_secret = ENV["LINE_CHANNEL_SECRET"] config.channel_token = ENV["LINE_CHANNEL_TOKEN"] } end
このclientメソッドの中で「Channel Secret」と「アクセストークン」を設定しています(ようやく第1回の伏線(?)を回収できました)
ですので、Herokuで動かす場合はHerokuに、ローカルで動かす場合はローカルに下記の環境変数を設定する必要があります。
- LINE_CHANNEL_SECRET
- LINE_CHANNEL_TOKEN
環境変数の設定は必要になった際にやっていきましょう。
終わりに
今回はLINE botの雛形として公式サンプルコードのオウム返しbotをRailsへと移植しました。
動き的には下記画像のようにオウム返しを行うbotとなっています。
次回は作成したこのbotをHerokuにデプロイしていきましょう。
参考
line/line-bot-sdk-ruby: Line: :API - SDK of the LINE Messaging API for Ruby.
https://github.com/line/line-bot-sdk-ruby
今更ながらRails5+line-bot-sdk-ruby+HerokuでLineBot作成してみたら、色々詰まったのでまとめました。 - Qiita
https://qiita.com/y428_b/items/d2b1a376f5900aea30dc
Rails4のCSRF対策で「Can't verify CSRF token authenticity」エラー - Qiita
https://qiita.com/chobi9999/items/2b59fdaf3dd8f2ed9268
Heroku+RailsでLine botを作る 第7回 はじめてのgit commit
前回までのあらすじ
第1回: http://shifumin.hatenablog.com/entry/2018/04/20/000500
第2回: http://shifumin.hatenablog.com/entry/2018/04/22/002000
第3回: http://shifumin.hatenablog.com/entry/2018/04/23/000500
第4回: http://shifumin.hatenablog.com/entry/2018/04/24/000500
第5回: http://shifumin.hatenablog.com/entry/2018/04/25/000500
第6回:
shifumin.hatenablog.com
LINEデベロッパー登録を終え、必要なAPIキーである「Channel Secret」と「アクセストークン」を手に入れました。
また、Railsアプリが動作する環境を整えました。
そして、Railsアプリを作成し、動作することを確認しました。
今回はアプリが動作することも確認できたことですし、現在の内容でgitでcommitしていきましょう。
(LINE botの雛形を作成するところまで進められず……)
git commit
gibo
git commit
する前の準備として、.gitignoreをいい感じに整えるためにまずgiboを導入します。
.gitignoreというのはその名前の通り、gitの管理上無視する(ignore)するファイル(orディレクトリ)を指定するためのファイルです。
例えば、ログファイルや一時ファイルはバージョン管理をする意味がないですし、パスワード等の秘匿情報はバージョン管理すること事態が危険です。
そういったファイルを.gitignoreで指定します。
giboについては下記をご参照ください(定期投げ)
それでは、Homebrewでgiboをインストールしましょう。
brew install gibo
インストールが完了したら、下記のgiboコマンドで.gitignoreを更新します。
gibo rails
でRails用の.gitignoreの内容を出力し、リダイレクト演算子 >|
で.gitignoreに渡し上書きしています。
gibo rails >| .gitignore
.gitignoreの内容は下記のリンク先のRails用のものと同内容になったはすです。
git commit
.gitignoreをRails用のものに更新できたら、 git commit
していきましょう。
コマンド群として下記のようになります。
git add
コマンドは新規ファイルを、あるいは内容に変更があったファイルをgitの管理下に追加するコマンドです(苦しい説明)
.
オプションを付けるとカレントディレクリの全ファイル(ディレクトリ)を対象に取ります。
コミットは git commit
コマンドで行います。
-m
オプションはコミットメッセージを付け加えるためのものです。
今回はRailsアプリを作成したということで create app
としておきましょう。
git add . git commit -m "create app"
gitは内容がドチャクソあるので詳しくは下記を合わせてご参照ください(投げ)
また、 git log
コマンドを使うと過去のコミット情報を見ることができます。
例えば、 --stat
オプションを付けると変更ファイル名とその行数も合わせて表示させることができます。
git log --stat
上記の git log --stat
コマンドで確認すると下記のような出力になるはずです。
誰がいつコミットしたか、コミットメッセージ、変更のあったファイルとその行数等が分かりますね。
commit a75fe4bdf4dd9e5bfd866ad3bd4af32cda787c5d (HEAD -> master) Author: shifumin <shifumin_no_honyarara@mail_adress.com> Date: Thu Apr 26 22:28:54 2018 +0900 create app .gitignore | 53 +++++++++++++++++++ .ruby-version | 1 + Gemfile | 57 ++++++++++++++++++++ Gemfile.lock | 193 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 24 +++++++++ Rakefile | 6 +++ app/assets/config/manifest.js | 3 ++ app/assets/images/.keep | 0 app/assets/javascripts/application.js | 16 ++++++ app/assets/javascripts/cable.js | 13 +++++ app/assets/javascripts/channels/.keep | 0 app/assets/stylesheets/application.css | 15 ++++++ app/channels/application_cable/channel.rb | 4 ++ app/channels/application_cable/connection.rb | 4 ++ app/controllers/application_controller.rb | 2 + app/controllers/concerns/.keep | 0 app/helpers/application_helper.rb | 2 + app/jobs/application_job.rb | 2 + app/mailers/application_mailer.rb | 4 ++ app/models/application_record.rb | 3 ++ app/models/concerns/.keep | 0 app/views/layouts/application.html.erb | 15 ++++++ app/views/layouts/mailer.html.erb | 13 +++++ app/views/layouts/mailer.text.erb | 1 + bin/bundle | 3 ++ bin/rails | 4 ++ bin/rake | 4 ++ (以下略)
git log
もオプションが大量にあるためその他オプション等はググるか下記等をご参照ください。
終わりに
今回はアプリをgitで管理するために記念すべきはじめての git commit
を行いました。
次回こそはLINE botの雛形を作成していきましょう。
参考
simonwhitaker/gibo: A shell script for easily accessing gitignore boilerplates
https://github.com/simonwhitaker/gibo
気付いたら.gitignoreはgiboで自動生成する時代になっていた - Qiita
https://qiita.com/tmknom/items/c4bcebe17d25381fa45d
gitignore/Rails.gitignore at master · github/gitignore
https://github.com/github/gitignore/blob/master/Rails.gitignore
【Git】基本コマンド - Qiita
https://qiita.com/konweb/items/621722f67fdd8f86a017
Git初心者に捧ぐ!Gitの「これなんで?」を解説します。 | KRAY Inc
http://kray.jp/blog/git-why-explanation/
git log よく使うオプションまとめ - Qiita
https://qiita.com/take4s5i/items/15d8648405f4e7ea3039
Heroku+RailsでLine botを作る 第6回 Railsアプリの作成
前回までのあらすじ
第1回: http://shifumin.hatenablog.com/entry/2018/04/20/000500
第2回: http://shifumin.hatenablog.com/entry/2018/04/22/002000
第3回: http://shifumin.hatenablog.com/entry/2018/04/23/000500
第4回: http://shifumin.hatenablog.com/entry/2018/04/24/000500
第5回:
shifumin.hatenablog.com
LINEデベロッパー登録を終え、必要なAPIキーである「Channel Secret」と「アクセストークン」を手に入れました。
また、必要なパッケージの導入し、Rubyをインストールしました。
そして、プロジェクトディレクトリをバージョン管理できるようにGitリポジトリ化しました。
さらに、Bunblerを導入してrails gemをインストールしました。
今回は、(本当に!やっと!)Railsアプリを作成していきたいと思います。
rails new
ようやくのようやくで、Railsアプリの作成コマンドの実行までたどり着きました!
下記の rails new
コマンドでRailsアプリを作成します。
コマンド実行後にOverwriteするかを聞かれたら全て y
で問題ありません。
bundle exec rails new . --database=postgresql --skip-bundle --skip-test
rails new
の各オプションの詳細は下記をご参照ください(投げ)
railsコマンド(rails) - - Railsドキュメント
それぞれのオプション他を軽く一言説明をしますと、
bundle exec
- Bundlerでインストールしたカレントディレクリのgemのrailsコマンドを使用する
.
- カレントディレクリにRailsアプリを作成する
--database=postgresql
- データベースはPostgreSQLを使用する
--skip-bundle
- bundle installを行わない -> 後で手動で行うため
--skip-test
- test::unitを組み込まない -> この連載では(今のところは)テストを省略します
となります。
加えて、1点だけ補足説明しておきます。
前回の第5回の記事で bundle instlal
したと思います。
あの bundle install
はrails gemをインストールするためのものです。
そして、実はもう一度 bundle install
する必要があります。
次の bundle install
はRailsアプリを動かすために必要な他のgemをインストールするためのものになります。
ls -la
で確認すると下記のようにRailsアプリの各ファイルが作成されていることと思います。
ls -la total 32 drwxr-xr-x 22 shifumin staff 704 4 24 23:33 . drwxr-xr-x 11 shifumin staff 352 4 22 11:51 .. drwxr-xr-x 3 shifumin staff 96 4 24 22:09 .bundle drwxr-xr-x 9 shifumin staff 288 4 24 23:33 .git -rw-r--r-- 1 shifumin staff 604 4 24 23:33 .gitignore -rw-r--r-- 1 shifumin staff 5 4 24 23:33 .ruby-version -rw-r--r-- 1 shifumin staff 1969 4 24 23:33 Gemfile -rw-r--r-- 1 shifumin staff 2911 4 24 22:11 Gemfile.lock -rw-r--r-- 1 shifumin staff 374 4 24 23:02 README.md -rw-r--r-- 1 shifumin staff 227 4 24 23:02 Rakefile drwxr-xr-x 10 shifumin staff 320 4 24 23:33 app drwxr-xr-x 8 shifumin staff 256 4 24 23:33 bin drwxr-xr-x 16 shifumin staff 512 4 24 23:33 config -rw-r--r-- 1 shifumin staff 130 4 24 23:33 config.ru drwxr-xr-x 3 shifumin staff 96 4 24 23:33 db drwxr-xr-x 4 shifumin staff 128 4 24 23:33 lib drwxr-xr-x 3 shifumin staff 96 4 24 23:33 log -rw-r--r-- 1 shifumin staff 66 4 24 23:33 package.json drwxr-xr-x 9 shifumin staff 288 4 24 23:33 public drwxr-xr-x 3 shifumin staff 96 4 24 23:33 storage drwxr-xr-x 5 shifumin staff 160 4 24 23:33 tmp drwxr-xr-x 4 shifumin staff 128 4 24 23:33 vendor
しかし、まだRailsアプリは動きません。
なぜならRailsアプリを動かすために必要な各gemがインストールされていないためです。
中身は載せませんが、 rails new
前は gem "rails"
の行のみでしたGemfileにRailsアプリを動かすために必要な様々なgemが追加されていると思います。
これらのgemをインストールしていく必要があります。
line-bot-sdk-ruby gemの追加
追加されたgemをインストールする前にLINE bot開発に必要なgemを追加します。
下記の line-bot-api
です。
Gemfileの一番最後に gem 'line-bot-api'
の行を追加しましょう。
line-bot-apiの機能や使い方については実装時に追々見ていくことにします。
(前略) # Windows does not include zoneinfo files, so bundle the tzinfo-data gem gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] gem 'line-bot-api'
余談ですが、gem名の記述が bundle init
で作成したGemfileは ""
で括られており、 rails new
で上書き作成したGemfileは ''
で括られていることを今回初めて知りました。
不思議ですね。
bundle install
2回目の bundle install
です。
初回時に --path vendor/bundle
オプションをつけていた場合、2回目以降はつけなくても ./vendor/bundle
にインストールされます。
Bundlerの設定ファイルである .bundle/config
の中身を見てみると、下記のように BUNDLE_PATH
の設定があると思います。
これのおかげで、2回目以降は --path
オプションが必要ないというわけです。
--- BUNDLE_PATH: "vendor/bundle"
それでは追加されたgemを bundle install
でインストールしましょう(今回も数分ほどかかるはずです)
bundle install
これで、ようやくRailsアプリを起動させる準備が整いました(大嘘)
rails s
Railsアプリ(のサーバ)を起動させるには rails s
コマンドを利用します。
bundle exec rails s # bundle exec rails server でも bin/rails s でも bin/rails server でも可
下記のような出力が出るはずです。
=> Booting Puma => Rails 5.2.0 application starting in development => Run `rails server -h` for more startup options Puma starting in single mode... * Version 3.11.4 (ruby 2.5.1-p57), codename: Love Song * Min threads: 5, max threads: 5 * Environment: development * Listening on Use Ctrl-C to stop
Railsアプリが起動しましたね。
ちなみに、先に書いておくとアプリの起動を止める方法は最後の行に書いてあるように Ctrlボタン + C 同時押しです。
Railsアプリを起動させた状態でブラウザで確認してみましょう。
ローカル環境(Mac)で rails s
でRailsアプリを起動させた場合は http://localhost:3000/
でアプリを確認できます。
それではブラウザで確認してみます。
Oh……
PG::ConnectionBad
というエラーが出ていますね。
could not connect to server
と怒られました。
そうです、データベースサーバのPostgreSQL(PG)の準備を何もしていないからです。
PostgreSQLのインストール
PostgreSQLについては下記をご参照ください(定期投げ)
(公式サイトがメンテ中なので後でここに貼ります)
インストール方法その他の詳細についてはこちらをご参照ください。
Homebrewでインストールし、データベースクラスタをRuby(Rails)のデフォルトエンコーディングである UTF-8
で初期化します。
brew install postgresql initdb /usr/local/var/postgres -E utf8
初期化が完了したら、下記のコマンドでPostgreSQLサーバを起動させます。
brew services start postgresql # 停止コマンドは brew services stop postgresql
それでは、PostgreSQLサーバも起動させたことですし、再びRailsアプリを起動させてブラウザで確かめてみましょう。
bundle exec rails s
Oh……(2回目)
今度は ActiveRecord::NoDatabaseError
というエラーが出ました。
FATAL: database "line_bot_development" does not exist
とデータベースがないって怒られていますね。
そうです(2回目)、DBサーバは起動させましたが、肝心のデータベースをまだ作成していません。
データベースの作成(初期化)はrailsコマンドが良きに計らってやってくれます。
下記の rails db:create
コマンドです。
bundle exec rails db:create
Created database 'line_bot_development' Created database 'line_bot_test'
データベースが作られました(開発環境用DBとテスト用DB)
これで本当の本当の本当にRailsアプリを起動させる準備が整いました(真)
rails s再び
それでは、 rails s
でRailsアプリを起動させてブラウザで http://localhost:3000/
を確認しましょう。
bundle exec rails s
無事にRailsアプリが起動できましたね。
お疲れ様でした(僕が)(今回の記事は長かった……)
終わりに
今回はRaisアプリの作成を行い、起動させ、確認しました。
次回はこのRails上にbotの実装を進めていきましょう。
ようやく本編がスタートする気がします。
参考
railsコマンド(rails) - - Railsドキュメント
http://railsdoc.com/rails
line/line-bot-sdk-ruby: Line: :API - SDK of the LINE Messaging API for Ruby.
https://github.com/line/line-bot-sdk-ruby
MacにPostgreSQL9.6.3をインストールしてみた - Qiita
https://qiita.com/uhooi/items/cd6256a72c6a03621c09
Heroku+RailsでLine botを作る 第5回 Bundlerの導入
前回までのあらすじ
第1回: http://shifumin.hatenablog.com/entry/2018/04/20/000500
第2回: http://shifumin.hatenablog.com/entry/2018/04/22/002000
第3回: http://shifumin.hatenablog.com/entry/2018/04/23/000500
第4回:
shifumin.hatenablog.com
LINEデベロッパー登録を終え、必要なAPIキーである「Channel Secret」と「アクセストークン」を手に入れました。
また、必要なパッケージの導入し、Rubyをインストールしました。
そして、プロジェクトディレクトリをバージョン管理できるようにGitリポジトリ化しました。
今回は、Bundlerの導入を行っていきたいと思います(また、Railsアプリの作成まで辿り着けなかったよ……)
Bundlerとは
Rails(Ruby)アプリはBunlderというgem管理システムを導入することが多いです。
Ruby用のライブラリ(便利ツール的なもの)は「gem」という形で提供されています。
例えば、Railsもgemの形で提供されています。
このgemをGemfile(とGemfile.lock)というファイルで管理するためのシステムがBundlerです。
インストールするgemの種類・バージョン管理しているGemfile(Gemfile.lock)さえあれば同じgemの環境を整えることが容易であるため、複数人や複数の環境で開発を行う場合に役立ちます。
詳しくは下記を見てください(いつも通りの投げ)
Bundler: The best way to manage a Ruby application's gems qiita.com
Bundlerのインストール
そういうわけで、Bundlerをインストールしていきます。
念のため、gem自体をアップデートしてからBundlerをインストールします。
gem update --system
gem install bundler
bundle --version # bundle -v でも可 Bundler version 1.16.1
Bundlerがインストールされました。
Gemfileの準備
続けてBundlerで使用するGemfileの準備に進みます。
Gemfileとはインストールするgemの種類やバージョンを記載するファイルです。
まず、 bundle init
でGemfileを作成します。
bundle init Writing new Gemfile to /Users/shifumin/project/line_bot/Gemfile
Gemfileが作成されましたので開いて内容を確認します。
vim Gemfile # お使いのエディタでGemfileを開いてください(以下略)
# frozen_string_literal: true source "https://rubygems.org" git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } # gem "rails"
上記のようなGemfileになっているはずです。
まず、Railsアプリを実行するRubyのバージョンを明示するために ruby "2.5.1"
の行を追加しましょう(バージョンは適宜ご変更ください)
次に、Railsをインストールするために gem "rails"
のコメントアウトを外しましょう。
また、一応Railsのバージョンを固定しておきましょう。
バージョンを固定する理由は、バージョンを固定しないとBundlerでgemをインストールする時期によってインストールされるgemのバージョンが左右されてしまうためです(やや曖昧な説明。許して)
バージョンが異なるとgemの挙動が変わって意図しない挙動をする場合があります(バグの温床になる)
例えば、現在(2018年4月24日)はバージョンを固定しない場合はRailsは5.2.0がインストールされますが、もう少し先の未来にはそれが5.2.1, 5.2.2, あるいは5.3.0になったりするはずです。
それでは、下のようにGemfileを修正しましょう。
# frozen_string_literal: true ruby "2.5.1" source "https://rubygems.org" git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } gem "rails", "5.2.0"
rails gemのインストール
下記の bundle install
コマンドでrails gemをインストールします。
bundle install --path vendor/bundle
--path vendor/bundle
のオプションを付けています。
pathを指定する理由は、pathを指定しないとシステム配下にgemがインストールされてしまうためです。
今回インストールするgemはこのbot作成のためだけにインストールするので、プロジェクトディレクトリ配下にインストールされるようにpathを指定します。
詳しくは下記の公式ドキュメントの真ん中らへんをご参照ください。
Bundler: The best way to manage a Ruby application's gems
初回のインストールには数分かかるはずです。
Fetching gem metadata from https://rubygems.org/.......... Fetching gem metadata from https://rubygems.org/. Resolving dependencies... Fetching rake 12.3.1 Fetching concurrent-ruby 1.0.5 (中略) Fetching rails 5.2.0 Installing rails 5.2.0 Bundle complete! 1 Gemfile dependency, 41 gems now installed. Bundled gems are installed into `./vendor/bundle`
Rails gem(とその依存関係のgem)は ./vendor/bundle/
にインストールされました。
終わりに
今回はBundlerを導入し、rails gemをインストールしました。
次回こそ、本当の本当にRailsアプリの作成を行なっていきましょう(三度目の正直)
この次に実行するコマンドが rails new
であるため次回の記事で大丈夫(?)なはずです。。。
参考
Bundler: The best way to manage a Ruby application's gems
http://bundler.io/
Bundlerの使い方 - Qiita
https://qiita.com/oshou/items/6283c2315dc7dd244aef
bundle install - Bundler: The best way to manage a Ruby application's gems http://bundler.io/v1.16/bundle_install.html