kakudooo docs

RubyでCLIツールを作成してリリースするまでの手順

最近RubyでCLIツールを作ってGemとして公開した。またCLIを作る機会もあるはずなので、作成から公開までの手順を備忘として残しておくことにする。

プロジェクトを作成する

bundle gem gem名

例として、sampleというCLIツールを作成する場合。

bundle gem sample

Thorのインストール

インストール

cli-sample.gemspecにThorを追加する。

...
spec.add_dependency "thor"
...

.gemspecファイルのTODO:コメントを削除する。

bundle install

設定

lib/cli/sample/cli.rbを作成して、Thorクラスを継承したサブクラスを作成する。

module Cli
  module Sample
    class Cli < Thor
    end
  end
end

lib/cli/sample.rb で上で定義したlib/cli/sample/cli.rbを読み込む。

# frozen_string_literal: true

require_relative "sample/version"
require_relative "sample/cli" # 追記: 上で定義したlib/cli/sample/cli.rb

module Cli
  module Sample
    class Error < StandardError; end
    # Your code goes here...
  end
end

デフォルトではexeディレクトリが実行ファイルのパスになっているので、exeディレクトリと実行ファイルを作成する。

spec.bindir = "exe"
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }

exe/cli-sample-cliファイルを作成。

#!/usr/bin/env ruby
# frozen_string_literal: true

require "cli/sample"

Cli::Sample::Cli.start

ファイルに実行権限を付与する。

chmod a+x exe/cli-sample-cli

CLIの呼び出し。

bundle exec exe/cli-sample-cli

ローカル環境での開発

CLIの呼び出しまではできたので、後は開発に必要なgemをインストールして実装を進めていく。 以下は、例。

Gemfileに指定されているgemを.gemspecadd_development_dependencyに移行する。

依存モジュールをGemfileに定義するか?.gemspecに定義するか?については、いくつか方針がありそう。 ここではbundlerのプラクティスに則って、開発のみ使用するgem(rspec,rubocop etc)を含む全てを.gemspecに定義する。

Gemfileの以下を削除する。

gem "irb"
gem "rake", "~> 13.0"
gem "rspec", "~> 3.0"
gem "rubocop", "~> 1.21"

cli-sample.gemspecspec.add_development_dependencyとして追記する。

...
spec.add_dependency "thor"

spec.add_development_dependency "irb"
spec.add_development_dependency "rake"
spec.add_development_dependency "rspec"
spec.add_development_dependency "rubocop"
...
bundle install

配布に向けた準備

.gemspecファイルを完成させる

spec.summaryspec.descriptionを配布用に記述する。 実装しきった後でCoding Agentに記述してもらうのがおすすめ。

rubygems.orgのアカウントを作成する

https://rubygems.org/sign_upからアカウントを作成する。

API Keyの作成と設定

https://rubygems.org/profile/api_keysからAPI Keyを作成する。

権限はIndex rubygems,Push rubygemを付与。

rubygems.orgにログインして、API Keyをダウンロードする。 ダウンロードするAPI Keyを聞かれるので、作成したAPI Keyの名前を入れる。

gem signin

参照: https://guides.rubygems.org/api-key-scopes/

リリース

バージョンを指定する。

lib/cli/sample/version.rbの定数を任意の値に変更する。

# frozen_string_literal: true

module Cli
  module Sample
    VERSION = "0.1.0"
  end
end

コミットする。(コミットしないとリリースコマンドに失敗する)

git add lib/cli/sample/version.rb
git commit -m "feat: bump to 0.1.0"

リリースコマンドを実行する。

bundle exec rake release

rubygems.orgのプロフィールページに作成したgemが表示されていれば完了。