Your SlideShare is downloading. ×
0
Dependency Management      With Pinto      Jeffrey Thalhammer       thaljef@cpan.org           YAPC::NA         June 15, 2...
CPAN Is HeavenTens of thousands ofmodules for everypurpose imaginableLots of ser vices fortesting, bug tracking,ratings, f...
CPAN Is HellThe CPAN is notstableDevelopersconstantly addingand removing stuffSometimes the codeis brokenTool chain expect...
Unintended ConsequencesAvoidingdependenciesAvoiding upgradesShared resources &monolithic systemsUnreproducibleenvironments
Combating The Problem“Just stash the site_perl directory in the VCS”BrittleNot portableCan’t smoke itHard to evolve
Combating The Problem “Just stash the distribution tarballs in the VCS”Slightly less brittlePortableSmokableStill icky
CPAN::Site & CPAN::Mini• Snapshots     of the CPAN• Solves    the stability problem• Still   clunky
More Shops Are Writing CPAN-            style Dists• M::B     and EU::MM more commonplace• Dist::Zilla          makes the ...
Lots of DarkPAN Tools Emerge• CPAN::Mini::Inject• MyCPAN::App::DPAN• CPAN::Dark• OrePAN
Pinto Is BornHad built 3 privateCPANSAlways required somehacksNot happy with theresultStarted form scratch
What is Pinto?   An extensible tool for managingdependencies via a CPAN-like repository
ContextYou have an app called My-AppThe app contains package My::AppThe app requires URI (latest is 1.59)
Creating A Repository
Creating A Repositorypinto --root=~/mypan init
Creating A Repositorypinto --root=~/mypan init   path to the repository
Creating A Repositorypinto --root=~/mypan init      “init” command
Creating A Repositorypinto --root=~/mypan init
Inspecting The Repositorypinto --root=~/mypan list
Inspecting The Repositorypinto --root=~/mypan list      “list” command
Inspecting The Repositorypinto --root=~/mypan list   path to the repository
Inspecting The Repositorypinto --root=~/mypan list
A Shortcutpinto --root=~/mypan list
A Shortcutpinto --root=~/mypan list  pinto -r ~/mypan list
A Shortcut    pinto --root=~/mypan list      pinto -r ~/mypan listexport PINTO_REPOSITORY_ROOT=~/mypan
A Shortcut    pinto --root=~/mypan list      pinto -r ~/mypan listexport PINTO_REPOSITORY_ROOT=~/mypan            pinto list
Fetching Dependencies
Fetching Dependenciespinto pull URI
Fetching Dependenciespinto pull URI“pull” command
Fetching Dependenciespinto pull URI package name
Fetching Dependenciespinto pull URI
What Did We Get?
What Did We Get?pinto list
What Did We Get?                   pinto listrf    URI             1.59   GAAS/URI-1.59.tar.gzrf    URI::Escape     3.31  ...
Understanding The Listingrf URI   1.59      GAAS/URI-1.59.tar.gz
Understanding The Listingrf URI   1.59      GAAS/URI-1.59.tar.gz         “r” means release dist
Understanding The Listingrf URI    1.59     GAAS/URI-1.59.tar.gz         “f” means a foreign dist
Understanding The Listingrf URI   1.59      GAAS/URI-1.59.tar.gz           The package name
Understanding The Listingrf URI      1.59     GAAS/URI-1.59.tar.gz         The package version number
Understanding The Listingrf URI      1.59     GAAS/URI-1.59.tar.gz         The distribution’s author ID
Understanding The Listingrf URI    1.59      GAAS/URI-1.59.tar.gz         The distribution archive
Understanding The Listingrf URI   1.59      GAAS/URI-1.59.tar.gz
Injecting Your Own Distribution
Injecting Your Own Distributionpinto add some/dir/My-App-1.0.tar.gz
Injecting Your Own Distributionpinto add some/dir/My-App-1.0.tar.gz           “           add” command
Injecting Your Own Distributionpinto add some/dir/My-App-1.0.tar.gz       Path to local dist archive
Injecting Your Own Distributionpinto add some/dir/My-App-1.0.tar.gz
Injecting Your Own Distributionpinto add some/dir/My-App-1.0.tar.gz             pinto list
Injecting Your Own Distribution  pinto add some/dir/My-App-1.0.tar.gz                 pinto listrl My::App          1.0   ...
Installing With cpan$ cpancpan[1]> o conf urllist file://$HOME/mypancpan[2]> install My::App
Installing With cpan$ cpancpan[1]> o conf urllist file://$HOME/mypancpan[2]> install My::App        point to your repository
Installing With cpan$ cpancpan[1]> o conf urllist file://$HOME/mypancpan[2]> install My::App
Installing With cpanm
Installing With cpanmcpanm --mirror file://$HOME/mypan       --mirror-only My::App
Installing With cpanmcpanm --mirror file://$HOME/mypan       --mirror-only My::App          point to your repository
Installing With cpanmcpanm --mirror file://$HOME/mypan       --mirror-only My::App          do not fall back to CPAN
Installing With cpanmcpanm --mirror file://$HOME/mypan       --mirror-only My::App
Installing With pinto
Installing With pintopinto install My::App
Installing With pintopinto install My::App   “install” command
Installing With pintopinto install My::App
Upgrading Dependencies
Upgrading Dependenciespinto pull URI~1.60
Upgrading Dependenciespinto pull URI~1.60    “pull” command
Upgrading Dependencies    pinto pull URI~1.60Package name and minimum version
Upgrading Dependenciespinto pull GAAS/URI-1.60.tar.gz
Upgrading Dependenciespinto pull GAAS/URI-1.60.tar.gz          pinto list
Upgrading Dependencies      pinto pull GAAS/URI-1.60.tar.gz                  pinto listrl    My::App         1.0   YOU/My-...
Working With Stacks
What Is A Stack?A named mapping from packagenames to distribution archivesConceptually equivalent to the02packages.details...
The Default StackEvery Pinto repository has abuilt-in stack called “init”It is the default stack for alloperationsYou can ...
Creating A Stack
Creating A Stackpinto new upgrades
Creating A Stackpinto new upgrades“new” command
Creating A Stackpinto new upgrades   stack name
Creating A Stack   pinto new upgradespinto copy init upgrades
Creating A Stack   pinto new upgradespinto copy init upgrades   “copy” command
Creating A Stack   pinto new upgradespinto copy init upgrades      from stack
Creating A Stack   pinto new upgradespinto copy init upgrades       to stack
Creating A Stack   pinto new upgradespinto copy init upgrades
Upgrading On A Stackpinto pull --stack=upgrades URI~1.62
Upgrading On A Stackpinto pull --stack=upgrades URI~1.62          “pull” command
Upgrading On A Stackpinto pull --stack=upgrades URI~1.62       specify the stack name
Upgrading On A Stackpinto pull --stack=upgrades URI~1.62      package name and version
Upgrading On A Stackpinto pull --stack=upgrades URI~1.62
Upgrading On A Stackpinto pull --stack=upgrades URI~1.62 pinto list --stack=upgrades
Upgrading On A Stackpinto pull --stack=upgrades URI~1.62 pinto list --stack=upgrades       specify the stack name
Upgrading On A Stack  pinto pull --stack=upgrades URI~1.62      pinto list --stack=upgradesrl    My::App         1.0   YOU...
Looking Across Stackspinto list --stack=@ -P=URI
Looking Across Stackspinto list --stack=@ -P=URI       special stack “                     @”
Looking Across Stackspinto list --stack=@ -P=URI   only packages matching %URI%
Looking Across Stacks    pinto list --stack=@ -P=URIrf init     URI     1.60   GAAS/URI-1.60.tar.gzrf upgrades URI     1.6...
Installing From A Stackpinto install --stack=upgrades My::App
Installing From A Stackpinto install --stack=upgrades My::App          “install” command
Installing From A Stackpinto install --stack=upgrades My::App          specify stack name
Installing From A Stackpinto install --stack=upgrades My::App            package name
Installing From A Stackpinto install --stack=upgrades My::App
Merging Stackspinto merge upgrades init
Merging Stackspinto merge upgrades init    “merge” command
Merging Stackspinto merge upgrades init       from stack
Merging Stackspinto merge upgrades init        to stack
Merging Stackspinto merge upgrades init
Merging Stacks       pinto merge upgrades initrf init     URI       1.62   GAAS/URI-1.62.tar.gzrf upgrades URI       1.62 ...
Why Use Stacks?• Stacks   for upgrades• Stacks   for each feature• Stacks   for dev/qa/prod• Stacks   for each product• St...
Working With Pins
What Is A Pin?Fixes a particularpackage & version tostackCannot be upgradedor downgradedUntil you unpin it
Pinning A Packagepinto pin URI
Pinning A Packagepinto pin URI “pin” command
Pinning A Packagepinto pin URI package name
Pinning A Packagepinto pin URI
Pinning A Packagepinto pin URI  pinto list
Pinning A Package              pinto pin URI                pinto listrf+ URI            1.59   GAAS/URI-1.59.tar.gzrf+ UR...
Pinning A Package              pinto pin URI                pinto listrf+ URI            1.59   GAAS/URI-1.59.tar.gzrf+ UR...
Pinning A Package              pinto pin URI                pinto listrf+ URI            1.59   GAAS/URI-1.59.tar.gzrf+ UR...
Pinning A Package
Pinning A PackageSuppose you want to use Catalyst
Pinning A PackageSuppose you want to use CatalystAnd Catalyst requires Plack 0.99
Pinning A PackageSuppose you want to use CatalystAnd Catalyst requires Plack 0.99And Plack 0.99 requires HTTP::Request 6.03
Pinning A PackageSuppose you want to use CatalystAnd Catalyst requires Plack 0.99And Plack 0.99 requires HTTP::Request 6.0...
Pinning A PackageSuppose you want to use CatalystAnd Catalyst requires Plack 0.99And Plack 0.99 requires HTTP::Request 6.0...
Pinning A Packagepinto -v pull Catalyst
Pinning A Package        pinto -v pull CatalystPulling Catalyst-Runtime-5.90012.tar.gz
Pinning A Package        pinto -v pull CatalystPulling Catalyst-Runtime-5.90012.tar.gzPulling CGI-Simple-1.113.tar.gz
Pinning A Package        pinto -v pull CatalystPulling Catalyst-Runtime-5.90012.tar.gzPulling CGI-Simple-1.113.tar.gz...
Pinning A Package        pinto -v pull CatalystPulling Catalyst-Runtime-5.90012.tar.gzPulling CGI-Simple-1.113.tar.gz...Pu...
Pinning A Package          pinto -v pull CatalystPulling   Catalyst-Runtime-5.90012.tar.gzPulling   CGI-Simple-1.113.tar.g...
Pinning A Package          pinto -v pull CatalystPulling   Catalyst-Runtime-5.90012.tar.gzPulling   CGI-Simple-1.113.tar.g...
Pinning A Package          pinto -v pull CatalystPulling   Catalyst-Runtime-5.90012.tar.gzPulling   CGI-Simple-1.113.tar.g...
Pinning A Package          pinto -v pull CatalystPulling   Catalyst-Runtime-5.90012.tar.gzPulling   CGI-Simple-1.113.tar.g...
Pinning A Package          pinto -v pull CatalystPulling   Catalyst-Runtime-5.90012.tar.gzPulling   CGI-Simple-1.113.tar.g...
Why Pin?
Why Pin?Prevent otherdevelopers fromupgrading directly
Why Pin?Prevent otherdevelopers fromupgrading directlyPrevent otherdependencies fromupgrading directly
Using Pins And Stacks       Together
Experiment With Upgrades
Experiment With UpgradesYou have a “prod” stack with DBIx::Class 1.6
Experiment With UpgradesYou have a “prod” stack with DBIx::Class 1.6Make a copy of the “prod” stack called “test”
Experiment With UpgradesYou have a “prod” stack with DBIx::Class 1.6Make a copy of the “prod” stack called “test”Upgrade t...
Experiment With UpgradesYou have a “prod” stack with DBIx::Class 1.6Make a copy of the “prod” stack called “test”Upgrade t...
Experiment With UpgradesYou have a “prod” stack with DBIx::Class 1.6Make a copy of the “prod” stack called “test”Upgrade t...
Making Local Patches
Making Local PatchesYou find a bug in Plack-0.98
Making Local PatchesYou find a bug in Plack-0.98You patch and re-package as Plack-0.98_01.tar.gz
Making Local PatchesYou find a bug in Plack-0.98You patch and re-package as Plack-0.98_01.tar.gzPut Plack-0.98_01.tar.gz i...
Making Local PatchesYou find a bug in Plack-0.98You patch and re-package as Plack-0.98_01.tar.gzPut Plack-0.98_01.tar.gz i...
Making Local PatchesYou find a bug in Plack-0.98You patch and re-package as Plack-0.98_01.tar.gzPut Plack-0.98_01.tar.gz i...
Making Local PatchesYou find a bug in Plack-0.98You patch and re-package as Plack-0.98_01.tar.gzPut Plack-0.98_01.tar.gz i...
Pinto In The Real World
Pinto And Legacy Code
Pinto And Legacy CodeDon’t always know what has been installed.So use Dist::Sur veyor to discover dependencies.Stash depen...
Pinto And Legacy Code  Don’t always know what has been installed.  So use Dist::Sur veyor to discover dependencies.  Stash...
Pinto And Legacy Code  Don’t always know what has been installed.  So use Dist::Sur veyor to discover dependencies.  Stash...
Pinto And Legacy Code  Don’t always know what has been installed.  So use Dist::Sur veyor to discover dependencies.  Stash...
Pinto And Dist::Zilla
Pinto And Dist::Zilladzil listdeps | pinto pull
Pinto And Dist::Zilladzil listdeps | pinto pulldzil authordeps | pinto pull
Pinto And The Development Cycle
Pinto And The Development CycleUsually don’t know dependencies ahead of time.
Pinto And The Development CycleUsually don’t know dependencies ahead of time.Might install several modules before choosing.
Pinto And The Development CycleUsually don’t know dependencies ahead of time.Might install several modules before choosing...
Pinto And The Development CycleUsually don’t know dependencies ahead of time.Might install several modules before choosing...
Pinto And The Development CycleUsually don’t know dependencies ahead of time.Might install several modules before choosing...
Pinto And The Development Cyclepinto install -L ~/myperl5 --pull Catalyst
Pinto And The Development Cyclepinto install -L ~/myperl5 --pull Catalyst            “install” command
Pinto And The Development Cyclepinto install -L ~/myperl5 --pull Catalyst           install into local::lib
Pinto And The Development Cyclepinto install -L ~/myperl5 --pull Catalyst              package name
Pinto And The Development Cyclepinto install -L ~/myperl5 --pull Catalyst           awesome --pull flag
Pinto And The Development Cyclepinto install -L ~/myperl5 --pull Catalyst
Pinto And The Development Cyclepinto install -L ~/myperl5 --pull Catalyst  First, pulls Catalyst and any missing  dependen...
Pinto And The Development Cyclepinto install -L ~/myperl5 --pull Catalyst  First, pulls Catalyst and any missing  dependen...
Pinto And The Development Cyclepinto install -L ~/myperl5 --pull Catalyst  First, pulls Catalyst and any missing  dependen...
GotchasPinto does not index exactly like PAUSEMay not work for old or oddly packaged codePinto does not enforce permission...
Pinto And Teamwork     Repository on shared storage areaEasy to setupPerformance may suck on NFSUsual permission issues
Pinto And Teamwork  Repository on a remote host via HTTPpintod on remote hostpinto on local hostCan utilize fast storageCa...
Running pintod  remotehost
Running pintod          remotehostpinto --root=/var/ourpan init
Running pintod          remotehostpinto --root=/var/ourpan init  pintod --root=/var/ourpan
Running pintod          remotehostpinto --root=/var/ourpan init  pintod --root=/var/ourpan           localhost
Running pintod             remotehost   pinto --root=/var/ourpan init     pintod --root=/var/ourpan              localhost...
Using pintod For Installation
Using pintod For Installation$ cpancpan[1]> o conf urllist http://remotehost/devcpan[2]> install My::App
Using pintod For Installation$ cpancpan[1]> o conf urllist http://remotehost/devcpan[2]> install My::App           append ...
Using pintod For Installation$ cpancpan[1]> o conf urllist http://remotehost/devcpan[2]> install My::Appcpanm --mirror htt...
Using pintod For Installation$ cpancpan[1]> o conf urllist http://remotehost/devcpan[2]> install My::Appcpanm --mirror htt...
Using pintod For Installation$ cpancpan[1]> o conf urllist http://remotehost/devcpan[2]> install My::Appcpanm --mirror htt...
Using pintod For Installation$ cpancpan[1]> o conf urllist http://remotehost/devcpan[2]> install My::Appcpanm --mirror htt...
Using pintod For Installation$ cpancpan[1]> o conf urllist http://remotehost/devcpan[2]> install My::Appcpanm --mirror htt...
Using pintod For Installation$ cpancpan[1]> o conf urllist http://remotehost/devcpan[2]> install My::Appcpanm --mirror htt...
Pinto Net works
Pinto Net worksCPAN succeeds because it iscentralized
Pinto Net worksCPAN succeeds because it iscentralizedCPAN fails because it iscentralized
Pinto Net worksCPAN succeeds because it iscentralizedCPAN fails because it iscentralizedPinto can be centralized ordistrib...
Pinto Net works       The CPANTeam              Team  1                 3        Team          2
Pinto Net works
Pinto Net worksMight not be a good idea
Pinto Net worksMight not be a good ideaNo obvious way to resolvenamespace conflicts
Pinto Net worksMight not be a good ideaNo obvious way to resolvenamespace conflictsWe’ll have to wait and seeif this pans ...
Pinto And OS Packaging• UsePinto to build up your application in some directory• Packagethe directory with your favorite O...
Pinto And Other Tools• Still     just a pile of directories and files with an index• AnnoCPAN,   MetaCPAN, CPAN::Mini::Web...
Pinto versus Carton                Pinto   CartonLight weightVCS-FriendlyLocal PatchesStack Support Enterprise  Strength
Some Odds & Ends• Dist::Zilla::Plugin::Pinto::Add   - release your dist to a Pinto repository with dzil• Dist::Zilla::Chef...
Pinto Architecture                            PintoConfiguration                Pull   Add     Copy Merge                 ...
Extending Pinto• Create       an Action subclass and override the “execute” method• YourAction has access to the configura...
Future PlansMore VCS-behaviors: revert, diffsReport upstream impacts of upgradesCheck stack for unsatisfiable dependencies...
Get Yours Todayhttps://metacpan.org/module/Pinto https://github.com/thaljef/Pinto
Thanks For Your Time    Jeffrey Thalhammer     thaljef@cpan.org
Upcoming SlideShare
Loading in...5
×

