$30 off During Our Annual Pro Sale. View Details »

Managing CPAN dependencies with Carton

Managing CPAN dependencies with Carton

at Nordic Perl Workshop 2013

Tatsuhiko Miyagawa

November 23, 2013
Tweet

More Decks by Tatsuhiko Miyagawa

Other Decks in Technology

Transcript

  1. Carton
    managing CPAN dependencies
    Tatsuhiko Miyagawa
    @miyagawa
    Nordic Perl Workshop 2013
    Saturday, November 23, 13

    View Slide

  2. Me
    • Tatsuhiko Miyagawa
    • Lives in San Francisco
    • {github,twitter,CPAN}/miyagawa
    Saturday, November 23, 13

    View Slide

  3. Thank You!
    Saturday, November 23, 13

    View Slide

  4. Managing CPAN
    Dependencies
    Saturday, November 23, 13

    View Slide

  5. How many CPAN modules
    your app depends on?
    Saturday, November 23, 13

    View Slide

  6. When is the last time
    upgrading a CPAN
    module broke your app?
    Saturday, November 23, 13

    View Slide

  7. Case Study:
    Web App Development
    Saturday, November 23, 13

    View Slide

  8. You’re writing a new web app
    using as many CPAN modules.
    Saturday, November 23, 13

    View Slide

  9. Get them from CPAN,
    install on your machine.
    Saturday, November 23, 13

    View Slide

  10. john@local>  cpanm  Web::Framework
    installed  LWP-­‐5.912
    installed  Plack-­‐0.9980
    installed  Web-­‐Framework-­‐1.10
    Saturday, November 23, 13

    View Slide

  11. Test it...
    Saturday, November 23, 13

    View Slide

  12. Works? Ship it!
    Saturday, November 23, 13

    View Slide

  13. What if ...
    Saturday, November 23, 13

    View Slide

  14. • Jul 2nd: Started working on project
    • using Web::Framework 1.1
    • Jul 9th: Finished version 1.0
    • Jul 10-15th: internal beta, QA
    • Jul 16th: Deploy to the production
    Saturday, November 23, 13

    View Slide

  15. • Jul 2nd: Started working on project
    • using Web::Framework 1.1
    • Jul 9th: Finished version 1.0
    • Jul 10-15th: internal beta, QA
    • Jul 15th: Web::Framework 1.2 is released
    • Jul 16th: Deploy to the cloud/production
    Saturday, November 23, 13

    View Slide

  16. root@prod>  cpanm  Web::Framework
    installed  LWP-­‐5.912
    installed  Plack-­‐0.9980
    installed  Web-­‐Framework-­‐1.20
    Saturday, November 23, 13

    View Slide

  17. Web::Framework 1.2
    API changes!
    Saturday, November 23, 13

    View Slide

  18. Saturday, November 23, 13

    View Slide

  19. Saturday, November 23, 13

    View Slide

  20. “Upgrading CPAN modules
    broke my app”
    Saturday, November 23, 13

    View Slide

  21. Dependencies are
    part of your app.
    Saturday, November 23, 13

    View Slide

  22. a solution
    cpanm 1.6
    Saturday, November 23, 13

    View Slide

  23. >  cpanm  Web::[email protected]
    installed  Web-­‐Framework-­‐1.10
    Saturday, November 23, 13

    View Slide

  24. >  cpanm  Web::Framework~">=  1.0,  <  1.2"
    installed  Web-­‐Framework-­‐1.19
    Saturday, November 23, 13

    View Slide

  25. ♥ MetaCPAN
    Saturday, November 23, 13

    View Slide

  26. a solution
    cpanfile + cpanm 1.6
    Saturday, November 23, 13

    View Slide

  27. >  cat  cpanfile
    requires  'Web::Framework',  '==  1.10';
    >  cpanm  -­‐-­‐installdeps  .
    installed  Web-­‐Framework-­‐1.10
    Saturday, November 23, 13

    View Slide

  28. cpanfile
    DSL to describe prereqs
    Saturday, November 23, 13

    View Slide

  29. requires  'Catalyst',  '5.8000';  
    recommends  'JSON::XS',  '2.0';
    on  'test'  =>  sub  {
       requires  'Test::More',  '>=  0.96'
    };
    on  'develop'  =>  sub  {
       recommends  'Devel::NYTProf';
    };
    feature  'sqlite'  =>  sub  {
       requires  'DBD::SQLite';
    };
    Saturday, November 23, 13

    View Slide

  30. inspired by:
    gemfile(5)
    Saturday, November 23, 13

    View Slide

  31. Compatible to:
    Module::Install(::DSL)
    Saturday, November 23, 13

    View Slide

  32. Converted to:
    CPAN::Meta::Prereqs
    Saturday, November 23, 13

    View Slide

  33. Toolset
    Module::CPANfile
    Module::Install::CPANfile
    Dist::Zilla plugins
    Saturday, November 23, 13

    View Slide

  34. Supported by
    dzil, Milla & cpanm 1.6
    Saturday, November 23, 13

    View Slide

  35. cpanfile + cpanm
    • Simple
    • Yet powerful and flexible way to describe
    dependencies and version requirements
    • Version control cpanfile
    Saturday, November 23, 13

    View Slide

  36. caveats
    • Locking each dependency with specific
    version is tedious work
    • Can only lock direct dependencies
    • MetaCPAN as SPOF
    • No easy/reliable way to fallback
    Saturday, November 23, 13

    View Slide

  37. Many other solutions
    Needs servers, Needs databases
    Too simple, Too complicated, etc.
    Saturday, November 23, 13

    View Slide

  38. the new Solution
    Saturday, November 23, 13

    View Slide

  39. Carton
    https://github.com/miyagawa/carton
    Saturday, November 23, 13

    View Slide

  40. Inspired by...
    Saturday, November 23, 13

    View Slide

  41. Saturday, November 23, 13

    View Slide

  42. Basic idea:
    Describe CPAN dependencies
    snapshot tarball pathnames
    Saturday, November 23, 13

    View Slide

  43. Built on top of:
    cpanfile + cpanm 1.7
    Saturday, November 23, 13

    View Slide

  44. • App-specific local environment
    • Fast and safe install with caches
    • Dep-tree analysis, including versions
    • Freezing module versions
    • Conservative updates
    • Easy Redeployment, Rollback
    • Single-file, VCS friendly
    Saturday, November 23, 13

    View Slide

  45. Local perl environment
    Using local::lib and cpanm -L
    Each app has an isolated local library path
    Saturday, November 23, 13

    View Slide

  46. Fast and safe install
    Saves MYMETA.json and install meta info
    Saturday, November 23, 13

    View Slide

  47. Dep tree analysis
    Rebuild the dependency tree from snapshot
    Checks if anything is missing/superfluous
    Saturday, November 23, 13

    View Slide

  48. Freezing versions
    Versions are saved in snapshots
    including dependencies
    Saturday, November 23, 13

    View Slide

  49. Easy Redeployment
    Reinstall exactly the same set of modules
    on another prod/development machines.
    Saturday, November 23, 13

    View Slide

  50. Conservative Update
    Modules won't be upgraded
    unless it is required, or manually updated.
    Saturday, November 23, 13

    View Slide

  51. Single-file, VCS friendly
    You can add cpanfile.snapshot to git
    update whenever you update modules
    "Dependencies are part of your app."
    Saturday, November 23, 13

    View Slide

  52. Safe and easy rollback
    revert the lock file and redeploy
    Saturday, November 23, 13

    View Slide

  53. DEMO
    Saturday, November 23, 13

    View Slide

  54. Deployment
    with Carton
    Saturday, November 23, 13

    View Slide

  55.  @local>  carton  install
     @local>  git  commit  cpanfile.snapshot
     @local>  git  push
    @remote>  carton  install  -­‐-­‐deployment
    @remote>  carton  exec  plackup  ...
    Saturday, November 23, 13

    View Slide

  56. Example:
    github.com/miyagawa/cpanmetadb-perl
    capistrano, Server::Starter,
    carton, plackup (twiggy)
    Saturday, November 23, 13

    View Slide

  57. PaaS/Cloud
    github.com/miyagawa/heroku-buildpack-perl
    Saturday, November 23, 13

    View Slide

  58. Saturday, November 23, 13

    View Slide

  59. http://weblog.bulknews.net
    Saturday, November 23, 13

    View Slide

  60. Support to come!
    Dokku, DotCloud, Travis CI,
    Cloud Foundry etc.
    Saturday, November 23, 13

    View Slide

  61. carton 1.0
    on CPAN
    Saturday, November 23, 13

    View Slide

  62. >  cpanm  Carton
    Saturday, November 23, 13

    View Slide

  63. Preview:
    next major releases
    Saturday, November 23, 13

    View Slide

  64. cpanm 1.8
    git (+ any URL)
    support in index
    Saturday, November 23, 13

    View Slide

  65. cpanfile 1.1
    git syntax support
    Saturday, November 23, 13

    View Slide

  66. requires  'Plack',  '1.0000',
       git  =>  'git://github.com/plack/Plack.git',
       ref  =>  'devel';
    carton 1.1
    Saturday, November 23, 13

    View Slide

  67. requires  'Plack',  '1.0011',
       dist  =>  'MIYAGAWA/Plack-­‐1.0011.tar.gz';
    carton 1.1
    Saturday, November 23, 13

    View Slide

  68. requires  'Plack',  '1.0011',
       dist  =>  'http://darkpan/Plack-­‐1.tar.gz';
    carton 1.1
    Saturday, November 23, 13

    View Slide

  69. (demo)
    Saturday, November 23, 13

    View Slide

  70. cpanm 1.8
    • Rewrite internals
    • Backend API
    • Plugin support
    • CPAN Testers support (via plugins)
    Saturday, November 23, 13

    View Slide

  71. carton 1.1
    • binstubs
    • configure args/hints support
    • safe exec on development
    • remember options (--path etc.)
    Saturday, November 23, 13

    View Slide

  72. github.com/miyagawa/carton
    irc.perl.org #carton
    Saturday, November 23, 13

    View Slide

  73. speakerdeck.com
    /miyagawa
    Saturday, November 23, 13

    View Slide

  74. gum.co/BmXz
    Saturday, November 23, 13

    View Slide

  75. Questions?
    Saturday, November 23, 13

    View Slide