5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

RubyでCLI Tool を作ってみる

Last updated at Posted at 2019-05-04

1年くらいRubyを触ってきたが、「そういやCLITool作ったことないや」と思い、簡単に作ってみた。

アウトプット

  • CLIベースでSlackに認証テスト、メッセージ送信、チャンネルリストの取得ができるものをつくる
  • あくまでCLItoolの作りかたを学ぶ

開発環境

  • OS:macOS Mojave
  • rbenv: 1.1.2
  • Ruby: 2.6.2
  • rubygems: 3.0.3

手順

今回は、slack_notify_cliという名前のgemを作成する。

1. bundlerインストール

未インストールの場合のみ。

$ gem install bundler 

2. gemの雛形を作成

今回はテストも書く予定なので、-tオプションを指定する。

$ bundle gem slack_notify_cli -t rspec

3. gemspecの修正

基本的にTODOのところを編集すればいいらしい。

slack_notify_cli.gemspec

Gem::Specification.new do |spec|
  spec.name          = "slack_notify_cli"
  spec.version       = SlackNotifyCli::VERSION
+   spec.authors       = "tozu00"
-   spec.summary       = %q{TODO: Write a short summary, because RubyGems requires one.}↲
-   spec.description   = %q{TODO: Write a longer description or delete this line.}↲
-   spec.homepage      = "TODO: Put your gem's website or public repo URL here."↲
+  spec.summary       = %q{slack notification command line interface. }
+  spec.description   = %q{slack notification command line interface. ex.) get channel list, check auth, send message}
+  spec.homepage      = "https://github.com/tozu00/slack_notify_cli"

rubygemsに登録する場合は、以下の設定があるとダメ。

外部にgemを公開したくない場合のみ、この設定が必要なので、削除する。

slack_notify_cli.gemspec
-  # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
-  # to allow pushing to a single host or delete this section to allow pushing to any host.
-  if spec.respond_to?(:metadata)
-    spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'"

-    spec.metadata["homepage_uri"] = spec.homepage
-    spec.metadata["source_code_uri"] = "TODO: Put your gem's public repo URL here."
-    spec.metadata["changelog_uri"] = "TODO: Put your gem's CHANGELOG.md URL here."
-  else
-    raise "RubyGems 2.0 or newer is required to protect against " \
-      "public gem pushes."
-  end

必要なgemの追加

slack_notify_cli.gemspec

  spec.add_development_dependency "aruba"

  spec.add_dependency "thor"
  spec.add_dependency "slack-ruby-client"
  • aruba : テストフレームワーク。CLIのテストが簡単になる。
  • thor : CLItoolを作成する。
  • slack-ruby-client : slackの通知機能を実現する。

4. コマンドが実行されるクラスの作成

slack-ruby-clientの以下機能を実装してみる。

lib/slack_notify_cli/command.rb
require 'thor'
require 'slack-ruby-client'

Slack.configure do |config|
  config.token = ENV['SLACK_API_TOKEN']
  raise 'Missing ENV[SLACK_API_TOKEN]!' unless config.token
end

module SlackNotifyCli
  class Command < Thor
    desc "slack_notify_cli auth_check", "auth check"
    def auth_check
      client = Slack::Web::Client.new
      puts client.auth_test['ok'] ? "Authentication successed" : "Authentication failed"
    end

    desc "slack_notify_cli channel_list", "get channel list"
    def channel_list
      client = Slack::Web::Client.new
      channels = client.channels_list.channels
      puts channels.map { |c| "##{c.name} #{c.purpose.value}"}
    end

    desc "slack_cli send str:{channel} str:{message}", "send message ex.) slack_cli send \"#general\" \"Hello World\""
    def send(channel, message)
      client = Slack::Web::Client.new
      client.chat_postMessage(channel: channel, text: message, as_user: true)
    end
  end
end

作成したクラスを読み込む

lib/slack_notify_cli.rb
require "slack_notify_cli/version"
+ require "slack_notify_cli/command"

module SlackNotifyCli
  class Error < StandardError; end
end

5. 実行ファイルの作成

SlackNotifyCli::Command.startでCLIを起動する。

exe/slack_notify_cli
#!/usr/bin/env ruby

require "slack_notify_cli"

SlackNotifyCli::Command.start

6. bundle install

gemのインストールをディレクトリの範囲に限定的したいので、--pathオプションをつけて、インストールする。

$ bundle install --path .bundle

7. コマンド実行

環境変数にtokenを設定して、コマンドを実行。

$ export SLACK_API_TOKEN=xo...
$ bundle exec exe/slack_notify_cli
Commands:
  slack_notify_cli help [COMMAND]                              # Describe available commands or one specific command
  slack_notify_cli slack_cli send str:{channel} str:{message}  # send message ex.) slack_cli send "#general" "Hello World"![スクリーンショット 2019-05-04 23.59.51.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236702/fdc9373d-0d54-bdbb-534c-ea5737285d5a.jpeg)

  slack_notify_cli slack_notify_cli auth_check                 # auth check
  slack_notify_cli slack_notify_cli channel_list               # get channel list

引数を指定しないと、ヘルプを出してくれるっぽい。

メッセージ送信してみる

$ bundle exec exe/slack_notify_cli send "#test" "Hello World"

スクリーンショット 2019-05-05 0.01.52.jpg
すごい簡単やないかい!

所感

  • 思ったより簡単にできた
  • gemを作って公開するまでやってみる
  • CItoolとかつくれそう

参考記事

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?