Slide 1

Slide 1 text

Always Be Bundling

Slide 2

Slide 2 text

Terence Lee @hone02

Slide 3

Slide 3 text

Austin, TX

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

Blue Hat Club

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

Ruby Task Force

Slide 8

Slide 8 text

Agenda ● What is Gem? ● Intermission ● Bundler ● Community

Slide 9

Slide 9 text

What is a Gem?

Slide 10

Slide 10 text

gem install $ gem install rack Fetching: rack-1.5.2.gem (100%) Successfully installed rack- 1.5.2 1 gem installed

Slide 11

Slide 11 text

Directory Layout

Slide 12

Slide 12 text

gem fetch $ gem fetch rack Fetching: rack-1.5.2.gem (100%) Downloaded rack-1.5.2 $ ls rack-1.5.2.gem

Slide 13

Slide 13 text

gem unpack $ gem unpack rack-1.5.2.gem Unpacked gem: '/tmp/rack-1.5.2' $ ls rack-1.5.2

Slide 14

Slide 14 text

$ tree ├── bin │ └── rackup ├── lib │ ├── rack │ │ ├── server.rb │ └── rack.rb ├── rack.gemspec ├── Rakefile ├── README.rdoc └── test ├── spec_lobster.rb

Slide 15

Slide 15 text

LOAD_PATH $ ruby -e "require 'pp';pp '$LOAD_PATH'" ["/home/hone/.rvm/rubies/ruby-2.1.2/lib/ruby/site_ruby/2.1.0", "/home/hone/.rvm/rubies/ruby-2.1.2/lib/ruby/site_ruby/2.1.0 /x86_64-linux", "/home/hone/.rvm/rubies/ruby-2.1.2/lib/ruby/site_ruby", "/home/hone/.rvm/rubies/ruby-2.1.2/lib/ruby/vendor_ruby/2.1.0", "/home/hone/.rvm/rubies/ruby-2.1.2/lib/ruby/vendor_ruby/2.1.0 /x86_64-linux", "/home/hone/.rvm/rubies/ruby-2.1.2/lib/ruby/vendor_ruby", "/home/hone/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0", "/home/hone/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/x86_64-linux"]

Slide 16

Slide 16 text

require require 'rack' ├── lib │ └── rack.rb require 'rack/auth/abstract/handler' ├── lib │ └── rack.rb │ │ ├── auth │ │ │ ├── abstract │ │ │ │ ├── handler.rb

Slide 17

Slide 17 text

Dependencies rspec ● rspec-core ~> 3.0.0 ● rspec-expectations ~> 3.0.0 ● rspec-mocks ~> 3.0.0

Slide 18

Slide 18 text

Operators

Slide 19

Slide 19 text

= "= 3.0.0": 3.0.0

Slide 20

Slide 20 text

> "> 3.0.0": 3.0.1, 3.1.0, 4.0

Slide 21

Slide 21 text

>= ">= 3.0.0": 3.0.0, > 3.0.0

Slide 22

Slide 22 text

<, <= "< 3.0.0": 2.9.0, 1.0.0 "<= 3.0.0"

Slide 23

Slide 23 text

~> (eat chunky bacon operator) ~> 3.0.0: >= 3.0.0, < 3.1.0 ~> 3.0.1: >= 3.0.1, < 3.1.0 ~> 3.1: >= 3.1.0, < 4.0.0 ~> 3: >= 3.0.0, < 4.0.0

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

No content

Slide 26

Slide 26 text

No content

Slide 27

Slide 27 text

Creating a Gem

Slide 28

Slide 28 text

bundle gem $ bundle gem new_gem create new_gem/Gemfile create new_gem/Rakefile create new_gem/LICENSE.txt create new_gem/README.md create new_gem/.gitignore create new_gem/new_gem.gemspec create new_gem/lib/new_gem.rb create new_gem/lib/new_gem/version.rb Initializing git repo in /tmp/new_gem

Slide 29

Slide 29 text

Rake Tasks $ cat Rakefile require "bundler/gem_tasks" $ rake -T rake build # Build new_gem-0.0.1.gem into the pkg directory rake install # Build and install new_gem-0.0.1. gem into system gems rake release # Create tag v0.0.1 and build and push new_gem-0.0.1.gem to Rubygems

