Carton
                            Tatsuhiko Miyagawa
                           YAPC::Asia 2011 Tokyo




Friday, October 14, 2011
Managing CPAN
                            Dependencies


Friday, October 14, 2011
Case Study:
                           (Poor) Web Development




Friday, October 14, 2011
You’re writing a new web app.
                           You don’t wanna reinvent wheels.
                           Want to use as many CPAN deps.




Friday, October 14, 2011
Fine.
                            Get them from CPAN,
                           install on your machine.



Friday, October 14, 2011
>	
  cpanm	
  Web::Framework
               installed	
  LWP-­‐5.912
               installed	
  Plack-­‐0.9980
               installed	
  Web-­‐Framework-­‐1.20
               >	
  cpanm	
  JSON::Fast
               installed	
  JSON-­‐Fast-­‐1.91
               >	
  cpanm	
  MIME::Parser::XS
               installed	
  MIME-­‐Parser-­‐XS-­‐0.20




Friday, October 14, 2011
Test it...



Friday, October 14, 2011
Works? Ship it!



Friday, October 14, 2011
Deployment
                           Set up new production servers.
                                Install CPAN modules
                             (until the errors are gone)




Friday, October 14, 2011
Few weeks later...



Friday, October 14, 2011
Your website is popular!
                           Need more web servers!




Friday, October 14, 2011
Re-Deployment
                           Set up new production servers.
                                Install CPAN modules
                             (until the errors are gone)




Friday, October 14, 2011
“Crap, Web::Framework has been
                              updated to 1.4 and many APIs
                           have been changed or deprecated!”




Friday, October 14, 2011
Rollback
                            Log in to the old web server.
                            Check Perl module versions.
                           Install them on the new server.




Friday, October 14, 2011
“Crap, this author deleted
                           the version 1.20 we want.
                             Let’s go to BackPAN...”




Friday, October 14, 2011
“Crap, version 1.20 doesn’t actually work
                      with the newer LWP 6 that we just
                   installed! Have to downgrade this too...”




Friday, October 14, 2011
and so on.



Friday, October 14, 2011
What was wrong?



Friday, October 14, 2011
• Dependency declaration
                     • Isolated Perl environments
                     • Version controls/history
                     • Dependency analysis
                     • Repeatable deployments
                     • etc.

Friday, October 14, 2011
Many existing solutions
                           MyCPAN, DPAN, CPAN::Mini::Inject,
                                OrePAN, Shipwright




Friday, October 14, 2011
None of those
                           didn’t quite work for me.
                                (Or I haven’t even tried)




Friday, October 14, 2011
So I wrote a new one.



Friday, October 14, 2011
Carton
                           https://github.com/miyagawa/carton




Friday, October 14, 2011
Inspired by...



Friday, October 14, 2011
Friday, October 14, 2011
• App-specific local environment
                     • Fast and safe install
                     • Dep-tree analysis, including versions
                     • Locking module versions
                     • Easy Redeployment
                     • Single-file,VCS friendly
                     • Safe and easy rollback
Friday, October 14, 2011
Local perl environment
                                 Using local::lib and cpanm -L
                           Each app has an isolated local library path




Friday, October 14, 2011
Fast and safe install
                                       cpanm 1.5
                           Saves MYMETA.json and install meta info




Friday, October 14, 2011
Dep tree analysis
                      Rebuild the dependency tree from meta info
                        Checks if anything is missing/superflous




Friday, October 14, 2011
Locking versions
                           Versions are saved in carton.lock
                                including dependencies




Friday, October 14, 2011
Easy Redeployment
                           Reinstall exactly the same set of modules
                           on another prod/development machines.




Friday, October 14, 2011
Single-file,VCS friendly
                              You can add carton.lock to git
                           update whenever you update modules




Friday, October 14, 2011
Safe and easy rollback
                             revert the lock file and redeploy




Friday, October 14, 2011
DEMO



Friday, October 14, 2011
>	
  cpanm	
  Carton



Friday, October 14, 2011
WARNING
                           It is beta software, some features are
                           missing or not working correctly (yet).




Friday, October 14, 2011
github.com/miyagawa/carton
                                irc.perl.org #carton




Friday, October 14, 2011
Questions?



