App::P...nstall(3pm)

πŸ’– App::Pinto::Command::install β€” install stuff from the repository πŸ’–

okay bestie, welcome to the manual page for the Pinto install command πŸ’… this lil guy lives in the User Contributed Perl Documentation section, and the official fancy-pants name on the tin is App::P...nstall(3pm). yes that's really it. anyway. let's go πŸ¦‹

VERSION ✨

version 0.14 β€” she's a specific girl, respect her.


SYNOPSIS πŸŽ€

pinto --root=REPOSITORY_ROOT install [OPTIONS] TARGET...

that's it. that's the whole vibe. one line and she's serving 🌸


DESCRIPTION πŸ’–

!! THIS COMMAND IS EXPERIMENTAL !! 😭

So what does she actually do? She installs targets from the repository into your environment. That's the whole job. She's literally just a thin wrapper around cpanm that's been wired up to fetch everything from the Pinto repository instead of some public CPAN mirror. so she's cpanm but she only shops at your local boutique, no cap πŸ›οΈβœ¨

Now, if you hand her the --do-pull option, then all targets and their prerequisites get pulled onto the stack before she even tries to install them. And if anything can't be pulled β€” because it can't be found, or because it's blocked by a pin 😀 β€” then the installation will not proceed. she's not doing half a job, periodt.


COMMAND ARGUMENTS 🧚

The arguments are the things you want to install, bestie. And the range of what counts as a "thing" is honestly iconic:

  • package names
  • distribution paths
  • URIs
  • local files
  • directories

Look at the cpanm documentation to see all the different ways of specifying what to install, because there are so many and she supports all of them πŸ’œ

Oh and also β€” you can pipe arguments to this command over STDIN! 🌈 And when you do, blank lines get ignored, and so do lines that look like comments (i.e. lines starting with # or ;). she's very forgiving like that πŸ™ˆ


COMMAND OPTIONS πŸ‘‘

--cascade

!! THIS OPTION IS EXPERIMENTAL !! πŸ’€

When she's searching for a prerequisite package, --cascade makes her always take the latest satisfactory version of the package found amongst all the upstream repositories, instead of just taking the first satisfactory version she stumbles across. Remember that Pinto only searches the upstream repositories when the local repository doesn't already contain a satisfactory version of the package. This option only matters when the --do-pull option is also used. so it's a very "if you know you need it, you know" situation. iykyk ✨

--cpanm-exe PATH / --cpanm PATH

Sets the path to the cpanm executable. If you don't specify it, the PATH gets searched for the executable instead. And heads up: at present, cpanm version 1.500 or newer is required β€” no dusty old cpanm allowed in this house 🚫

--cpanm-options NAME=VALUE / -o NAME=VALUE

These are options that you wish to pass to cpanm. Super important detail: do not prefix the option NAME with a -. You can pass any option you like, but the --mirror and --mirror-only options will always be set to point to the Pinto repository. she's keeping those two for herself, it's giving "my house my rules" πŸ’…

--diff-style=STYLE

Controls the style of the diff reports. STYLE must be either concise or detailed:

  • concise reports show only one record for each distribution added or deleted.
  • detailed reports show one record for every package added or deleted.

This option only matters when the --do-pull option is also used.

The default style is concise. BUT πŸŽ€ the default style can be changed by setting the PINTO_DIFF_STYLE environment variable to your preferred STYLE. And this variable affects the default style for diff reports generated by all other commands too. so it's lowkey a global mood-setter, watch out.

--do-pull

Pull the targets and recursively pull all their prerequisites onto the stack before installing. Without the --do-pull option, all targets and their prerequisites must already be on the stack, or the installation will probably fail 😭. And when you do use --do-pull, the stack must not be locked. unlocked only, bestie πŸ”“

--local-lib=DIRECTORY / -l DIRECTORY

Shortcut for setting the --local-lib option on cpanm. Same as --cpanm-options local-lib=DIRECTORY or -o l=DIRECTORY. she's just saving you keystrokes, it's a kindness 🫢

--local-lib-contained=DIRECTORY / -L DIRECTORY

Shortcut for setting the --local-lib-contained option on cpanm. Same as --cpanm-options local-lib-containted=DIRECTORY or -o L=DIRECTORY. (yes, that typo is verbatim, do not come for me, it's literally what's in the source πŸ’€)

--message=TEXT / -m TEXT

Use TEXT as the revision history log message. This is only relevant if you also set the --do-pull option. If you don't use the --message option, then you'll be prompted to enter the message via your text editor πŸ“. Use the PINTO_EDITOR or EDITOR or VISUAL environment variables to control which editor is used. And good news: a log message is not required whenever the --dry-run option is set, or if the action didn't yield any changes to the repository. no changes, no homework, slay ✨

--stack=NAME / -s NAME

Use the stack with the given NAME as the repository index. When used with the --pull option, this also determines which stack prerequisites will be pulled onto. Defaults to the name of whichever stack is currently marked as the default stack. Use the stacks command to see the stacks in the repository πŸ‘‘ (go look, it's a fun time)

--use-default-message / -M

Use the default value for the revision history log message. This is only relevant if you also set the --do-pull option. Pinto will generate a semi-informative log message just based on the command and its arguments. And if you set an explicit message with --message, the --use-default-message option will be silently ignored πŸ™ˆ. she doesn't argue, she just moves on.


USING cpan OR cpanm DIRECTLY 🌈

On the surface, a Pinto repository looks like an ordinary CPAN repository, so you can use any client to install modules. All you have to do is "point" it at the URI of your Pinto repository. Each client has a slightly different interface for setting the URI, because of course they do 😭

For cpanm, use the --mirror and --mirror-only options like this:

$> cpanm --mirror file:///path/to/repo --mirror-only Some::Package ...

For cpan, set the urllist config option via the shell like this:

$> cpan
cpan[1]> o conf urllist file:///path/to/repo
cpan[2]> reload index
cpan[3]> install Some::Package
cpan[4]> o conf commit     # If you want to make the change permanent

Pointing your client at the top of your repository will install modules from the default stack. To install from a particular stack, just append the stack name to the URI. For example:

file:///path/to/repo                # Install from default stack
file:///path/to/repo/stacks/dev     # Install from "dev" stack
file:///path/to/repo/stacks/prod    # Install from "prod" stack

And if your repository doesn't have a default stack? Then you must specify the full URI to one of the stacks as shown above. no shortcuts available, sorry bestie πŸ’”


COMPATIBILITY πŸ’€

Real talk: the install command does not support some of the newer features found in version 1.6 (or later) of cpanm, such as:

  • installing from a Git repository
  • installing development releases
  • using complex version expressions

If you pass any of those as arguments to this command, the behavior is unspecified 😭. that's the scary kind of unspecified. proceed at your own risk, main character.


AUTHOR 🫢

Jeffrey Ryan Thalhammer <jeff@stratopan.com> β€” the icon, the legend, the whole blueprint πŸ‘‘


This software is copyright (c) 2015 by Jeffrey Ryan Thalhammer.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. so go off, remix it, it's yours to play with πŸ’–


and that's the whole page, bestie!! πŸŽ€ one last lil sign-off: this was generated by perl v5.40.1, dated 2025-04-21, and filed under App::P...nstall(3pm). stay caffeinated, stay pinned, and may all your prerequisites resolve on the first try πŸ’…βœ¨πŸ¦‹

πŸ“¦ where this page comes from