RubyGemsを使用してRubyアプリケーションをGemとしてパッケージ化および配布する方法
序章
共有は関係者全員の間の架け橋を形成し、物事を成長させます。 これがオープンソース運動の基盤であり、特に近年、多くの素晴らしいことが起こりました。
このプリンシパルは、RubyおよびRubyベースのアプリケーションに適用されます。 そのため、開発者は、利用可能なすべてのツール、ライブラリ、およびフレームワークのおかげで、アイデアを非常に迅速に実現するための作業を開始できます。
このDigitalOceanの記事では、RubyベースまたはRuby関連の独自の作品を共有することで、コミュニティに還元する方法を見つけようとしている人々を支援することを目的としています。 パッケージングコードの謎を解き明かし、RubyGemsパッケージマネージャーを使用してGemとして簡単にダウンロードできるようにします。これにより、プロセス全体が簡単になります。
用語集
1. パッケージングアプリケーション
2. RubyGemsパッケージマネージャーとRubyGemパッケージ
- RubyGemsパッケージマネージャー
- RubyGemパッケージ
- 宝石パッケージの構造
3. Rubyと必要なツールを入手する
- Rubyのインストール
- Bundlerのインストール
3. Rubyアプリケーションのパッケージ化
- 配布ディレクトリの準備
- .gemspecファイルの作成
- アプリケーションコードの配置
- メインアプリケーションスクリプトの変更
- すべてが機能することを確認する
- 宝石の依存関係を一覧表示する
- ジェムパッケージのコミット
4. ジェムパッケージのリリース
- パッケージの作成
- 宝石の公開
パッケージングアプリケーション
アプリケーション、ライブラリ、またはその他のプログラミング関連のコードバンドルを配布する方法の1つは、パッケージと呼ばれるアーカイブにそれらを配置することです。 アプリケーションパッケージには、コンパイル済みですぐに使用できるソフトウェアが、追跡しやすく、使いやすい方法で含まれています。 通常、パッケージに関する情報と、場合によってはドキュメントを含む追加のファイルが付属しています。
したがって、パッケージングアプリケーションは、パッケージ管理ツールによって定義された一連の形式に従うことで構成されます(つまり、 RubyGems)を使用し、これらのツールを使用して、簡単にアクセスできる方法で他のツールと共有します。
このチュートリアルでは、Gemパッケージ形式であるRubyGemsを理解することから始め、次に、コード(およびその他の関連資料)を含むパッケージ構造を作成することから始めて、Rubyアプリケーションを最初から最後までパッケージ化する方法を学びます。
RubyGemsパッケージマネージャーとRubyGemパッケージ
注:この記事の主題は、アプリケーションをパッケージ化することです。 このセクションには、関連するツールと資料の要約が含まれています。 それらの詳細については、RubyGemsシリーズの紹介の最初のパートを読むことができます。
RubyGemsパッケージマネージャー
RubyGemsは、Rubyのデフォルトのパッケージマネージャーです。 これは、Rubyアプリケーションと関連するバイナリまたはライブラリのダウンロードから配布までのすべてのアプリケーションパッケージのライフサイクルに役立ちます。 RubyGemsは強力なパッケージ管理ツールであり、 RubyGemsと呼ばれるアーカイブにアプリケーションをパックするための標準化された構造を開発者に提供します。
RubyGemパッケージ
GemはRubyアプリケーションパッケージであり、コードのコレクションからライブラリ、および/またはパッケージ化されたコードが実際に実行する必要のある依存関係のリストまで、あらゆるものを含めることができます。
宝石パッケージの構造
Gemパッケージには、さまざまなコンポーネントのセットが含まれています。 各コンポーネントは、gemバンドル内の専用の場所に配置されます。
以下のすべての要素(およびそれ以上)はGems内に入ることができます:
-
アプリケーションコード;
-
テスト;
-
依存関係の説明。
-
バイナリ;
-
関連ドキュメント;
-
パッケージに関する情報(gemspec)。
宝石は、次のような構造で形成されています。
/[package_name] # 1
|__ /bin # 2
|__ /lib # 3
|__ /test # 4
|__ README # 5
|__ Rakefile # 6
|__ [name].gemspec # 7
-
[package_name]:
Gemパッケージのメインルートディレクトリ。 -
/ bin:
パッケージに実行可能バイナリがある場合の場所。 -
/ lib:
メインのRubyアプリケーションコードを含むディレクトリ(inc。 モジュール)。 -
/ test:
テストファイルの場所。 -
Rakefile:
Rake-ビルドにRakeを使用するライブラリのファイル。 -
[packagename] .gemspec:
* .gemspecファイルには、メインディレクトリの名前があり、すべてのパッケージメタデータが含まれています。 名前、バージョン、ディレクトリなど。
Rubyと必要なツールを入手する
Rubyのインストール
Rubyをまだインストールしていない場合は、以下の2つのリンクのいずれかに従って、選択したプラットフォームにRubyを適切にセットアップできます。
-
CentOS / Rhel:
RVMを使用してCentOS6.5にRuby2.1.0をインストールする方法 -
Ubuntu / Debian:
RVMを使用してUbuntu13にRuby2.1.0をインストールする方法
Bundlerのインストール
Gemsの作成に使用するツールの1つは、Bundlerです。 Ruby、つまりRubyGemsがシステムにインストールされたら、“gem`コマンドを使用してbundlerを取得できます。
次のコマンドを実行して、gem
を使用してbundler
をインストールします。
gem install bundler
# Successfully installed bundler-1.5.3
# Parsing documentation for bundler-1.5.3
# Done installing documentation for bundler after 3 seconds
# 1 gem installed
Rubyアプリケーションのパッケージ化
Gemパッケージの作成を開始する方法はいくつかあります。 方法の1つは、アプリケーションの要件とコードの保守を支援するRuby環境および依存関係マネージャーである人気のあるBundlerを使用することです。 このツールを使用して、Gem配布ディレクトリをスキャフォールディングし、パッケージ化プロセスを開始することもできます。
配布ディレクトリの準備
Gemパッケージは、前の構造化セクションで説明したように、パッケージにちなんで名前を付ける必要があるパッケージディレクトリに保持されます。 これらはファイルシステム上にある単純な場所であるため、Unix mkdir
コマンドを使用して1つずつ作成するか、Bundlerに作業を任せることができます。
次のコマンドを実行して、Gemの目的の名前にちなんで名付けられた、フォルダー内の必要なすべてのディレクトリをスキャフォールディングします。
# Usage: [sudo] bundle gem [your chosen gem name]
# Example:
bundle gem my_gem
注:宝石の名前は一意である必要があります。 したがって、Gemに使用する名前が、他の誰かのプロジェクトによってまだ選択されていないことを検索して確認する必要があります。 確認するには、RubyGems.orgにアクセスして検索できます。
上記のコマンドは、一連のコマンドを実行してパッケージ構造を作成します。例:
# bundle gem my_gem
# create my_gem/Gemfile
# create my_gem/Rakefile
# create my_gem/LICENSE.txt
# create my_gem/README.md
# create my_gem/.gitignore
# create my_gem/my_gem.gemspec
# create my_gem/lib/my_gem.rb
# create my_gem/lib/my_gem/version.rb
# Initializing git repo in .../my_gem
ご覧のとおり、Bundlerは、さまざまなバージョン管理操作に役立つまったく新しいGitリポジトリも作成しました。
注: Gitの操作方法について詳しく知りたい場合は、このテーマに関するDigitalOceanコミュニティの記事を確認してください。
.gemspecファイルの作成
.gemspec
ファイルには、Gemパッケージに関する非常に重要な情報が含まれています。 これまでのGemには、Gemの名前からバージョンへのメタデータとGemに含まれるフォルダーへの説明が含まれているものを同梱する必要があります。
ヒント: .gemspec
files are regular Ruby scripts – which means that they are programmable.
Bundlerによって作成された汎用gemspecの内容を表示するには、次のコマンドを使用します。
cat my_gem/my_gem.gemspec
# # coding: utf-8
# lib = File.expand_path('../lib', __FILE__)
# $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
# require 'my_gem/version'
# Gem::Specification.new do |spec|
# spec.name = "my_gem"
# spec.version = MyGem::VERSION
# spec.authors = ["Maintainer Name"]
# spec.email = ["[email protected]"]
# spec.summary = %q{TODO: Write a short summary. Required.}"
# spec.description = %q{TODO: Write a longer description. Optional.}
# spec.homepage = ""
# spec.license = "MIT"
# spec.files = `git ls-files -z`.split("\x0")
# spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
# spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
# spec.require_paths = ["lib"]
# spec.add_development_dependency "bundler", "~> 1.5"
# spec.add_development_dependency "rake"
# end
# mba:Git
このファイルは、今すぐ編集することも、パッケージ化して公開する前に編集することもできます。
このファイルを変更するには、次のコマンドを使用して、nanoを使用してファイルを編集できます。
nano my_gem/my_gem.gemspec
これにより、nanoテキストエディタが開きます。
ここで宣言したい推奨される追加情報の1つは、コードの実行に必要なRubyインタープリターの最小バージョンです。
これは、required_ruby_version
宣言を使用して行うことができます。この宣言は、一貫性を保つためにファイルの下端に追加できます。
例えば:
# ..
# Declare that the Gem is compatible with
# version 2.0 or greater
spec.required_ruby_version = ">= 2.0"
spec.add_development_dependency "bundler", "~> 1.5"
spec.add_development_dependency "rake"
end
ファイルの編集が完了したら、CTRL + Xを押し、Yで確定して保存して終了します。
注:「やること」プレースホルダーを含む宣言を変更することを忘れないでください(つまり、 %q{TODO:
)spec.description
など。
アプリケーションコードの配置
ライブラリ(またはアプリケーション、フレームワークなど)は、常に/lib
ディレクトリ内に配置する必要があります。 このディレクトリ内には、Gemとまったく同じ名前のRubyスクリプトがあります。 このファイルは、別のアプリケーションがGemに依存しているときにインポートされるメインファイルです。
アプリケーションコードを配置するための推奨される最も適切な方法は、アプリケーションコードをビットに分割し、/lib
内のディレクトリに配置することです。このディレクトリで、my_gem.rb
によって使用および公開されます。
/lib
ディレクトリの内容を見ると、メインのRubyスクリプトとコードを格納するディレクトリの準備ができていることがわかります。
ls -l my_gem/lib
# drwxr-xr-x 3 user staff 102 dd Mmm hh:mm my_gem
# -rw-r--r-- 1 user staff 70 dd Mmm hh:mm my_gem.rb
また、/lib
内のmy_gem
ディレクトリにはバージョンファイルが付属しています。
cat my_gem/lib/my_gem/version.rb
module MyGem
VERSION = "0.0.1"
end
このVERSION
番号は、Bundlerによって*.gemspec
ファイル内に自動的にインポートされて使用されるように設定されています。 ここで変更して、Gemの現在のバージョンに一致するように変更できます。
アプリケーションで使用するには、すべてのコードをここに移動する必要があります。
例として、Hello [name]!
モジュールを作成してみましょう。
nano my_gem/lib/my_gem/hail.rb
以下の例を内部に配置します。
class Hail
def self.name(n = "Dalek")
n
end
end
CTRL + Xを押し、Yで確定して保存して終了します。
メインアプリケーションスクリプトの変更
前のステップで、すべてを整理するために、特に多くのクラスを持つアプリケーションを、すべての要素を/lib/[gem-name]
ディレクトリ内に配置して断片に分割する必要があることを学びました。
誰かがあなたのGemを使用したときにインポートされるメインのRubyスクリプトを変更する方法を見てみましょう。
次のコマンドを実行して、nanoを使用して/lib
内にインポートされたRubyファイルを編集します。
# Usage: [sudo] nano my_gem/lib/[gem name].rb
nano my_gem/lib/my_gem.rb
以下のような非常に短いスクリプトが表示されます。
require "my_gem/version"
module MyGem
# Your code goes here...
end
ここでは、すべてのクラスとコードを/lib/[gem name]
ディレクトリからインポートして使用する必要があります。
この例では、前の手順で作成したHail
クラスの使用方法を見てみましょう。
以下の例のようにコードを変更します。
require "my_gem/version"
require "my_gem/hail"
module MyGem
def self.hi(n = "Default Name")
hail = Hail
Hail.name(n)
end
end
CTRL + Xを押し、Yで確定して保存して終了します。
注: Hail
をインスタンス化可能クラスにする必要はありませんが、デモンストレーションの目的で作成し、MyGemを使用するモジュールとして残しました。そのメソッドを直接。
すべてが機能することを確認する
コードを内部に移動して、インポートされたメインスクリプトを変更したら、すべてが自然に機能することを確認する必要があります。 これを行う最も簡単な方法は、Gemをインストールするのではなく、Bundlerを再度使用することです。
まず、Gemディレクトリに入り、Bundlerのコンソール機能を使用しましょう。
cd my_gem
bundler console
これにより、*.gemspec
からの情報を使用してGemが読み込まれ、作業を開始できます。例:
bundler console
# irb(main):001:0> MyGem.hi("Hello world!")
# => "Hello world!"
宝石の依存関係を一覧表示する
実際のシナリオでは、Gem自体が他の人に依存している可能性が高くなります。
これらの依存関係は、*.gemspec
ファイルにもリストされています。
次のコマンドを実行して、nanoを使用してファイルを編集します。
nano my_gem/my_gem.gemspec
依存関係を一覧表示するには、適切なブロックに次の手順を追加します。
# Usage: spec.add_runtime_dependency "[gem name]", [[version]]
spec.add_runtime_dependency "activesupport", [">= 4.0"]
CTRL + Xを押し、Yで確定して保存して終了します。
注: *.gemspec
ファイルで命令を連続して繰り返すことにより、必要なすべての依存関係を一覧表示できます。
ジェムパッケージのコミット
Gemを出荷する準備ができたら、バージョン管理のためにGitリポジトリをコミットする必要があります。
次のコマンドを使用して、Gitでコミットします。
git commit -m "Version 0.1.0"
次に、Gitはすべてのコードをコミットし、結果を提供します。
# [master (root-commit) d4640b8] Version 0.1.0
# 8 files changed, 104 insertions(+)
# create mode 100644 .gitignore
# create mode 100644 Gemfile
# create mode 100644 LICENSE.txt
# create mode 100644 README.md
# create mode 100644 Rakefile
# create mode 100644 lib/my_gem.rb
# create mode 100644 lib/my_gem/version.rb
# create mode 100644 my_gem.gemspec
ジェムパッケージのリリース
Gemに満足したら、RubyGems.orgで世界にリリースできます。
注:コードをリリースするには、https://rubygems.org/sign_upにアカウントが必要です。
パッケージの作成
すべての設定が完了したら、gem
ツールを使用してパッケージを作成できます。
以下を実行してパッケージを作成します。
# Usage: [sudo] gem build [gem name].gemspec
# Example:
gem build mygem.gemspec
# Successfully built RubyGem
# Name: my_gem
# Version: 0.1.0
# File: my_gem-0.1.0.gem
宝石の公開
新しく作成されたGemを公開する方法はいくつかあります。 いずれにせよ、 RubyGems.org アカウントでログインする必要があるので、最初にログインすることから始めましょう。
次のコマンドを実行して、gem
を使用してログインします。
gem push
メールアドレスを入力し、次にパスワードを入力してサインインします。
注:プッシュするGem名を指定しないようにして、それ以上のアクションを実行せずにログインするだけにします。
ジェムをプッシュするだけで、次のコマンドを実行します。
# Usage: [sudo] gem push [gem file]
# Example:
gem push my_gem-0.1.0.gem
または、BundlerのRakeタスクを利用することもできます。 あなたは以下の完全なリストを見ることができます:
rake -T
-
rake build:
my_gem-0.0.1.gemをpkgディレクトリにビルドします -
rake install:
my_gem-0.0.1.gemをビルドしてシステムgemにインストールします -
rakeリリース:
タグv0.0.1を作成し、my_gem-0.0.1.gemをビルドしてRubygemsにプッシュします
rake release
を呼び出すと、パッケージは設定されたGitアカウントにプッシュされ、次に RubyGems.org にプッシュされます(例:
rake build
# my_gem 0.1.0 built to pkg/my_gem-0.1.0.gem.
rake release
# rake aborted!
# Couldn't git push. `git push 2>&1' failed with the following output:
# fatal: No configured push destination.
# Either specify the URL from the command-line or configure a remote repository using
# git remote add <name> <url>
続行するには、リモートGitアカウントを追加します。
# Usage: git remote add origin [email protected]:[user name]/[repository].git
# Example:
git remote add origin [email protected]:maintainer1/my_gem.git
次に、rake
を使用してコードを同時にリリースします。
rake release
# ..
# Pushed MyGem
以上です! これで、 RubyGems.org にアクセスして、Gemをチェックできます。
http://www.rubygems.org/gems/[your gem name]