#author("2021-08-31T04:36:11+00:00","default:src128","src128")
&tag(Bundler);
*目次 [#b0f3038c]
#contents
*関連ページ [#b900de7b]
-[[Gemfile]]
-[[./gemパッケージ作成]]

*参考情報 [#pc172cbe]
-[[Bundler: The best way to manage a Ruby application's gems:http://gembundler.com/]]…公式
*概要 [#c0e87f56]
-使用するgemsを管理するためのツール

*使用方法 [#s6d488cd]

**参考情報 [#c52e7abe]
-[[Bundler: The best way to manage a Ruby application's gems:http://bundler.io/]]
-[[橋本商会 » Ruby書くならBundler使え:http://shokai.org/blog/archives/7262]]
**簡単にGemfileだけを使う方法 [#g8f67aab]
-Gemfileを用意する。例えばActiveRecordを単独で使用する場合
#pre{{
source 'https://rubygems.org'

gem 'activerecord'
gem 'mysql2'
}}
-インストール。vendor/bundle以下にgemが追加される。
 $ bundle install --path vendor/bundle
-使用する。自分のscriptの先頭で以下のようにかいて、ruby hoge.rbのように実行すると、vendor/bundle以下のgemを使ってくれる。
#pre{{
require "rubygems"
require "bundler/setup"
require "active_record"
}}

[[ruby - Are bundle exec and require 'bundler/setup' equivalent? - Stack Overflow:http://stackoverflow.com/questions/11117112/are-bundle-exec-and-require-bundler-setup-equivalent]]に、bundle execとbundle/setupの違いの説明あり。


**アプリのひな形を作成 [#y4d67c77]
-gemとしてインストール可能なアプリのひな形を作る事も出来る(-bで実行ファイルも作ってくれる。-tがつくとテストファイルも作ってくれる)
 bundle gem sampleapp -b -t
 bundle gem sampleapp -b -t #rspecが適用
 bundle gem sampleapp -b --test=minitest #minitestが適用
*Gemfile [#b937dfec]
**requireってなに? [#n1448ca4]
-[[ruby on rails - Bundler: What is the :require => false on the gemfile means? - Stack Overflow:http://stackoverflow.com/questions/4800721/bundler-what-is-the-require-false-on-the-gemfile-means]]によると、require => falseが指定されたものは、ダウンロードはされるが自動的にrequireはされないといいうこと。
-require するときの名前をかえることもできるらしい。

*gemパッケージの作り方 [#gfba42a0]
**注意: Windowsの場合 [#pe78e1b3]
-msysgitにパスを通してないとbundle gemがエラーになる。
**ひな形の生成 [#i19d63fd]

***ファイルの生成 [#v665d5d9]
-bundle gemコマンドでつくることができる。
 bundle gem demo
-オプションで-bを指定すれば実行ファイルを、-tを指定すればテストファイルを作ってくれる(rspec)。
 bundle gem demo -b -t
-もしくはminitestもサポートしている
 bundle gem dbtools  -b --test=minitest
-後からspecサポートを追加したい場合、次のリンクが参考になる。[[Ruby - bundlerを使ってRSpecを書きつつGemを開発する - Qiita [キータ]:http://qiita.com/kakkunpakkun/items/4271973425e151afbd1a]]
--gemspecにrspecを追加して、bundle install実行。specフォルダとspec_helperをつくるぐらいかな。
***gemspecファイルの編集[#p370c6f9]
-demo.gemspecファイルを編集する。
*Tips [#b7d0452d]
**パス指定の省略 [#lb751466]
-buldle install のパス指定を省略する。[[bundler - bundle install するときに vendor/bundle を省略する方法 - Qiita:http://qiita.com/toshiwo/items/4e7c82852f3e14bf5a1d]]
-~/.bundle/configに以下を記述。bundle configで確認できる。
#pre{{
# coding: utf-8
lib = File.expand_path('../lib', __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require 'demo/version'
---
BUNDLE_PATH: ./vendor/bundle
}}

Gem::Specification.new do |spec|
  spec.name          = "demo"
  spec.version       = Demo::VERSION
  spec.authors       = ["src"]
  spec.email         = ["tanaka@test.net"]
  spec.description   = %q{TODO: Write a gem description}
  spec.summary       = %q{TODO: Write a gem summary}
  spec.homepage      = ""
  spec.license       = "MIT"
**パッケージの命名規則 [#y6f7c4c7]
-[[Name your gem - RubyGems Guides:http://guides.rubygems.org/name-your-gem/]]が参考になる。アンダースコアは単語の区切り、ハイフン(ダッシュ)はパッケージ階層として解釈されるので使い分けたほうが良い。
-パッケージ名にハイフンを使う場合注意が必要 [#z37b810f]
-[[Create a Ruby Gem. Real World, play by play. Part 1:http://minimul.com/create-a-ruby-gem-real-world-play-by-play-part-1.html]]にもあるようにパッケージ名にaaa-bbbのようにハイフンを挟むとaaa/bbbのような深いフォルダが作成されてしまう。これを避けるためには、ハイフンを使わない、アンダースコアを使う、自分でフォルダ構造を変更するなどの工夫が必要になる。

  spec.files         = `git ls-files`.split($/)
  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"]
*トラブルシューティング [#a2a85f78]

  spec.add_development_dependency "bundler", "~> 1.3"
  spec.add_development_dependency "rake"
end
}}
-gitと連携することが考えられていて、authors、email、filesなどはgitから情報をもってきている。
-descriptionに、TODOやFIXMEが含まれているとビルドできない。
-依存関係の設定は、runtime_dependencyとdevelopment_dependencyが存在。runtimeはgemを動かすのに必要なもの。developmentは開発時に必要なもの(例:RSpec)。
-開発ディレクトリでbundle installすると、runtime/development両方の依存関係にあるライブラリがインストールsれる。
-開発後gemファイルをgem installやbundle installでインストールした場合、runtime dependencyにあるラウぶらりだけがインストールされる。
***gemのインストール [#g5e00519]
-pathを指定する。開発時はruntime_dependency/development_dependencyry方法がインストールされる。リリース後はruntime_dependencyだけインストールされる。
 bundle install --path .bundle
**You must use Bundler 2 or greater with this lockfile. [#m7c6d209]
-2021/08/31(火)実行時に上記エラーが発生。
-Gemfile.lockを削除してbundle updateする。
**Gemfileでgitリポジトリを指定したgemが更新されない [#fcc3b78b]
-gemspecでバージョンが上がっていれば「bundle update」で更新できる => 利用する側に手を入れるのが一番よい(と思ったけどだめかも)。さわれない場合vendor/bundleを削除して入れなおすしかない?

**パッケージ作成 [#y5b00e61]
-lib/demo.rbに実装を書く。
**gem install bundlerでエラー発生 [#be610b6c]
-以下のようなエラーが発生する。
#pre{{
require "demo/version"

module Demo
  def self.hello_world
    p "hello world!!"
  end
end
$ gem install bundler
ERROR:  Could not find a valid gem 'bundler' (>= 0), here is why:
          Unable to download data from https://rubygems.org/ - SSL_connect returned=1 errno=0 state=error: certificate verify failed (https://api.rubygems.org/specs.4.8.gz)
}}
-[[Gem install fails with SSL certificate connection error · Issue #1736 · rubygems/rubygems:https://github.com/rubygems/rubygems/issues/1736]]によるとRubyの古いのが原因?たしかに2.3.0だと発生するけど2.4.0だと大丈夫だった。

**パッケージ実行 [#o31f0c74]
-bundle 経由で実行する
 bundle exec bin/demo.rb
**パッケージビルド [#jb2bc76f]
-パッケージをビルドする。rakeコマンドを使用
 rake build
-パッケージをインストールする。
 gem install pkg/demo-0.0.1.gem
-またはrake installで一発。
-動作確認(irbででも)。
#pre{{
require 'demo'
puts Demo.hello_world
}}
** 「because its extensions are not built.  Try: gem pristine」エラー [#fc22bea6]
-Capistranoでデプロイしようとして発生。キャッシュとインストールされたgemファイルの内容が不一致になっている「gem pristine --all」で解消するとの情報もあり。
-とりあえずエラーではない(警告?)のようなので放置。

**パッケージリリース(PENDING) [#gc6b5755]
-rake release


*Tips [#b7d0452d]
-buldle install のパス指定を省略する。[[bundler - bundle install するときに vendor/bundle を省略する方法 - Qiita:http://qiita.com/toshiwo/items/4e7c82852f3e14bf5a1d]]
-~/.bundle/configに以下を記述。bundle configで確認できる。
**bundle installで「Bundler could not find compatible versions for gem "bundler"」 [#b62f28c7]
-bundle install時に以下のようなエラーが表示される。
#pre{{
---
BUNDLE_PATH: ./vendor/bundle
Bundler could not find compatible versions for gem "bundler":
  In Gemfile:
    bundler (~> 1.16)

  Current Bundler version:
    bundler (2.0.1)
This Gemfile requires a different version of Bundler.
}}
-エラーメッセージの通りGemfile.lock(およびそのもとになったGemfile)のbunlderのバージョンと、システムのバンドラーのバージョンが異なる。
-bundler 2.xの互換性がbundler 1.xとないためこのようなトラブル多発(2019/05/03(金))。Gemfile.lockの「BUNDLE WITH」で指定されたバージョンにあわせるか(2.xをアンインストールして1.xをインストールする)
-RubyGemsの場合.gemspecのbundlerのバージョンを上げても良いかもしれない。

**can't find gem bundler (>= 0.a) with executable bundle (Gem::GemNotFoundException) [#f9e4127c]
-Gemfile.lockの「BUNDLE WITH」で指定されているbundlerのバージョンと実際にインストールされているbunlderのバージョンが異なるのが原因。
-bundlerがv2.0.0にバージョンアップしてこのエラーが発生するようになった?
-BUNDLE WITHに指定されているバージョンをインストールするか、Gemfile.lockを削除してupdateする。

**Could not find gem 'bundler (< 2.0, >= 1.3.0)', [#ud22e96d]
-古いRailsアプリでbundle installしようとするとエラー。
-現在のバージョンの2.1.4。をアンインストールして1.X系の最新版をインストールする。[[Redmineインストール時にgemパッケージのインストールで失敗 - Qiita:https://qiita.com/k-yoshiyuki/items/a57775c959cac056f0fd]]
 gem uninstall bundler -v2.1.4
 gem install bundler -v1.17.3
-もしくは古いバージョンを明示する。[[bundlerのバージョンを固定してbundle installする方法 - Qiita:https://qiita.com/Nedward/items/ee70b8196398dc1e3017]]


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS