リンカーズさんの社内LT会で発表した内容です。RubyGemsの仕組みと作り方について。
rubygemsೖ
View Slide
ΈΜͳgem͖Ͱ͢ΑͶ??
gemΛ͏ਓଟ͍͚Ͳ࡞Δਓগͳ͍
gem࡞ΔͷͬͯࢥͬͨΑΓ؆୯ͳΜͰ͢Αͱ͍͏Λ͠·͢
࡞Δલʹɺ·ͣΈʹ͍ͭͯͬ͘͟Γղઆ͠·͢
ͦͦgemͬͯͲ͏͍͏Ͱಈ͍͍ͯΔͷhttps://github.com/rubygems/rubygems» ΈΜͳ͓ͳ͡Έgem installͳͲͷίϚϯυ» gemͷrequireͷڍಈΛఏڙ͍ͯ͠Δ
rubygemsΛrequire͢Δͱɺrequire͕ஔ͖ΘΔ1.·ͣී௨ʹrequire($LOAD_PATHΛ୳͢)2.ͳʹݟ͔ͭΒͳ͔ͬͨΒɺաڈʹgem installͨ͠gemΛ୳ͯ͠ɺݟ͔ͭͬͨΒ$LOAD_PATHʹͦͷgemͷpathΛՃͯ͠require͢Δ
rubygemsࣗಈͰrequire͞ΕΔ» Ruby1.9͔Β» ࣗಈͰrequireͨ͘͠ͳ͍ͱ͖RubyͷϏϧυ࣌ʹexportRUBYOPT='--disable gems'͓ͯ͘͠ඞཁ͕͋ΔΒ͍͠
ͰͨͪΏΔ;ΘRails͍ͬͯ΄ͱΜͲgemΛrequire͠ͳ͍ΑͶʁ
Bundler
Gemfileྫgem ‘rails’, ‘>~ 5.2.0’gem 'bootsnap', '>= 1.1.0', require: false
Bundler.setup && Bundler.require͜ΕΒRailsڥΛϩʔυ͢Δͱ͖ʹඞ࣮ͣߦ͞ΕΔ# config/boot.rbrequire 'bundler/setup'# config/application.rbBundler.require(*Rails.groups)
Bundler.setupGemfileʹఆٛ͞Ε͍ͯΔgemΛͥΜͿ$LOAD_PATHʹՃ͢Δ
Bundler.require(*Rails.groups)Gemfileʹఆٛ͞Ε͍ͯΔgemΛrequire͢Δɻͨͩ͠» Ҿͷgroupʹଐ͍ͯ͠ͳ͍gemrequire͠ͳ͍» gem 'bootsnap', '>= 1.1.0', require: falseΈ͍ͨʹrequire: falseͱͳ͍ͬͯΔgemrequire͠ͳ͍» ։ൃ༻ͱ͔ςετ༻ͷgemͩͱҰ୴require: falseͱ͓͍ͯͯ͠ɺಛఆͷίϚϯυͷͱ͖͚ͩ໌ࣔతʹrequire͢Δɺͱ͍͏gem͕࣌ʑ͋Γ·͢
࣍ʹ࡞Γํ
budler͕gemͷ࡞Γ༻ͷίϚϯυΛఏڙ͍ͯ͠Δbundle gem gemͷ໊લͰOK
ࢼ͠ʹhelloworld gemΛ࡞ͬͯΈ·͢bundle gem helloworldCreating gem 'helloworld'...MIT License enabled in configCode of conduct enabled in configcreate helloworld/Gemfilecreate helloworld/lib/helloworld.rbcreate helloworld/lib/helloworld/version.rbcreate helloworld/helloworld.gemspeccreate helloworld/Rakefilecreate helloworld/README.mdcreate helloworld/bin/consolecreate helloworld/bin/setupcreate helloworld/.gitignorecreate helloworld/.travis.ymlcreate helloworld/.rspeccreate helloworld/spec/spec_helper.rbcreate helloworld/spec/helloworld_spec.rbcreate helloworld/LICENSE.txtcreate helloworld/CODE_OF_CONDUCT.mdInitializing git repo in /Users/shinichi.maeshima/tmp/helloworldGem 'helloworld' was successfully created. For more information on making a RubyGem visit https://bundler.io/guides/creating_gem.html
ͨ͘͞ΜϑΝΠϧ͕ੜ͞Εͨ.!"" CODE_OF_CONDUCT.md!"" Gemfile!"" LICENSE.txt!"" README.md!"" Rakefile!"" bin# !"" console# $"" setup!"" helloworld.gemspec!"" lib# !"" helloworld# # $"" version.rb# $"" helloworld.rb$"" spec!"" helloworld_spec.rb$"" spec_helper.rb
͓͖͑ͯ͘͜ͷ̎ͭ» lib/helloworld.rb» gemΛrequireͨ͠ͱ͖ͷىʹͳΔϑΝΠϧ» helloworld.gemspec» gemͷઆ໌ґଘؔΛఆٛ͢ΔϑΝΠϧ
lib/helloworld.rbྫrequire "helloworld/version"module Helloworlddef self.sayputs 'hello world!'endend
helloworld.gemspecྫɻҰ෦লུͯ͠·͢Gem::Specification.new do |spec|spec.name = "helloworld"spec.version = Helloworld::VERSIONspec.authors = ["willnet"]spec.email = ["[email protected]"]spec.summary = %q{TODO: Write a short summary, because RubyGems requires one.}spec.description = %q{TODO: Write a longer description or delete this line.}spec.homepage = "TODO: Put your gem's website or public repo URL here."spec.license = "MIT"spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }endspec.bindir = "exe"spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }spec.require_paths = ["lib"]spec.add_development_dependency "bundler", "~> 1.17"spec.add_development_dependency "rake", "~> 10.0"spec.add_development_dependency "rspec", "~> 3.0"end
TODO: ͱͳ͍ͬͯΔͱ͜ΖΛॻ͍ͯͳ͍ͱౖΒΕΔͷͰͪΌΜͱॻ͖·͠ΐ͏ྫͷsummaryͱdescriptionͱhomepageΛमਖ਼Gem::Specification.new do |spec|spec.name = "helloworld"spec.version = Helloworld::VERSIONspec.authors = ["willnet"]spec.email = ["[email protected]"]spec.summary = %q{Hello World}spec.description = %q{Hello World gem for sample}spec.homepage = “https://github.com/willnet/helloworld”spec.license = "MIT"spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }endspec.bindir = "exe"spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }spec.require_paths = ["lib"]spec.add_development_dependency "bundler", "~> 1.17"spec.add_development_dependency "rake", "~> 10.0"spec.add_development_dependency "rspec", "~> 3.0"end
ґଘ͍ͯ͠Δgem͕͋Δͱ͖helloworld.gemspecʹॻ͖·͢ྫspec.add_dependency ‘rails’spec.add_development_dependency ‘gimei’
ϩʔΧϧڥʹΠϯετʔϧͯ͠ಈ࡞Λࢼ͍ͨ͠rake installrequire 'helloworld' #=> trueHelloworld.say #=> nilhello world!
ςετͷৄࡉͳॻ͖ํলུ͠·͢ςετ༻ͷσΟϨΫτϦ͕ੜ͞Ε͍ͯΔͷͰɺ͙͢ʹ͍ͭͷΑ͏ʹॻ͚·͢
ςετॻ͖·͠ΐ͏Ͷ ❤
gem͕ͨ͠
rubygems.orgʹϦϦʔε͢Δͧʂࣄલʹrubygems.orgͰΞΧϯτ࡞͓ͬͯ͘ඞཁ͋Δͣrake release
ࣾͰ͔͠Θͳ͍gemͬͯͲ͏ϗεςΟϯά͢Δͷʁ» githubgitlabʹίʔυΛϗεςΟϯά» Gemfileʹ࣍ͷΑ͏ʹॻ͍͓͚ͯOKgem ‘helloworld’, git: ‘https://github.com/willnet/helloworld.git'
gemʹΓग़ͤͦ͏ͳίʔυɺͲΜͲΜΓग़͍͖ͯ͠·͠ΐ͏!!!1