自作 gem の作り方
gem を作成 (bundle gem
)
gem_name
という gem のテンプレートを作成する場合は以下を実行します。
bundle gem gem_name
bundle gem
のオプション
bundle gem
にはオプションが存在します。
詳細またはその他のオプションを知りたい場合は Bundler: bundle gem を参照してください。
オプション | 説明 |
---|---|
--exe , -b , --bin |
gem にバイナリ実行ファイルを含めます。 |
--ext |
gem に C 拡張を含めます。 |
--mit |
プロジェクトを MIT ライセンスにします。 |
--ci |
ci サービスを設定します。 |
--linter |
リンターとフォーマッターを指定します。 |
例: リンターに
rubocop
を使用し、MIT ライセンスでコマンドを含み、C 言語拡張を含むmyapp
という gem を作成する場合bundle gem myapp --exe --ext --mit --ci=github --linter=rubocop
プロジェクトの構造
上記コマンドで生成したプロジェクトの構造は以下のようになっています。
myapp
├── Gemfile
├── LICENSE.txt
├── README.md
├── Rakefile
├── bin
│ ├── console
│ └── setup
├── exe
│ └── myapp
├── ext
│ └── myapp
│ ├── extconf.rb
│ ├── myapp.c
│ └── myapp.h
├── lib
│ ├── myapp
│ │ └── version.rb
│ └── myapp.rb
├── myapp.gemspec
└── sig
└── myapp.rbs
各ディレクトリーは以下のようになっています。
- lib/: ライブラリーのコード (
require
で呼び出される) - ext/: C 言語のソースコード (インストール時にコンパイルされ、
require
で呼び出される) - exe/: コマンドがある
myapp.gemspec
がもっとも重要なファイルで、gem の構成が定義されています。
基本的に上記 3 つのディレクトリー (C 言語を使用しない場合は、2 つのディレクトリー) の中にあるファイルと gemspec ファイルを編集します。(必要に応じて Rakefile や README.md も編集します。)
Gemfile は編集しないでください。
gemspec
の編集
gem を作るために myapp.gemspec
を編集する必要があります。
TODO のある行やホームページの行をコメントアウトし、spec.summary
の設定を行えば最低限動作します。
必須である項目を以下に示します。
- spec.name
- spec.version
- spec.authors
- spec.summary
bundle install
コマンドを実行し、エラーがなければ問題ありません。
依存パッケージの追加
gemspec に以下のように追記して依存している gem を追加できます。
spec.add_dependency "example-gem", "~> 1.0"
gemspec に以下のように追記し開発時に必要な gem を追加できます。
spec.add_development_dependency "example-gem", "~> 1.0"
詳しくは、class Gem::Specification (Ruby 3.1) リファレンスマニュアル や library rubygems (Ruby 3.1 リファレンスマニュアル) を参照してください。
bundle install
bundle install
を実行することで、Gemfile および gemspec に記述されている gem がインストールされます。
バージョンの変更
バージョンは、lib/myapp/version.rb
に定義されています。
コンパイル
以下のコマンドを実行し、C 拡張をコンパイルします。
このコマンドの実行により、共有ライブラリー lib/myapp/myapp.so
が生成されます。
rake compile
コンパイル後、gem に含まれるコマンド実行すると、 エラーなく実行されます。
bundle exec myapp
C 拡張
C 言語で Ruby を拡張することができます。
たとえば、/etc/myapp/myapp.c
を以下のように変更します。
void
Init_myapp(void)
{
rb_mMyapp = rb_define_module("Myapp");
+ rb_p(rb_str_new2("Hello, world!"));
}
rake compile
でコンパイルを行い、bundle exec myapp
を実行すると、"Hello, world!"
と表示されます。
この例は、C 言語から Ruby の C API を呼び出し表示するプログラムで、
p "Hello, world!"
と同等です。
Ruby の C API だけではなく、コンピューターにインストールされている共有ライブラリーを扱うことができるため、ラッパーを作成することが可能です。
また、C 拡張により計算が必要な場合に高速化することができます。
ライブラリーの作成
lib/myapp.rb
あたりを編集。
新しいファイルを作成した場合は、git add
する必要があります。
gem をインストール (rake install
)
プロジェクト内の gem がインストールされます。
rake install
gem を公開 (rake release
)
gem を公開するには、rubygems のアカウントを作成する必要があります。 リリースするたびに、バージョンを変更する必要があります。
rake release
gem パッケージを生成 (rake build
)
プロジェクトから pkg/myapp-x.x.x.gem
が作成されます。
rake build