Slide 30

Slide 30 text

rake build $ rake build new_gem 0.0.1 built to pkg/new_gem-0.0.1.gem. $ gem install pkg/new_gem-0.0.1.gem Successfully installed new_gem-0.0.1 1 gem installed

Slide 31

Slide 31 text

rake install $ rake install new_gem 0.0.1 built to pkg/new_gem- 0.0.1.gem. new_gem (0.0.1) installed.

Slide 32

Slide 32 text

rake release Let me introduce you to Jeff. Thanks!

Slide 33

Slide 33 text

Intermission

Slide 34

Slide 34 text

No content

Slide 35

Slide 35 text

bundle init $ bundle init Writing new Gemfile to /tmp/foobar/Gemfile $ cat Gemfile # A sample Gemfile source "https://rubygems.org" # gem "rails"

Slide 36

Slide 36 text

Gemfile source "https://rubygems.org" gem "rack", "1.4.0" gem "sinatra", github: "sinatra/sinatra" group :development, :test do gem "rspec" end

Slide 37

Slide 37 text

Gemfile source "https://rubygems.org" gem "rack", "1.4.0" gem "sinatra", github: "sinatra/sinatra" group :development, :test do gem "rspec" end

Slide 38

Slide 38 text

Gemfile source "https://rubygems.org" gem "rack", "1.4.0" gem "sinatra", github: "sinatra/sinatra" group :development, :test do gem "rspec" end

Slide 39

Slide 39 text

Gemfile source "https://rubygems.org" gem "rack", "1.4.0" gem "sinatra", github: "sinatra/sinatra" group :development, :test do gem "rspec" end

Slide 40

Slide 40 text

bundle install $ bundle install --path vendor/bundle Fetching git://github.com/sinatra/sinatra.git Fetching gem metadata from https://rubygems.org/......... Fetching additional metadata from https://rubygems.org/.. Resolving dependencies... Installing rspec-support 3.0.2 Installing diff-lcs 1.2.5 Using bundler 1.6.3 Installing tilt 1.4.1 Installing rspec-mocks 3.0.2 ... Installing rspec 3.0.0 Installing rack 1.4.0 (was 1.5.2) Installing rack-protection 1.5.3 Using sinatra 1.4.5 from git://github.com/sinatra/sinatra.git (at master) Your bundle is complete!

Slide 41

Slide 41 text

bundle update source "https://rubygems.org" gem "rack", "1.5.2" gem "sinatra", github: "sinatra/sinatra" group :development, :test do gem "rspec" end

Slide 42

Slide 42 text

bundle update $ bundle install Fetching gem metadata from https://rubygems. org/......... Fetching additional metadata from https: //rubygems.org/.. Resolving dependencies... You have requested: rack = 1.5.2 The bundle currently has rack locked at 1.4.0. Try running `bundle update rack`

Slide 43

Slide 43 text

bundle update $ bundle update rack Fetching gem metadata from https://rubygems.org/......... Fetching additional metadata from https://rubygems.org/.. Resolving dependencies... Using diff-lcs 1.2.5 Using rspec-support 3.0.2 Using tilt 1.4.1 Using bundler 1.6.2 Using rspec-expectations 3.0.2 Using rspec-mocks 3.0.2 Using rspec-core 3.0.2 Using rspec 3.0.0 Installing rack 1.5.2 (was 1.4.0) Using rack-protection 1.5.3 Using sinatra 1.4.5 from git://github.com/sinatra/sinatra.git (at master) Your bundle is updated!

Slide 44

Slide 44 text

Why do we need this?

Slide 45

Slide 45 text

Dark Old Days config.gem "paperclip", "1.0.0" config.gem "rspec", "1.2.4" config.gem "cucumber", "0.9.8"

Slide 46

Slide 46 text

Gemfile.lock GIT remote: git://github.com/sinatra/sinatra.git revision: 27302f1e2a204278ae1996829ba3c8c54a3af254 specs: sinatra (1.4.5) rack (~> 1.4) rack-protection (~> 1.4) tilt (~> 1.3, >= 1.3.4)

