Ruby and Python
Packaging and Environment
Jimmy Cuadra
Slide 2
Slide 2 text
Packaging concerns
Slide 3
Slide 3 text
1.
Creation, Discovery,
Installation
Slide 4
Slide 4 text
2.
Dependency
Specification
Slide 5
Slide 5 text
3.
Environment
Isolation
Slide 6
Slide 6 text
Creation, Discovery,
Installation
Slide 7
Slide 7 text
Creation
P Y T H O N
Slide 8
Slide 8 text
distutils
!
!
P Y T H O N
Slide 9
Slide 9 text
distutils
setuptools
!
P Y T H O N
Slide 10
Slide 10 text
distutils
setuptools
distribute
P Y T H O N
Slide 11
Slide 11 text
distutils
setuptools
distribute
setuptools
P Y T H O N
Slide 12
Slide 12 text
# setup.py
from setuptools import setup
!
setup(
name=‘my_package’,
version=‘1.0.0’,
description=‘Does stuff!’,
)
P Y T H O N
Slide 13
Slide 13 text
$ python setup.py sdist upload
P Y T H O N
Slide 14
Slide 14 text
Discovery & Installation
P Y T H O N
Slide 15
Slide 15 text
No content
Slide 16
Slide 16 text
easy_install (setuptools)
P Y T H O N
Slide 17
Slide 17 text
easy_install (setuptools)
pip
P Y T H O N
Slide 18
Slide 18 text
$ pip search flask
Flask - A microframework based on Werkzeug,
Jinja2 and good intentions
clay-flask - Clay is a framework for building
RESTful backend services using best
practices.
Flask-RESTful - Simple framework for creating REST
APIs
P Y T H O N
Slide 19
Slide 19 text
$ pip install Flask
Downloading/unpacking Flask
Downloading Flask-0.10.1.whl (115kB): 115kB downloaded
!
...
!
Successfully installed flask itsdangerous Werkzeug Jinja2
markupsafe
Cleaning up...
P Y T H O N
Slide 20
Slide 20 text
Creation, Discovery &
Installation
R U B Y
Slide 21
Slide 21 text
RubyGems
does it all
R U B Y
Slide 22
Slide 22 text
R U B Y
# my_gem.gemspec
Gem::Specification.new do |spec|
spec.name = “my_gem”
spec.version = “1.0.0”
spec.description = “Does stuff!”
end
Slide 23
Slide 23 text
$ gem build my_gem.gemspec
$ gem push pkg/my_gem-1.0.0.gem
R U B Y
Slide 24
Slide 24 text
No content
Slide 25
Slide 25 text
R U B Y
$ gem search rails
!
*** REMOTE GEMS ***
!
rails (4.1.4)
rails-api (0.2.1)
rails_admin (0.6.2)
...
Slide 26
Slide 26 text
R U B Y
$ gem install rails
!
Fetching: thread_safe-0.3.4.gem (100%)
Successfully installed thread_safe-0.3.4
...
Fetching: sprockets-2.12.1.gem (100%)
Successfully installed sprockets-2.12.1
Fetching: sprockets-rails-2.1.3.gem (100%)
Successfully installed sprockets-rails-2.1.3
Fetching: rails-4.1.4.gem (100%)
Slide 27
Slide 27 text
Dependency
Specification
Slide 28
Slide 28 text
Dependency
Specification
P Y T H O N
Slide 29
Slide 29 text
pip
P Y T H O N
Slide 30
Slide 30 text
requirements.txt
P Y T H O N
Slide 31
Slide 31 text
$ pip freeze -l > requirements.txt
P Y T H O N
Slide 32
Slide 32 text
# requirements.txt
coverage==3.7.1
flake8==2.1.0
mock==1.0.1
pyroma==1.6
pytest==2.5.2
nose==1.3.3
Sphinx==1.2.2
sphinx-rtd-theme==0.1.6
P Y T H O N
Slide 33
Slide 33 text
$ pip install -r requirements.txt
P Y T H O N
Slide 34
Slide 34 text
Requirements file
per environment
P Y T H O N
Slide 35
Slide 35 text
Dependency
Specification
R U B Y
Slide 36
Slide 36 text
Bundler
R U B Y
Slide 37
Slide 37 text
Gemfile
Gemfile.lock
R U B Y
Slide 38
Slide 38 text
R U B Y
# Gemfile
source 'https://rubygems.org'
!
gem 'rails'
!
group :test do
gem 'rspec'
end
Slide 39
Slide 39 text
R U B Y
$ bundle
Fetching gem metadata from https://rubygems.org/.........
Fetching additional metadata from https://rubygems.org/..
Resolving dependencies...
Installing rake 10.3.2
Installing i18n 0.6.11
...
Installing rails 4.1.4
Installing rspec 3.0.0
Your bundle is complete!
Use `bundle show [gemname]` to see where a bundled gem is installed.
Slide 40
Slide 40 text
R U B Y
# Gemfile.lock
GEM
remote: https://rubygems.org/
specs:
rails (4.1.4)
actionmailer (= 4.1.4)
actionpack (= 4.1.4)
...
railties (= 4.1.4)
sprockets-rails (~> 2.0)
rspec (3.0.0)
rspec-core (~> 3.0.0)
rspec-expectations (~> 3.0.0)
rspec-mocks (~> 3.0.0)
Slide 41
Slide 41 text
R U B Y
# Gemfile
source 'https://rubygems.org'
!
gem ‘rails’, ‘~> 4.0.5’
!
group :test do
gem 'rspec'
end
Slide 42
Slide 42 text
$ bundle update rails
R U B Y
Slide 43
Slide 43 text
$ bundle --without development:test
R U B Y
Slide 44
Slide 44 text
Environment Isolation
Slide 45
Slide 45 text
Locking the Runtime
P Y T H O N
Slide 46
Slide 46 text
virtualenv
P Y T H O N
Slide 47
Slide 47 text
$ pip install virtualenv
P Y T H O N
Slide 48
Slide 48 text
$ virtualenv env
P Y T H O N
Slide 49
Slide 49 text
$ source env/bin/activate
P Y T H O N
Slide 50
Slide 50 text
$ deactivate
P Y T H O N
Slide 51
Slide 51 text
Using a different
version of Python
P Y T H O N
Slide 52
Slide 52 text
$ /path/to/python -m virtualenv env
P Y T H O N
Slide 53
Slide 53 text
Does not install Python
P Y T H O N
Slide 54
Slide 54 text
Other options
P Y T H O N
Slide 55
Slide 55 text
virtualenvwrapper
P Y T H O N
Slide 56
Slide 56 text
pyenv
P Y T H O N
Slide 57
Slide 57 text
Locking the Runtime
R U B Y
Slide 58
Slide 58 text
rbenv + ruby-build
R U B Y
Slide 59
Slide 59 text
$ brew install rbenv ruby-build
R U B Y
Slide 60
Slide 60 text
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
R U B Y
Slide 61
Slide 61 text
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
R U B Y
Slide 62
Slide 62 text
$ rbenv install 2.1.2
R U B Y
Slide 63
Slide 63 text
$ rbenv global 2.1.2
R U B Y
Slide 64
Slide 64 text
$ cd my_ruby_project
$ echo ‘2.1.2’ > .ruby-version
R U B Y
Slide 65
Slide 65 text
Other options
R U B Y
Slide 66
Slide 66 text
RVM
R U B Y
Slide 67
Slide 67 text
chruby
R U B Y
Slide 68
Slide 68 text
Isolating Dependencies
P Y T H O N
Slide 69
Slide 69 text
virtualenv + pip
P Y T H O N
Slide 70
Slide 70 text
$ pip install -r requirements.txt
P Y T H O N
Slide 71
Slide 71 text
Updating dependencies
P Y T H O N
Slide 72
Slide 72 text
Edit requirements.txt and
rerun pip install
P Y T H O N
Slide 73
Slide 73 text
Previous versions of packages
are overwritten
P Y T H O N
Slide 74
Slide 74 text
Multiple projects with the
same version of Python
P Y T H O N
Slide 75
Slide 75 text
Multiple virtualenvs
P Y T H O N
Slide 76
Slide 76 text
Python version is lost
when sharing
P Y T H O N
Slide 77
Slide 77 text
Isolating Dependencies
R U B Y
Slide 78
Slide 78 text
Multiple versions of the same
gem installed at the same time
R U B Y
Slide 79
Slide 79 text
Bundler
R U B Y
Slide 80
Slide 80 text
Uses the Gemfile.lock
to activate the correct versions
R U B Y
Slide 81
Slide 81 text
$ bundle exec rails
R U B Y
Slide 82
Slide 82 text
Requires you to constantly
prefix commands
R U B Y
Slide 83
Slide 83 text
$ bundle --binstubs
$ bin/rails
R U B Y
Slide 84
Slide 84 text
Does not conflate
runtime version with
dependency isolation
R U B Y
Slide 85
Slide 85 text
Runtime version and
dependency versions
are easily shared
R U B Y
Slide 86
Slide 86 text
Recap
Slide 87
Slide 87 text
setuptools + pip
pip
virtualenv
R U B Y
RubyGems
Bundler
rbenv + Bundler
P Y T H O N