Dependency Management With Pinto
Upcoming SlideShare
Loading in...5
×
 

Dependency Management With Pinto

on

  • 1,561 views

 

Statistics

Views

Total Views
1,561
Slideshare-icon Views on SlideShare
1,561
Embed Views
0

Actions

Likes
1
Downloads
14
Comments
0

0 Embeds 0

No embeds

Accessibility

Upload Details

Uploaded via as Apple Keynote

Usage Rights

CC Attribution License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • \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

Dependency Management With Pinto Dependency Management With Pinto Presentation Transcript

  • Dependency Management With Pinto Jeffrey Thalhammer thaljef@cpan.org YAPC::NA June 15, 2012
  • CPAN Is HeavenTens of thousands ofmodules for everypurpose imaginableLots of ser vices fortesting, bug tracking,ratings, forumsAwesome tool chainfor building, testing,installing
  • CPAN Is HellThe CPAN is notstableDevelopersconstantly addingand removing stuffSometimes the codeis brokenTool chain expectsbackwardcompatibility
  • 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 development fun• cpanmmakes the deployment easy• DarkPANs proliferate
  • 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 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...
  • 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 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...
  • 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-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...
  • Working With Stacks
  • 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
  • The Default StackEvery Pinto repository has abuilt-in stack called “init”It is the default stack for alloperationsYou can change the defaultstack
  • 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/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...
  • 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.62 GAAS/URI-1.62.tar.gz...
  • 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 GAAS/URI-1.62.tar.gz...
  • 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
  • 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+ URI::Escape 3.31 GAAS/URI-1.59.tar.gzrf+ URI::Heuristic 4.20 GAAS/URI-1.59.tar.gz
  • 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
  • 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
  • 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.03And HTTP::Request requires ...
  • 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
  • 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...Pulling Plack-0.9988.tar.gz
  • 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
  • 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...
  • 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
  • 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
  • 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
  • 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 to DBIx::Class 1.7 on “test” stack
  • 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
  • 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
  • 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 in the “prod” stack
  • 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
  • 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
  • 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
  • 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 dependency list in a text file.Then feed dependencies into a Pinto repository.
  • 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
  • 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
  • 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
  • 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.This process might take several days or weeks.
  • 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.
  • 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.
  • 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 dependencies into the repository.
  • 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.
  • 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.
  • GotchasPinto does not index exactly like PAUSEMay not work for old or oddly packaged codePinto does not enforce permissionsPinto is strict about version numbers
  • 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 storageCan use HTTP authentication
  • 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 localhostpinto --root=http://somehost COMMAND
  • 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 stack name to url
  • Using pintod For Installation$ cpancpan[1]> o conf urllist http://remotehost/devcpan[2]> install My::Appcpanm --mirror http://remotehost/dev --mirror-only My::App
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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 ordistributed
  • 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 out
  • 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
  • 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
  • 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 - use Pinto to manage your project dependencies within the dzil workflow
  • Pinto Architecture PintoConfiguration Pull Add Copy Merge Logging Repository Database File Store
  • 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
  • Future PlansMore VCS-behaviors: revert, diffsReport upstream impacts of upgradesCheck stack for unsatisfiable dependenciesVisualize dependency graphsFaster
  • Get Yours Todayhttps://metacpan.org/module/Pinto https://github.com/thaljef/Pinto
  • Thanks For Your Time Jeffrey Thalhammer thaljef@cpan.org