Upgrade to Pro — share decks privately, control downloads, hide ads and more …

20200612_出張_Railsウォッチ_in_銀座Rails_22

 20200612_出張_Railsウォッチ_in_銀座Rails_22

2020/06/12に銀座Rails#22で発表したスライドです。
https://ginza-rails.connpass.com/event/176491/
週刊Railsウォッチ: https://techracho.bpsinc.jp/tag/%e9%80%b1%e5%88%8arails%e3%82%a6%e3%82%a9%e3%83%83%e3%83%81

スライド内で紹介しているサンプルテンプレーコードのGistは以下
https://gist.github.com/morimorihoge/7ae85e62ebd848003d74fcbd2a98fa58

37b01da9150c1e789f35771b06d36890?s=128

Masato Mori

June 12, 2020
Tweet

Transcript

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


  2. 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

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


  4. これまでの出張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」あたりで 検索するとヒットしますので興味のある方はどうぞ

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


  6. RubyでCLIプログラミングするモチベーション
 • シェルスクリプトの代替としてちょっとしたバッチ処理やツールを作りたい
 ◦ 普段慣れた言語で書ける安心感があって良い
 ◦ pure rubyで作っておくとRails環境がなくても動かせるため、自由度が 高い
 •

    複雑かつ大量のログ解析など、シェルやワンライナーでは厳しい処理をし たい
 ◦ 障害調査の場合などに有用
 • Ralisの実行コンテキストで動作するスクリプトを作りたい
 ◦ rails runner経由で実行すると通常のスクリプト実行の感覚で利用する ことができる

  7. 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]

  8. OptionParserとは?
 8
 • Ruby本体の組み込みライブラリで、コマンドライン引数やオプションをいい 感じに処理してくれる
 ◦ require ‘optparse’ すればすぐに使えます
 •

    単純なオプション解釈だけでなく、help表示なども内包しておりあまり頑張ら なくてもCLIコマンドとしていい感じに仕上げることができる

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


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


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


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


  13. その他知っておくと捗る組み込みライブラリなど
 • Open3モジュールを使うと任意のコマンドを実行しつつ、標準入出力をRuby で受けて処理することができる
 ◦ スクリプト内で別プログラムの実行結果を受け取りたいときに便利 
 • 任意コマンド実行時はShellwordsモジュールを使うとエスケープが必要な 文字が含まれていても安全に実行できる


    • ERBも使えるので、出力したいものがHTMLやYAMLなどの形式の場合に は併用すると便利
 • DATAというFileオブジェクトがあり、ソースコードの__END__以降のデータ にアクセスできる
 ◦ 前述のERBテンプレートを1ソースファイルにまとめて書くなどに利用できる 
 ◦ ※1ファイルに統合しておくと、別ホストに持って行って利用する場合に便利 
 13

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


    14

  15. OptionParserとCLIまとめ
 • Rubyスクリプトで柔軟に引数を処理することができる
 • Ruby組み込みライブラリのため、ポータビリティの高いツールを作るこ とができる
 ◦ Railsやその他追加インストールGemがなくてもここまでできる!というのは強い
 • Rails

    runner経由であれば、Rails前提のコードもコマンドライン引数を受 けとって処理することができる
 ◦ ただし、Rakeタスクとは別管理になってしまうのは注意
 ◦ ※Rakeタスクと違いrake -vでの一覧などができないため、スクリプトの置き場所に は注意
 15

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