Slide 47

Slide 47 text

GEM remote: https://rubygems.org/ specs: diff-lcs (1.2.5) rack (1.5.2) rack-protection (1.5.3) rack rspec (3.0.0) rspec-core (~> 3.0.0) rspec-expectations (~> 3.0.0) rspec-mocks (~> 3.0.0) rspec-core (3.0.2) rspec-support (~> 3.0.0) rspec-expectations (3.0.2) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.0.0) rspec-mocks (3.0.2) rspec-support (~> 3.0.0) rspec-support (3.0.2) tilt (1.4.1)

Slide 48

Slide 48 text

PLATFORMS ruby DEPENDENCIES rack (= 1.5.2) rspec sinatra!

Slide 49

Slide 49 text

Exact same versions of all third party code on every machine

Slide 50

Slide 50 text

require "bundler/setup" $ ruby -e "require 'pp';require 'bundler/setup';pp $:" ["/tmp/foo/vendor/bundle/ruby/2.1.0/gems/rack-1.5.2/lib", "/home/hone/.rvm/gems/ruby-2.1.2@global/gems/bundler-1.6.2 /lib/gems/bundler-1.6.2/lib", "/home/hone/.rvm/gems/ruby-2.1.2 @global/gems/bundler-1.6.2/lib", "/home/hone/.rvm/rubies/ruby-2.1.2/lib/ruby/site_ruby/2.1.0", "/home/hone/.rvm/rubies/ruby-2.1.2/lib/ruby/site_ruby/2.1.0 /x86_64-linux", "/home/hone/.rvm/rubies/ruby-2.1.2/lib/ruby/site_ruby", "/home/hone/.rvm/rubies/ruby-2.1.2/lib/ruby/vendor_ruby/2.1.0", "/home/hone/.rvm/rubies/ruby-2.1.2/lib/ruby/vendor_ruby/2.1.0 /x86_64-linux", "/home/hone/.rvm/rubies/ruby-2.1.2/lib/ruby/vendor_ruby", "/home/hone/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0", "/home/hone/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/x86_64-linux"]

Slide 51

Slide 51 text

Community

Slide 52

Slide 52 text

“I almost feel like Ruby is one of my children, but in fact, it is the result of the combined efforts of many people. Without their help, Ruby could never have become what it is.” - Yukihiro Matsumoto, “Matz”, まつもとゆきひろ

Slide 53

Slide 53 text

Language has a grammar. But it also has a culture. It shapes the way we experience world.

Slide 54

Slide 54 text

“Speak a new language so that the world will be a new world.” - Rumi

Slide 55

Slide 55 text

← Matz

Slide 56

Slide 56 text

“I hope to see Ruby help every programmer in the world to be productive, and to enjoy programming, and to be happy. That is the primary purpose of Ruby language.” - Yukihiro Matsumoto, “Matz”, まつもとゆきひろ

Slide 57

Slide 57 text

← ko1

Slide 58

Slide 58 text

nobu → Patch Monster

Slide 59

Slide 59 text

Top 5 Committers $ git shortlog -s --since=2012 | sort -rn | \ head -6 2739 nobu <--- 867 akr 710 svn 635 ko1 596 naruse 448 zzak

Slide 60

Slide 60 text

@_zzak

Slide 61

Slide 61 text

@indirect

Slide 62

Slide 62 text

Friday Hug! @tenderlove

Slide 63

Slide 63 text

EuRuKo 2012 - Amsterdam

Slide 64

Slide 64 text

@gorbypuff

Slide 65

Slide 65 text

#rubykaraoke ← @headius @plexus →

Slide 66

Slide 66 text

Chunky Bacon Cartoon Foxes

Slide 67

Slide 67 text

Why Day August 19, 2009

Slide 68

Slide 68 text

Jim Weirich http://www.confreaks.com/videos/412- mountainrb2010-has-anyone-seen-my-code

Slide 69

Slide 69 text

Inspire. Create. Explore.

Slide 70

Slide 70 text

Thank You ありがとがざいます @hone02 terence@heroku.com