Friday, October 14, 2011
Thanks!
                           twitter.com/miyagawa




Friday, October 14, 2011

Carton CPAN dependency manager

  • 1.
    Carton Tatsuhiko Miyagawa YAPC::Asia 2011 Tokyo Friday, October 14, 2011
  • 2.
    Managing CPAN Dependencies Friday, October 14, 2011
  • 3.
    Case Study: (Poor) Web Development Friday, October 14, 2011
  • 4.
    You’re writing anew web app. You don’t wanna reinvent wheels. Want to use as many CPAN deps. Friday, October 14, 2011
  • 5.
    Fine. Get them from CPAN, install on your machine. Friday, October 14, 2011
  • 6.
    >  cpanm  Web::Framework installed  LWP-­‐5.912 installed  Plack-­‐0.9980 installed  Web-­‐Framework-­‐1.20 >  cpanm  JSON::Fast installed  JSON-­‐Fast-­‐1.91 >  cpanm  MIME::Parser::XS installed  MIME-­‐Parser-­‐XS-­‐0.20 Friday, October 14, 2011
  • 7.
  • 8.
    Works? Ship it! Friday,October 14, 2011
  • 9.
    Deployment Set up new production servers. Install CPAN modules (until the errors are gone) Friday, October 14, 2011
  • 10.
  • 11.
    Your website ispopular! Need more web servers! Friday, October 14, 2011
  • 12.
    Re-Deployment Set up new production servers. Install CPAN modules (until the errors are gone) Friday, October 14, 2011
  • 13.
    “Crap, Web::Framework hasbeen updated to 1.4 and many APIs have been changed or deprecated!” Friday, October 14, 2011
  • 14.
    Rollback Log in to the old web server. Check Perl module versions. Install them on the new server. Friday, October 14, 2011
  • 15.
    “Crap, this authordeleted the version 1.20 we want. Let’s go to BackPAN...” Friday, October 14, 2011
  • 16.
    “Crap, version 1.20doesn’t actually work with the newer LWP 6 that we just installed! Have to downgrade this too...” Friday, October 14, 2011
  • 17.
    and so on. Friday,October 14, 2011
  • 18.
    What was wrong? Friday,October 14, 2011
  • 19.
    • Dependency declaration • Isolated Perl environments • Version controls/history • Dependency analysis • Repeatable deployments • etc. Friday, October 14, 2011
  • 20.
    Many existing solutions MyCPAN, DPAN, CPAN::Mini::Inject, OrePAN, Shipwright Friday, October 14, 2011
  • 21.
    None of those didn’t quite work for me. (Or I haven’t even tried) Friday, October 14, 2011
  • 22.
    So I wrotea new one. Friday, October 14, 2011
  • 23.
    Carton https://github.com/miyagawa/carton Friday, October 14, 2011
  • 24.
  • 25.
  • 26.
    • App-specific localenvironment • Fast and safe install • Dep-tree analysis, including versions • Locking module versions • Easy Redeployment • Single-file,VCS friendly • Safe and easy rollback Friday, October 14, 2011
  • 27.
    Local perl environment Using local::lib and cpanm -L Each app has an isolated local library path Friday, October 14, 2011
  • 28.
    Fast and safeinstall cpanm 1.5 Saves MYMETA.json and install meta info Friday, October 14, 2011
  • 29.
    Dep tree analysis Rebuild the dependency tree from meta info Checks if anything is missing/superflous Friday, October 14, 2011
  • 30.
    Locking versions Versions are saved in carton.lock including dependencies Friday, October 14, 2011
  • 31.
    Easy Redeployment Reinstall exactly the same set of modules on another prod/development machines. Friday, October 14, 2011
  • 32.
    Single-file,VCS friendly You can add carton.lock to git update whenever you update modules Friday, October 14, 2011
  • 33.
    Safe and easyrollback revert the lock file and redeploy Friday, October 14, 2011
  • 34.
  • 35.
  • 36.
    WARNING It is beta software, some features are missing or not working correctly (yet). Friday, October 14, 2011
  • 37.
    github.com/miyagawa/carton irc.perl.org #carton Friday, October 14, 2011
  • 38.
  • 39.
    Thanks! twitter.com/miyagawa Friday, October 14, 2011