summaryrefslogtreecommitdiff
path: root/v1.3/bundler_sharing.html
blob: a292d7ab24c230d87afdd6fd4d28f99c1cbadaad (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
<!DOCTYPE html>
<html>
  <head>
    <title>Bundler: The best way to manage a Ruby application's gems</title>
    <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'>
    <meta content='276VSYOko8B8vIu1i8i5qbj7_ql5PXo0dU69XQy-SL' name='globalsign-domain-verification'>
    <link href='/images/favicon.png' rel='shortcut icon' type='image/png'>
    <link href="/stylesheets/application.css" media="screen" rel="stylesheet" type="text/css" />
  </head>
  <body>
    <div id='body'>
      <div id='header'>
        <a class="image" href="/"><img width="725" alt="The best way to manage your application's dependencies" src="/images/gembundler.png" /></a>
      </div>
      <div id='container'>
        <div id='contents'>
          <h2 id='sharing'>
            Sharing
            <h3 id='checking-your-code-into-version-control'>
              Checking Your Code into Version Control
            </h3>
            <p>
              After developing your application for a while, check in the application together with the
              <code>Gemfile</code> and <code>Gemfile.lock</code> snapshot. Now, your repository has a
              record of the exact versions of all of the gems that you used the last time you know for
              sure that the application worked. Keep in mind that while your <code>Gemfile</code>
              lists only three gems (with varying degrees of version strictness), your application
              depends on dozens of gems, once you take into consideration all of the implicit
              requirements of the gems you depend on.
            </p>
            <p>
              This is important: <strong>the <code>Gemfile.lock</code> makes your application a single
              package of both your own code and the third-party code it ran the last time you know for
              sure that everything worked</strong>. Specifying exact versions of the third-party code
              you depend on in your <code>Gemfile</code> would not provide the same guarantee, because
              gems usually declare a range of versions for their dependencies.
            </p>
            <p>
              The next time you run <code>bundle install</code> on the same machine, bundler will see
              that it already has all of the dependencies you need, and skip the installation process.
            </p>
            <p>
              Do not check in the <code>.bundle</code> directory, or any of the files inside it. Those
              files are specific to each particular machine, and are used to persist installation options
              between runs of the <code>bundle install</code> command.
            </p>
            <p>
              If you have run <code>bundle pack</code>, the gems (although not the git gems) required
              by your bundle will be downloaded into <code>vendor/cache</code>. Bundler can run without
              connecting to the internet (or the Rubygems server) if all the gems you need are present
              in that folder and checked in to your source control. This is an <strong>optional</strong>
              step, and not recommended, due to the increase in size of your source control repository.
            </p>
            <h3 id='sharing-your-application-with-other-developers'>
              Sharing Your Application With Other Developers
            </h3>
            <p>
              When your co-developers (or you on another machine) check out your code, it will come
              with the exact versions of all the third-party code your application used on the machine
              that you last developed on (in the <code>Gemfile.lock</code>). When **they** run
              <code>bundle install</code>, bundler will find the <code>Gemfile.lock</code> and skip
              the dependency resolution step. Instead, it will install all of the same gems that you
              used on the original machine.
            </p>
            <p>
              In other words, you don't have to guess which versions of the dependencies you should
              install. In the example we've been using, even though <code>rack-cache</code> declares a
              dependency on <code>rack >= 0.4</code>, we know for sure it works with <code>rack
              1.2.1</code>. Even if the Rack team releases <code>rack 1.2.2</code>, bundler will
              always install <code>1.2.1</code>, the exact version of the gem that we know works. This
              relieves a large maintenance burden from application developers, because all machines
              always run the exact same third-party code.
            </p>
          </h2>
        </div>
      </div>
    </div>
    <div id='footer'>
      <img src="/images/emocow.png" />
      <img src="/images/panda.jpg" />
      <div class='spacer'></div>
      <div id='credits'>
        <p>
          Many thanks to Bundler's <a href="/contributors.html">contributors</a>
          and <a href="/sponsors.html">sponsors</a>
        </p>
      </div>
      <div class='spacer'></div>
      <img src="/images/bundler-small.png" />
    </div>
    <a href='http://github.com/bundler/bundler/' id='github'>
      <img alt='Fork me on GitHub' src='http://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png'>
    </a>
    <div id='prod-versions'>
      Docs:
      <a href="/v0.9/">v0.9</a>
      <a href="/v1.0/">v1.0</a>
      <a href="/v1.1/">v1.1</a>
      <a href="/v1.2/">v1.2</a>
      <a class="current" href="/v1.3/">v1.3</a>
      <a href="/v1.5/index.html">v1.5</a>
      <a href="/">v1.6</a>
    </div>
    <script>
      (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
      (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
      m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
      })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
      ga('create', 'UA-39559982-1', 'bundler.io');
      ga('send', 'pageview');
    </script>
  </body>
</html>