Slide 1

Slide 1 text

出張!Railsウォッチ
 in 銀座Rails#22
 森 雅智 / @morimorihoge 2020/06/12 1
 特集:~CLIプログラムにOptionParserを使う~


Slide 2

Slide 2 text

About Me
 ● 森 雅智: @morimorihoge
 ● BPS株式会社でRailsの受託開発チームをやってたり、週1大学非常勤で Web開発を教えてたりします
 ● Ruby/Rails歴は11年くらい。Web開発は17年くらい
 ● 銀座Ralis #10でActiveRecordでVIEWを使おうという話をしました
 About BPS & TechRacho
 ● Web受託開発や電子書籍製品開発をやっている会社です
 ● TechRachoという自社技術Blogを運営しています
 ○ 3年半ほど前から平日毎日更新してます
 ○ https://techracho.bpsinc.jp/ ● お仕事相談、転職相談、TechRachoへのご意見など気軽にどうぞ
 ○ https://www.bpsinc.jp/ 2


Slide 3

Slide 3 text

Railsウォッチとは?
 技術ブログTechRachoで毎週連載しているRails / Ruby界隈を中 心とした雑多な情報を提供する技術雑談マガジン
 3


Slide 4

Slide 4 text

これまでの出張Railsウォッチのピックアップテーマ
 ● Rails6新機能特集
 ○ 銀座Rails#12: 複数DB対応
 ○ 銀座Rails#13: ActionText、Trix
 ○ 銀座Rails#14: ActionMailbox
 ● Railsアプリケーション開発に関する雑多なテーマ
 ○ 銀座Rails#15: production、development、staging環境について
 ○ 銀座Rails#16: 機能開発の設計レビューについて
 ○ 銀座Rails#17: リソース管理スコープについて
 ● 開発一般な話
 ○ 銀座Rails#19: 開発チームの冗長化について
 ○ 銀座Rails#20: Excelと仲良くしよう
 ○ 銀座Rails#21: 標準仕様を読むためのABNF
 4
 ※過去のスライドはTechRachoにて公開しています。「TechRacho 銀座Rails」あたりで 検索するとヒットしますので興味のある方はどうぞ


Slide 5

Slide 5 text

CLIプログラムにOptionParserを使う
 5


Slide 6

Slide 6 text

RubyでCLIプログラミングするモチベーション
 ● シェルスクリプトの代替としてちょっとしたバッチ処理やツールを作りたい
 ○ 普段慣れた言語で書ける安心感があって良い
 ○ pure rubyで作っておくとRails環境がなくても動かせるため、自由度が 高い
 ● 複雑かつ大量のログ解析など、シェルやワンライナーでは厳しい処理をし たい
 ○ 障害調査の場合などに有用
 ● Ralisの実行コンテキストで動作するスクリプトを作りたい
 ○ rails runner経由で実行すると通常のスクリプト実行の感覚で利用する ことができる


Slide 7

Slide 7 text

RubyでCLIプログラムを書くための基本
 ● 1行目にshebangを書く: #!/usr/bin/env ruby ● chmodで実行権限(x)を付ける: chmod +x #{filename} ○ shebangが設定されていれば拡張子はrbでなくてもOK 
 ● コマンドライン引数はARGV配列に入っているのでそこから取れる
 ● 標準入出力など
 ○ STDIN / STDOUT / STDERRがIOクラスとして取れる(readや each_lineできます)
 7
 ARGV[0]
 ARGV[1]
 ARGV[2]


Slide 8

Slide 8 text

OptionParserとは?
 8
 ● Ruby本体の組み込みライブラリで、コマンドライン引数やオプションをいい 感じに処理してくれる
 ○ require ‘optparse’ すればすぐに使えます
 ● 単純なオプション解釈だけでなく、help表示なども内包しておりあまり頑張ら なくてもCLIコマンドとしていい感じに仕上げることができる


Slide 9

Slide 9 text

基本サンプル(引数なし)
 #onメソッドで先にoptionごとの処 理を定義しておき、最後に#parseメ ソッドにARGVを渡すとoptionに マッチしたブロックが実行される
 9


Slide 10

Slide 10 text

基本サンプル(引数あり)
 #onに引数形式を指定すると、ブロック引 数に文字列として入ってくる。
 []で囲むとオプション引数となる
 10


Slide 11

Slide 11 text

基本サンプル(通常の引数あり)
 ● #parse!を実行することで、ARGVからオプションを取り除くことができる
 ○ 通常の引数との組み合わせが簡単に実装できる
 11
 引数なし
 引数後付け
 引数先付け
 オプション挟み


Slide 12

Slide 12 text

12
 とりあえずこれテンプレート
 --helpしたときの1行目をカスタマイズ可能
 --help用の説明が書ける
 需要があるかは分かりませんがGist 
 https://gist.github.com/morimorihoge/7ae85e62ebd848003d74fcbd2a98fa58 


Slide 13

Slide 13 text

その他知っておくと捗る組み込みライブラリなど
 ● Open3モジュールを使うと任意のコマンドを実行しつつ、標準入出力をRuby で受けて処理することができる
 ○ スクリプト内で別プログラムの実行結果を受け取りたいときに便利 
 ● 任意コマンド実行時はShellwordsモジュールを使うとエスケープが必要な 文字が含まれていても安全に実行できる
 ● ERBも使えるので、出力したいものがHTMLやYAMLなどの形式の場合に は併用すると便利
 ● DATAというFileオブジェクトがあり、ソースコードの__END__以降のデータ にアクセスできる
 ○ 前述のERBテンプレートを1ソースファイルにまとめて書くなどに利用できる 
 ○ ※1ファイルに統合しておくと、別ホストに持って行って利用する場合に便利 
 13


Slide 14

Slide 14 text

RailsエンジニアのためのCLI
 ● rails runner経由でスクリプトファイルを呼び出すと、Railsの実行コンテキストの中で CLIスクリプトを実行できる
 ○ Rake taskは引数の渡し方やenvironment設定に癖があるが、runnerは引数、オプションも含めて通 常のRubyスクリプトのように動いてくれる(OptionParserが使える) 
 14


Slide 15

Slide 15 text

OptionParserとCLIまとめ
 ● Rubyスクリプトで柔軟に引数を処理することができる
 ● Ruby組み込みライブラリのため、ポータビリティの高いツールを作るこ とができる
 ○ Railsやその他追加インストールGemがなくてもここまでできる!というのは強い
 ● Rails runner経由であれば、Rails前提のコードもコマンドライン引数を受 けとって処理することができる
 ○ ただし、Rakeタスクとは別管理になってしまうのは注意
 ○ ※Rakeタスクと違いrake -vでの一覧などができないため、スクリプトの置き場所に は注意
 15


Slide 16

Slide 16 text

次回以降もブラッシュアップしていきます
 感想・リクエストなどあればTwitter
 #ginzarails
 @morimorihoge
 @hachi8833
 までお声かけください
 16