Slide 1

Slide 1 text

Carmel Yet another CPAN dependencies management tool Tatsuhiko Miyagawa YAPC::EU 2015

Slide 2

Slide 2 text

Me • MIYAGAWA, @miyagawa • San Francisco, CA, United States • Perl, Ruby

Slide 3

Slide 3 text

Agenda • Why manage CPAN dependencies • Introduction of tools • Demo • Future Plans

Slide 4

Slide 4 text

Carton Bundler(-ish) for Perl

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

(quick recap)

Slide 7

Slide 7 text

 @local>  cpanm  Poles   Installed  Poles-­‐1.0.tar.gz   @remote>  cpanm  Poles   Installed  Poles-­‐2.1.tar.gz

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

“Updating CPAN modules broke my app”

Slide 10

Slide 10 text

Takeaway • CPAN dependencies = Your app • Describe it • Manage it • Version Control it

Slide 11

Slide 11 text

cpanfile

Slide 12

Slide 12 text

cpanfile • DSL to describe CPAN dependencies • Version Range, Phases • a la Gemfile • Module::CPANfile • Supported by many tools (cpanm)

Slide 13

Slide 13 text

requires  'Plack',  '1.001';   requires  'Mojolicious',  '==  6.17';   on  'develop'  =>  sub  {      requires  'Devel::NYTProf';   };   on  'test'  =>  sub  {      requires  'Test::More';      requires  'Test::mysql';   };

Slide 14

Slide 14 text

requires  'Plack',  '1.001';   requires  'Mojolicious',  '==  6.17';   on  'develop'  =>  sub  {      requires  'Devel::NYTProf';   };   on  'test'  =>  sub  {      requires  'Test::More';      requires  'Test::mysql';   };

Slide 15

Slide 15 text

requires  'Plack',  '1.001';   requires  'Mojolicious',  '==  6.17';   on  'develop'  =>  sub  {      requires  'Devel::NYTProf';   };   on  'test'  =>  sub  {      requires  'Test::More';      requires  'Test::mysql';   };

Slide 16

Slide 16 text

>  cpanm  -­‐-­‐installdeps  .

Slide 17

Slide 17 text

cpanm + cpanfile • Grabs latest versions that satisfy ranges • '== version' can pin versions • cpanmetadb/MetaCPAN SPOF

Slide 18

Slide 18 text

Carton Bundler(-ish) for Perl

Slide 19

Slide 19 text

Carton + cpanfile • Installs into ./local • Creates cpanfile.snapshot • Git friendly • carton  install  -­‐-­‐deployment

Slide 20

Slide 20 text

requires  'Poles',  '1.0';  

Slide 21

Slide 21 text

 @local>  carton  install   Installed  Poles-­‐1.0.tar.gz   @remote>  carton  install  -­‐-­‐deployment   Installed  Poles-­‐1.0.tar.gz

Slide 22

Slide 22 text

No content

Slide 23

Slide 23 text

Carton 1.0 released in late 2013 1.1 was in the development

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

Carton • Slow for large installs • Relies on cpanm internals • Git support is hard • Update/Rollback is unreliable • -­‐-­‐deployment is confusing • carton  exec doesn't check on development

Slide 26

Slide 26 text

Carmel Yet another Bundler for Perl

Slide 27

Slide 27 text

Carmel • Same UI/UX with Carton • Different internals • Rewritten from scratch • Deeper understandings of how Bundler works • Fast and Reliable

Slide 28

Slide 28 text

blib The core of Carmel

Slide 29

Slide 29 text

How to build a CPAN module • Configure • Build • Test (Optional) • Install

Slide 30

Slide 30 text

How to build a CPAN module • perl  Makefile.PL   • make   • make  test   • make  install

Slide 31

Slide 31 text

➜  perl  Makefile.PL     Checking  if  your  kit  is  complete...   Looks  good   Generating  a  Unix-­‐style  Makefile   Writing  Makefile  for  Try::Tiny   Writing  MYMETA.yml  and  MYMETA.json   ➜  make   cp  lib/Try/Tiny.pm  blib/lib/Try/Tiny.pm   Manifying  1  pod  document  

Slide 32

Slide 32 text

➜  perl  Makefile.PL     Checking  if  your  kit  is  complete...   Looks  good   Generating  a  Unix-­‐style  Makefile   Writing  Makefile  for  Try::Tiny   Writing  MYMETA.yml  and  MYMETA.json   ➜  make   cp  lib/Try/Tiny.pm  blib/lib/Try/Tiny.pm   Manifying  1  pod  document  

Slide 33

Slide 33 text

blib/{lib,arch} Can be pushed to @INC   CPAN.pm does it for ages

Slide 34

Slide 34 text

The idea • Builds all modules without installing them • Manages these "blib"s (call them artifacts) • Chooses artifact paths dynamically on dev • Freezes artifact paths statically on prod

Slide 35

Slide 35 text

Carmel Written in a few hours as a hack. Turned into a module at Berlin QA Hackathon.

Slide 36

Slide 36 text

DEMO

Slide 37

Slide 37 text

Commands • carmel install • carmel list/tree • carmel exec • carmel package • carmel rollout • carmel inject

Slide 38

Slide 38 text

Tools • carmel exec • Carmel::Setup • Carmel::Preload

Slide 39

Slide 39 text

No content

Slide 40

Slide 40 text

Current status • pre-1.0 • Usable (I use it on cpanmetadb production) • Snapshot support in development

Slide 41

Slide 41 text

>  cpanm  Carmel  

Slide 42

Slide 42 text

>  cpanm  Carmel   Successfully  installed  Menlo-­‐1.9001   Successfully  installed  Carmel-­‐v0.1.25   2  distributions  installed  

Slide 43

Slide 43 text

>  cpanm  Carmel   Successfully  installed  Menlo-­‐1.9001   Successfully  installed  Carmel-­‐v0.1.25   2  distributions  installed  

Slide 44

Slide 44 text

Menlo

Slide 45

Slide 45 text

Menlo "cpanm 2.0"

Slide 46

Slide 46 text

cpanm • Loved by the users • Mixed feelings by the developer (me) • God class, Hard to refactor • Grown out of a pre-fatpack single script • Not extensible

Slide 47

Slide 47 text

Menlo • Modular, Scriptable, Object-Oriented APIs • Plugin Hooks • uses CPAN::Common::* • Extracts the common bits (e.g. HTTP::Tinyish) • Still bootstrappable with fatpack/vendoring

Slide 48

Slide 48 text

>  cpanm  Menlo   >  cpanm-­‐menlo  Plack

Slide 49

Slide 49 text

Current status • github.com/miyagawa/cpanminus @ menlo • New features (static installs) • Pre big refactoring • No plugins

Slide 50

Slide 50 text

2.0 planned for QAH 2016 ... but with continuous 1.9x releases

Slide 51

Slide 51 text

github.com/miyagawa

Slide 52

Slide 52 text

irc.perl.org #cpanm

Slide 53

Slide 53 text

Thank you. Questions?

Slide 54

Slide 54 text

FAQ • Why Carmel/Menlo? • 1.0/2.0 ETA? • Is Carton deprecated? • What's the purple thing in your avatar?