Dependency Management With Pinto

1,694

Published on

Published in: Technology, Art & Photos
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,694
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
17
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Transcript of "Dependency Management With Pinto"

    1. 1. Dependency Management With Pinto Jeffrey Thalhammer thaljef@cpan.org YAPC::NA June 15, 2012
    2. 2. CPAN Is HeavenTens of thousands ofmodules for everypurpose imaginableLots of ser vices fortesting, bug tracking,ratings, forumsAwesome tool chainfor building, testing,installing
    3. 3. CPAN Is HellThe CPAN is notstableDevelopersconstantly addingand removing stuffSometimes the codeis brokenTool chain expectsbackwardcompatibility
    4. 4. Unintended ConsequencesAvoidingdependenciesAvoiding upgradesShared resources &monolithic systemsUnreproducibleenvironments
    5. 5. Combating The Problem“Just stash the site_perl directory in the VCS”BrittleNot portableCan’t smoke itHard to evolve
    6. 6. Combating The Problem “Just stash the distribution tarballs in the VCS”Slightly less brittlePortableSmokableStill icky
    7. 7. CPAN::Site & CPAN::Mini• Snapshots of the CPAN• Solves the stability problem• Still clunky
    8. 8. More Shops Are Writing CPAN- style Dists• M::B and EU::MM more commonplace• Dist::Zilla makes the development fun• cpanmmakes the deployment easy• DarkPANs proliferate
    9. 9. Lots of DarkPAN Tools Emerge• CPAN::Mini::Inject• MyCPAN::App::DPAN• CPAN::Dark• OrePAN
    10. 10. Pinto Is BornHad built 3 privateCPANSAlways required somehacksNot happy with theresultStarted form scratch
    11. 11. What is Pinto? An extensible tool for managingdependencies via a CPAN-like repository
    12. 12. ContextYou have an app called My-AppThe app contains package My::AppThe app requires URI (latest is 1.59)
    13. 13. Creating A Repository
    14. 14. Creating A Repositorypinto --root=~/mypan init
    15. 15. Creating A Repositorypinto --root=~/mypan init path to the repository
    16. 16. Creating A Repositorypinto --root=~/mypan init “init” command
    17. 17. Creating A Repositorypinto --root=~/mypan init
    18. 18. Inspecting The Repositorypinto --root=~/mypan list
    19. 19. Inspecting The Repositorypinto --root=~/mypan list “list” command
    20. 20. Inspecting The Repositorypinto --root=~/mypan list path to the repository
    21. 21. Inspecting The Repositorypinto --root=~/mypan list
    22. 22. A Shortcutpinto --root=~/mypan list
    23. 23. A Shortcutpinto --root=~/mypan list pinto -r ~/mypan list
    24. 24. A Shortcut pinto --root=~/mypan list pinto -r ~/mypan listexport PINTO_REPOSITORY_ROOT=~/mypan
    25. 25. A Shortcut pinto --root=~/mypan list pinto -r ~/mypan listexport PINTO_REPOSITORY_ROOT=~/mypan pinto list
    26. 26. Fetching Dependencies
    27. 27. Fetching Dependenciespinto pull URI
    28. 28. Fetching Dependenciespinto pull URI“pull” command
    29. 29. Fetching Dependenciespinto pull URI package name
    30. 30. Fetching Dependenciespinto pull URI
    31. 31. What Did We Get?
    32. 32. What Did We Get?pinto list
    33. 33. What Did We Get? pinto listrf URI 1.59 GAAS/URI-1.59.tar.gzrf URI::Escape 3.31 GAAS/URI-1.59.tar.gzrf URI::Heuristic 4.20 GAAS/URI-1.59.tar.gzrf URI::IRI 0 GAAS/URI-1.59.tar.gzrf URI::QueryParam 0 GAAS/URI-1.59.tar.gzrf URI::Split 0 GAAS/URI-1.59.tar.gz...
    34. 34. Understanding The Listingrf URI 1.59 GAAS/URI-1.59.tar.gz
    35. 35. Understanding The Listingrf URI 1.59 GAAS/URI-1.59.tar.gz “r” means release dist
    36. 36. Understanding The Listingrf URI 1.59 GAAS/URI-1.59.tar.gz “f” means a foreign dist
    37. 37. Understanding The Listingrf URI 1.59 GAAS/URI-1.59.tar.gz The package name
    38. 38. Understanding The Listingrf URI 1.59 GAAS/URI-1.59.tar.gz The package version number
    39. 39. Understanding The Listingrf URI 1.59 GAAS/URI-1.59.tar.gz The distribution’s author ID
    40. 40. Understanding The Listingrf URI 1.59 GAAS/URI-1.59.tar.gz The distribution archive
    41. 41. Understanding The Listingrf URI 1.59 GAAS/URI-1.59.tar.gz
    42. 42. Injecting Your Own Distribution
    43. 43. Injecting Your Own Distributionpinto add some/dir/My-App-1.0.tar.gz
    44. 44. Injecting Your Own Distributionpinto add some/dir/My-App-1.0.tar.gz “ add” command
    45. 45. Injecting Your Own Distributionpinto add some/dir/My-App-1.0.tar.gz Path to local dist archive
    46. 46. Injecting Your Own Distributionpinto add some/dir/My-App-1.0.tar.gz
    47. 47. Injecting Your Own Distributionpinto add some/dir/My-App-1.0.tar.gz pinto list
    48. 48. Injecting Your Own Distribution pinto add some/dir/My-App-1.0.tar.gz pinto listrl My::App 1.0 YOU/My-App-1.0.tar.gzrf URI 1.59 GAAS/URI-1.59.tar.gzrf URI::Escape 3.31 GAAS/URI-1.59.tar.gz...
    49. 49. Installing With cpan$ cpancpan[1]> o conf urllist file://$HOME/mypancpan[2]> install My::App
    50. 50. Installing With cpan$ cpancpan[1]> o conf urllist file://$HOME/mypancpan[2]> install My::App point to your repository
    51. 51. Installing With cpan$ cpancpan[1]> o conf urllist file://$HOME/mypancpan[2]> install My::App
    52. 52. Installing With cpanm
    53. 53. Installing With cpanmcpanm --mirror file://$HOME/mypan --mirror-only My::App
    54. 54. Installing With cpanmcpanm --mirror file://$HOME/mypan --mirror-only My::App point to your repository
    55. 55. Installing With cpanmcpanm --mirror file://$HOME/mypan --mirror-only My::App do not fall back to CPAN
    56. 56. Installing With cpanmcpanm --mirror file://$HOME/mypan --mirror-only My::App
    57. 57. Installing With pinto
    58. 58. Installing With pintopinto install My::App
    59. 59. Installing With pintopinto install My::App “install” command
    60. 60. Installing With pintopinto install My::App
    61. 61. Upgrading Dependencies
    62. 62. Upgrading Dependenciespinto pull URI~1.60
    63. 63. Upgrading Dependenciespinto pull URI~1.60 “pull” command
    64. 64. Upgrading Dependencies pinto pull URI~1.60Package name and minimum version
    65. 65. Upgrading Dependenciespinto pull GAAS/URI-1.60.tar.gz
    66. 66. Upgrading Dependenciespinto pull GAAS/URI-1.60.tar.gz pinto list
    67. 67. Upgrading Dependencies pinto pull GAAS/URI-1.60.tar.gz pinto listrl My::App 1.0 YOU/My-App-1.0.tar.gzrf URI 1.60 GAAS/URI-1.60.tar.gzrf URI::Escape 3.32 GAAS/URI-1.60.tar.gzrf URI::Heuristic 4.20 GAAS/URI-1.60.tar.gz...
    68. 68. Working With Stacks
    69. 69. What Is A Stack?A named mapping from packagenames to distribution archivesConceptually equivalent to the02packages.details.txt fileIn a CPAN, there is only one“stack”, and it usually containsonly latest package versionsBut a Pinto repository can havemultiple stacks, that containarbitrary package versions
    70. 70. The Default StackEvery Pinto repository has abuilt-in stack called “init”It is the default stack for alloperationsYou can change the defaultstack
    71. 71. Creating A Stack
    72. 72. Creating A Stackpinto new upgrades
    73. 73. Creating A Stackpinto new upgrades“new” command
    74. 74. Creating A Stackpinto new upgrades stack name
    75. 75. Creating A Stack pinto new upgradespinto copy init upgrades
    76. 76. Creating A Stack pinto new upgradespinto copy init upgrades “copy” command
    77. 77. Creating A Stack pinto new upgradespinto copy init upgrades from stack
    78. 78. Creating A Stack pinto new upgradespinto copy init upgrades to stack
    79. 79. Creating A Stack pinto new upgradespinto copy init upgrades
    80. 80. Upgrading On A Stackpinto pull --stack=upgrades URI~1.62
    81. 81. Upgrading On A Stackpinto pull --stack=upgrades URI~1.62 “pull” command
    82. 82. Upgrading On A Stackpinto pull --stack=upgrades URI~1.62 specify the stack name
    83. 83. Upgrading On A Stackpinto pull --stack=upgrades URI~1.62 package name and version
    84. 84. Upgrading On A Stackpinto pull --stack=upgrades URI~1.62
    85. 85. Upgrading On A Stackpinto pull --stack=upgrades URI~1.62 pinto list --stack=upgrades
    86. 86. Upgrading On A Stackpinto pull --stack=upgrades URI~1.62 pinto list --stack=upgrades specify the stack name
    87. 87. Upgrading On A Stack pinto pull --stack=upgrades URI~1.62 pinto list --stack=upgradesrl My::App 1.0 YOU/My-App-1.0.tar.gzrf URI 1.62 GAAS/URI-1.62.tar.gzrf URI::Escape 3.32 GAAS/URI-1.62.tar.gzrf URI::Heuristic 4.20 GAAS/URI-1.62.tar.gz...
    88. 88. Looking Across Stackspinto list --stack=@ -P=URI
    89. 89. Looking Across Stackspinto list --stack=@ -P=URI special stack “ @”
    90. 90. Looking Across Stackspinto list --stack=@ -P=URI only packages matching %URI%
    91. 91. Looking Across Stacks pinto list --stack=@ -P=URIrf init URI 1.60 GAAS/URI-1.60.tar.gzrf upgrades URI 1.62 GAAS/URI-1.62.tar.gz...
    92. 92. Installing From A Stackpinto install --stack=upgrades My::App
    93. 93. Installing From A Stackpinto install --stack=upgrades My::App “install” command
    94. 94. Installing From A Stackpinto install --stack=upgrades My::App specify stack name
    95. 95. Installing From A Stackpinto install --stack=upgrades My::App package name
    96. 96. Installing From A Stackpinto install --stack=upgrades My::App
    97. 97. Merging Stackspinto merge upgrades init
    98. 98. Merging Stackspinto merge upgrades init “merge” command
    99. 99. Merging Stackspinto merge upgrades init from stack
    100. 100. Merging Stackspinto merge upgrades init to stack
    101. 101. Merging Stackspinto merge upgrades init
    102. 102. Merging Stacks pinto merge upgrades initrf init URI 1.62 GAAS/URI-1.62.tar.gzrf upgrades URI 1.62 GAAS/URI-1.62.tar.gz...
    103. 103. Why Use Stacks?• Stacks for upgrades• Stacks for each feature• Stacks for dev/qa/prod• Stacks for each product• Stacks for each perl version• Stacks for each customer
    104. 104. Working With Pins
    105. 105. What Is A Pin?Fixes a particularpackage & version tostackCannot be upgradedor downgradedUntil you unpin it
    106. 106. Pinning A Packagepinto pin URI
    107. 107. Pinning A Packagepinto pin URI “pin” command
    108. 108. Pinning A Packagepinto pin URI package name
    109. 109. Pinning A Packagepinto pin URI
    110. 110. Pinning A Packagepinto pin URI pinto list
    111. 111. Pinning A Package pinto pin URI pinto listrf+ URI 1.59 GAAS/URI-1.59.tar.gzrf+ URI::Escape 3.31 GAAS/URI-1.59.tar.gzrf+ URI::Heuristic 4.20 GAAS/URI-1.59.tar.gz
    112. 112. Pinning A Package pinto pin URI pinto listrf+ URI 1.59 GAAS/URI-1.59.tar.gzrf+ URI::Escape 3.31 GAAS/URI-1.59.tar.gzrf+ URI::Heuristic 4.20 GAAS/URI-1.59.tar.gz “+” indicates a pin
    113. 113. Pinning A Package pinto pin URI pinto listrf+ URI 1.59 GAAS/URI-1.59.tar.gzrf+ URI::Escape 3.31 GAAS/URI-1.59.tar.gzrf+ URI::Heuristic 4.20 GAAS/URI-1.59.tar.gz
    114. 114. Pinning A Package
    115. 115. Pinning A PackageSuppose you want to use Catalyst
    116. 116. Pinning A PackageSuppose you want to use CatalystAnd Catalyst requires Plack 0.99
    117. 117. Pinning A PackageSuppose you want to use CatalystAnd Catalyst requires Plack 0.99And Plack 0.99 requires HTTP::Request 6.03
    118. 118. Pinning A PackageSuppose you want to use CatalystAnd Catalyst requires Plack 0.99And Plack 0.99 requires HTTP::Request 6.03And HTTP::Request requires ...
    119. 119. Pinning A PackageSuppose you want to use CatalystAnd Catalyst requires Plack 0.99And Plack 0.99 requires HTTP::Request 6.03And HTTP::Request requires ......requires URI 1.62
    120. 120. Pinning A Packagepinto -v pull Catalyst
    121. 121. Pinning A Package pinto -v pull CatalystPulling Catalyst-Runtime-5.90012.tar.gz
    122. 122. Pinning A Package pinto -v pull CatalystPulling Catalyst-Runtime-5.90012.tar.gzPulling CGI-Simple-1.113.tar.gz
    123. 123. Pinning A Package pinto -v pull CatalystPulling Catalyst-Runtime-5.90012.tar.gzPulling CGI-Simple-1.113.tar.gz...
    124. 124. Pinning A Package pinto -v pull CatalystPulling Catalyst-Runtime-5.90012.tar.gzPulling CGI-Simple-1.113.tar.gz...Pulling Plack-0.9988.tar.gz
    125. 125. Pinning A Package pinto -v pull CatalystPulling Catalyst-Runtime-5.90012.tar.gzPulling CGI-Simple-1.113.tar.gz...Pulling Plack-0.9988.tar.gzPulling Devel-StackTrace-1.27.tar.gz
    126. 126. Pinning A Package pinto -v pull CatalystPulling Catalyst-Runtime-5.90012.tar.gzPulling CGI-Simple-1.113.tar.gz...Pulling Plack-0.9988.tar.gzPulling Devel-StackTrace-1.27.tar.gz...
    127. 127. Pinning A Package pinto -v pull CatalystPulling Catalyst-Runtime-5.90012.tar.gzPulling CGI-Simple-1.113.tar.gz...Pulling Plack-0.9988.tar.gzPulling Devel-StackTrace-1.27.tar.gz...Pulling HTTP-Message-6.03.tar.gz
    128. 128. Pinning A Package pinto -v pull CatalystPulling Catalyst-Runtime-5.90012.tar.gzPulling CGI-Simple-1.113.tar.gz...Pulling Plack-0.9988.tar.gzPulling Devel-StackTrace-1.27.tar.gz...Pulling HTTP-Message-6.03.tar.gzPulling URI-1.62
    129. 129. Pinning A Package pinto -v pull CatalystPulling Catalyst-Runtime-5.90012.tar.gzPulling CGI-Simple-1.113.tar.gz...Pulling Plack-0.9988.tar.gzPulling Devel-StackTrace-1.27.tar.gz...Pulling HTTP-Message-6.03.tar.gzPulling URI-1.62Cannot add GAAS/URI-1.62/URI~1.62 to stack initbecause URI is pinned to GAAS/URI-1.59/URI~1.59
    130. 130. Why Pin?
    131. 131. Why Pin?Prevent otherdevelopers fromupgrading directly
    132. 132. Why Pin?Prevent otherdevelopers fromupgrading directlyPrevent otherdependencies fromupgrading directly
    133. 133. Using Pins And Stacks Together
    134. 134. Experiment With Upgrades
    135. 135. Experiment With UpgradesYou have a “prod” stack with DBIx::Class 1.6
    136. 136. Experiment With UpgradesYou have a “prod” stack with DBIx::Class 1.6Make a copy of the “prod” stack called “test”
    137. 137. Experiment With UpgradesYou have a “prod” stack with DBIx::Class 1.6Make a copy of the “prod” stack called “test”Upgrade to DBIx::Class 1.7 on “test” stack
    138. 138. Experiment With UpgradesYou have a “prod” stack with DBIx::Class 1.6Make a copy of the “prod” stack called “test”Upgrade to DBIx::Class 1.7 on “test” stackBuild & test application using the “test” stack
    139. 139. Experiment With UpgradesYou have a “prod” stack with DBIx::Class 1.6Make a copy of the “prod” stack called “test”Upgrade to DBIx::Class 1.7 on “test” stackBuild & test application using the “test” stackIf the tests fail pin DBIx::Class on the “prod” stack
    140. 140. Making Local Patches
    141. 141. Making Local PatchesYou find a bug in Plack-0.98
    142. 142. Making Local PatchesYou find a bug in Plack-0.98You patch and re-package as Plack-0.98_01.tar.gz
    143. 143. Making Local PatchesYou find a bug in Plack-0.98You patch and re-package as Plack-0.98_01.tar.gzPut Plack-0.98_01.tar.gz in the “prod” stack
    144. 144. Making Local PatchesYou find a bug in Plack-0.98You patch and re-package as Plack-0.98_01.tar.gzPut Plack-0.98_01.tar.gz in the “prod” stackPin Plack on the “prod” stack
    145. 145. Making Local PatchesYou find a bug in Plack-0.98You patch and re-package as Plack-0.98_01.tar.gzPut Plack-0.98_01.tar.gz in the “prod” stackPin Plack on the “prod” stackRemove pin when the author fixes bug
    146. 146. Making Local PatchesYou find a bug in Plack-0.98You patch and re-package as Plack-0.98_01.tar.gzPut Plack-0.98_01.tar.gz in the “prod” stackPin Plack on the “prod” stackRemove pin when the author fixes bugPull Plack-0.99 into the “prod” stack
    147. 147. Pinto In The Real World
    148. 148. Pinto And Legacy Code
    149. 149. Pinto And Legacy CodeDon’t always know what has been installed.So use Dist::Sur veyor to discover dependencies.Stash dependency list in a text file.Then feed dependencies into a Pinto repository.
    150. 150. Pinto And Legacy Code Don’t always know what has been installed. So use Dist::Sur veyor to discover dependencies. Stash dependency list in a text file. Then feed dependencies into a Pinto repository.pinto pull --norecurse < dependencies.txt
    151. 151. Pinto And Legacy Code Don’t always know what has been installed. So use Dist::Sur veyor to discover dependencies. Stash dependency list in a text file. Then feed dependencies into a Pinto repository.pinto pull --norecurse < dependencies.txt do not automatically fetch deps
    152. 152. Pinto And Legacy Code Don’t always know what has been installed. So use Dist::Sur veyor to discover dependencies. Stash dependency list in a text file. Then feed dependencies into a Pinto repository.pinto pull --norecurse < dependencies.txt
    153. 153. Pinto And Dist::Zilla
    154. 154. Pinto And Dist::Zilladzil listdeps | pinto pull
    155. 155. Pinto And Dist::Zilladzil listdeps | pinto pulldzil authordeps | pinto pull
    156. 156. Pinto And The Development Cycle
    157. 157. Pinto And The Development CycleUsually don’t know dependencies ahead of time.
    158. 158. Pinto And The Development CycleUsually don’t know dependencies ahead of time.Might install several modules before choosing.
    159. 159. Pinto And The Development CycleUsually don’t know dependencies ahead of time.Might install several modules before choosing.This process might take several days or weeks.
    160. 160. Pinto And The Development CycleUsually don’t know dependencies ahead of time.Might install several modules before choosing.This process might take several days or weeks.By the time we decide, CPAN might changed.
    161. 161. Pinto And The Development CycleUsually don’t know dependencies ahead of time.Might install several modules before choosing.This process might take several days or weeks.By the time we decide, CPAN might changed.So there’s a hole in the development process.
    162. 162. Pinto And The Development Cyclepinto install -L ~/myperl5 --pull Catalyst
    163. 163. Pinto And The Development Cyclepinto install -L ~/myperl5 --pull Catalyst “install” command
    164. 164. Pinto And The Development Cyclepinto install -L ~/myperl5 --pull Catalyst install into local::lib
    165. 165. Pinto And The Development Cyclepinto install -L ~/myperl5 --pull Catalyst package name
    166. 166. Pinto And The Development Cyclepinto install -L ~/myperl5 --pull Catalyst awesome --pull flag
    167. 167. Pinto And The Development Cyclepinto install -L ~/myperl5 --pull Catalyst
    168. 168. Pinto And The Development Cyclepinto install -L ~/myperl5 --pull Catalyst First, pulls Catalyst and any missing dependencies into the repository.
    169. 169. Pinto And The Development Cyclepinto install -L ~/myperl5 --pull Catalyst First, pulls Catalyst and any missing dependencies into the repository. Dependencies must not violate pin constraints or command fails before installing anything.
    170. 170. Pinto And The Development Cyclepinto install -L ~/myperl5 --pull Catalyst First, pulls Catalyst and any missing dependencies into the repository. Dependencies must not violate pin constraints or command fails before installing anything. Then, installs Catalyst and dependencies (from the repository) into your local::lib directory.
    171. 171. GotchasPinto does not index exactly like PAUSEMay not work for old or oddly packaged codePinto does not enforce permissionsPinto is strict about version numbers
    172. 172. Pinto And Teamwork Repository on shared storage areaEasy to setupPerformance may suck on NFSUsual permission issues
    173. 173. Pinto And Teamwork Repository on a remote host via HTTPpintod on remote hostpinto on local hostCan utilize fast storageCan use HTTP authentication
    174. 174. Running pintod remotehost
    175. 175. Running pintod remotehostpinto --root=/var/ourpan init
    176. 176. Running pintod remotehostpinto --root=/var/ourpan init pintod --root=/var/ourpan
    177. 177. Running pintod remotehostpinto --root=/var/ourpan init pintod --root=/var/ourpan localhost
    178. 178. Running pintod remotehost pinto --root=/var/ourpan init pintod --root=/var/ourpan localhostpinto --root=http://somehost COMMAND
    179. 179. Using pintod For Installation
    180. 180. Using pintod For Installation$ cpancpan[1]> o conf urllist http://remotehost/devcpan[2]> install My::App
    181. 181. Using pintod For Installation$ cpancpan[1]> o conf urllist http://remotehost/devcpan[2]> install My::App append stack name to url
    182. 182. Using pintod For Installation$ cpancpan[1]> o conf urllist http://remotehost/devcpan[2]> install My::Appcpanm --mirror http://remotehost/dev --mirror-only My::App
    183. 183. Using pintod For Installation$ cpancpan[1]> o conf urllist http://remotehost/devcpan[2]> install My::Appcpanm --mirror http://remotehost/dev --mirror-only My::App append stack name to url
    184. 184. Using pintod For Installation$ cpancpan[1]> o conf urllist http://remotehost/devcpan[2]> install My::Appcpanm --mirror http://remotehost/dev --mirror-only My::Apppinto --root=http://remotehost install --stack=dev My::App
    185. 185. Using pintod For Installation$ cpancpan[1]> o conf urllist http://remotehost/devcpan[2]> install My::Appcpanm --mirror http://remotehost/dev --mirror-only My::Apppinto --root=http://remotehost install --stack=dev My::App point to pinto ser ver
    186. 186. Using pintod For Installation$ cpancpan[1]> o conf urllist http://remotehost/devcpan[2]> install My::Appcpanm --mirror http://remotehost/dev --mirror-only My::Apppinto --root=http://remotehost install --stack=dev My::App specify the stack
    187. 187. Using pintod For Installation$ cpancpan[1]> o conf urllist http://remotehost/devcpan[2]> install My::Appcpanm --mirror http://remotehost/dev --mirror-only My::Apppinto --root=http://remotehost install --stack=dev My::App
    188. 188. Pinto Net works
    189. 189. Pinto Net worksCPAN succeeds because it iscentralized
    190. 190. Pinto Net worksCPAN succeeds because it iscentralizedCPAN fails because it iscentralized
    191. 191. Pinto Net worksCPAN succeeds because it iscentralizedCPAN fails because it iscentralizedPinto can be centralized ordistributed
    192. 192. Pinto Net works The CPANTeam Team 1 3 Team 2
    193. 193. Pinto Net works
    194. 194. Pinto Net worksMight not be a good idea
    195. 195. Pinto Net worksMight not be a good ideaNo obvious way to resolvenamespace conflicts
    196. 196. Pinto Net worksMight not be a good ideaNo obvious way to resolvenamespace conflictsWe’ll have to wait and seeif this pans out
    197. 197. Pinto And OS Packaging• UsePinto to build up your application in some directory• Packagethe directory with your favorite OS tools• Add dependencies on non- perl stuff• Deploy as usual
    198. 198. Pinto And Other Tools• Still just a pile of directories and files with an index• AnnoCPAN, MetaCPAN, CPAN::Mini::Webser ver, etc. should still work
    199. 199. Pinto versus Carton Pinto CartonLight weightVCS-FriendlyLocal PatchesStack Support Enterprise Strength
    200. 200. Some Odds & Ends• Dist::Zilla::Plugin::Pinto::Add - release your dist to a Pinto repository with dzil• Dist::Zilla::Chef - use Pinto to manage your project dependencies within the dzil workflow
    201. 201. Pinto Architecture PintoConfiguration Pull Add Copy Merge Logging Repository Database File Store
    202. 202. Extending Pinto• Create an Action subclass and override the “execute” method• YourAction has access to the configuration, logger, and repository objects• Your Action can do whatever it wants• Like extract POD or ack source code in a distribution• But the API is not really stable yet
    203. 203. Future PlansMore VCS-behaviors: revert, diffsReport upstream impacts of upgradesCheck stack for unsatisfiable dependenciesVisualize dependency graphsFaster
    204. 204. Get Yours Todayhttps://metacpan.org/module/Pinto https://github.com/thaljef/Pinto
    205. 205. Thanks For Your Time Jeffrey Thalhammer thaljef@cpan.org
    1. A particular slide catching your eye?

      Clipping is a handy way to collect important slides you want to go back to later.

    ×