Slide 1

Slide 1 text

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

Slide 88

Slide 88 text

Thanks @jimmycuadra