最近RubyでCLIツールを作ってGemとして公開した。またCLIを作る機会もあるはずなので、作成から公開までの手順を備忘として残しておくことにする。
bundle gem gem名
例として、sampleというCLIツールを作成する場合。
bundle gem sample
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を.gemspecのadd_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.gemspecのspec.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
spec.summaryやspec.descriptionを配布用に記述する。
実装しきった後でCoding Agentに記述してもらうのがおすすめ。
https://rubygems.org/sign_upからアカウントを作成する。
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が表示されていれば完了。