racket/pkgs/racket-doc/pkg/scribblings/pkg.scrbl

1658 lines
80 KiB
Racket

#lang scribble/manual
@(require scribble/bnf
scribble/core
"common.rkt"
(for-label pkg
(except-in racket/base remove)
setup/dirs
setup/matching-platform))
@(define @|Planet1| @|PLaneT|)
@(define package-name-chars
@list{@litchar{a} through @litchar{z},
@litchar{A} through @litchar{Z},
@litchar{0} through @litchar{9},
@litchar{_}, and @litchar{-}})
@(define raco-doc '(lib "scribblings/raco/raco.scrbl"))
@(define (gtech s)
@tech[#:doc '(lib "scribblings/guide/guide.scrbl") s])
@(define subcommand list)
@; ----------------------------------------
@title{Package Management in Racket}
@author[@author+email["Jay McCarthy" "jay@racket-lang.org"]]
The Racket package manager lets you install new libraries and
collections, and the Racket package catalog helps other Racket
programmers find libraries that you make available.
@table-of-contents[]
@; ----------------------------------------
@include-section["getting-started.scrbl"]
@; ----------------------------------------
@section{Package Concepts}
A @deftech{package} is a set of modules in some number of
@gtech{collections}. Modules installed using the Racket package
manager are @racket[require]d like any other modules. For example, if
the package @pkgname{tic-tac-toe} contains the module
@filepath{matrix.rkt} in a @filepath{data} collection, then after
@pkgname{tic-tac-toe} is installed,
@racketblock[(require data/matrix)]
imports the module. The package name is not mentioned with
@racket[require], because packages are a way of managing library
collections, not a way of referencing them. It is common, however, for
a package to implement a collection whose name is the same as the
package name---in which case a @racket[require] might appear to be
referencing a @tech{package}, but it is actually referencing a
@gtech{collection} provided by the @tech{package}.
Each @tech{package} has associated @deftech{package metadata}:
@itemlist[
@item{a @deftech{package name} --- a string made of the characters @|package-name-chars|.}
@item{a @deftech{checksum} --- a string that identifies different releases of a package. A
package can be updated when its @tech{checksum} changes,
whether or not its @tech{version} changes. The checksum normally
can be computed as the SHA1 (see @racketmodname[openssl/sha1])
of the package's content.}
@item{a @deftech{version} --- a string of the form @nonterm{maj}@litchar{.}@nonterm{min},
@nonterm{maj}@litchar{.}@nonterm{min}@litchar{.}@nonterm{sub}, or
@nonterm{maj}@litchar{.}@nonterm{min}@litchar{.}@nonterm{sub}@litchar{.}@nonterm{rel},
where @nonterm{maj}, @nonterm{min}, @nonterm{sub}, and @nonterm{rel} are
all canonical decimal representations of natural numbers, @nonterm{min} has no more
than two digits, and @nonterm{sub} and @nonterm{rel} has no more than
three digits. A version is intended to reflect available features of
a package, and should not be confused with different releases of
a package as indicated by the @tech{checksum}.}
@item{a list of dependencies --- a list of packages to be installed simultaneously, optionally
with a lower bound on each package's @tech{version}.}
]
A @tech{package} is typically represented by a directory with the same
name as the package. The @tech{checksum} is typically left implicit.
The package directory can contain a file named @filepath{info.rkt}
to declare other metadata (see @secref["metadata"]).
@subsection[#:tag "concept:multi-collection"]{Single-collection and Multi-collection Packages}
A @tech{package} can be a @tech{single-collection package} or a
@tech{multi-collection package}:
@itemlist[
@item{A @deftech{single-collection package}'s directory doubles as a
@gtech{collection} directory. By default, the package name also
doubles as the collection name, but if the package has an
@filepath{info.rkt} file that defines @racketidfont{collection} to a
string, then the string is used as the name of the package's
collection.}
@item{A @deftech{multi-collection package}'s directory contains
subdirectories, each of which is a @gtech{collection} that is
provided by the package (where the directory name is used as
the collection name). A @tech{multi-collection package} must
have an @filepath{info.rkt} file that defines
@racketidfont{collection} as @racket['multi].}
]
@subsection[#:tag "concept:source"]{Package Sources}
A @deftech{package source} identifies a @tech{package}
representation. Each package source type has a different way of
storing the @tech{checksum} and providing the package content (usually
with @tech{single-collection package} and @tech{multi-collection
package} variants).
The @tech{package source} types are:
@itemlist[
@; ----------------------------------------
@item{a local file path naming an archive (as a plain path or @litchar{file://} URL)
--- The name of the package
is the basename of the archive file. The @tech{checksum} for archive
@filepath{f.@nonterm{ext}} is given by the file @filepath{f.@nonterm{ext}.CHECKSUM}.
The valid archive formats
are (currently) @filepath{.zip}, @filepath{.tar}, @filepath{.tgz},
@filepath{.tar.gz}, and
@filepath{.plt}.
Other than a @litchar{type} query, which affects inference as described below,
any query or fragments parts of a @litchar{file://} URL are ignored.
For example, @filepath{~/tic-tac-toe.zip} is an archive package
source, and its @tech{checksum} would be inside
@filepath{~/tic-tac-toe.zip.CHECKSUM}.
An archive represents package content analogous to a directory, but if
the archive's content is contained within a single top-level
directory, then the directory's content (as opposed to the overall
archive content) is used as the package content. The @filepath{.plt}
format does not accommodate either an extra directory layer or a
@tech{single-collection package} representation.
A package source is inferred to refer to an archive file
only when it has a suffix matching a valid archive format
and when it starts with @litchar{file://} or does not start
with alphabetic characters followed by @litchar{://}. In the
case that the package source starts with @litchar{file://},
it must be a URL without a @litchar{type} query or
with a @litchar{type} query value of @litchar{file}.
The inferred
package name is the filename without its suffix.
@history[#:changed "6.0.1.12"
@elem{Changed treatment of an archive that contains all
content within a top-level directory.}
#:changed "6.1.1.5"
@elem{Changed @litchar{file://} parsing to accept a general
URL, recognize a @litchar{type} query, and ignore any
other query or fragment.}]}
@; ----------------------------------------
@item{a local directory (as a plain path or @litchar{file://} URL)
--- The name of the package is the name of the
directory. The @tech{checksum} is not present.
Other than a @litchar{type} query, which affects inference as described below,
any query or fragments parts of a @litchar{file://} URL are ignored.
For example,
@filepath{~/tic-tac-toe/} is a directory package source.
A package source is inferred to refer
to a directory only when it does not have a file-archive suffix, does
not match the grammar of a package name, and either starts with
@litchar{file://} or does not start
with alphabetic characters followed by @litchar{://}. In the
case that the package source starts with @litchar{file://},
it must be a URL without a @litchar{type} query or
with a @litchar{type} query value of @litchar{dir}, @litchar{link}, or
@litchar{static-link}.
The inferred package name is the directory name.
When the package source is a @litchar{file://} URL with a
@litchar{type} query value of @litchar{link} or @litchar{static-link},
then the package is installed as directory link, the same as if
@DFlag{link} or @DFlag{static-link} is supplied to
@command-ref{install} or @command-ref{update}.
@history[#:changed "6.1.1.5"
@elem{Changed @litchar{file://} parsing to accept a general
URL, recognize a @litchar{type} query, and ignore any
other query or fragment.}]}
@item{a remote URL naming an archive --- This type follows the same
rules as a local file path, but the archive and @tech{checksum} files are
accessed via HTTP(S).
For example,
@filepath{http://game.com/tic-tac-toe.zip} is a remote URL package
source whose @tech{checksum} is found at
@filepath{http://game.com/tic-tac-toe.zip.CHECKSUM}.
A package source is inferred to be a URL only when it
starts with @litchar{http://} or @litchar{https://}, and it
is inferred to be a file URL when the URL ends with a path element
that could be inferred as a file archive.
The inferred package name is from the URL's file name in the same
way as for a file package source.}
@; ----------------------------------------
@item{a remote URL naming a directory --- The remote directory must
contain a file named @filepath{MANIFEST} that lists all the contingent
files. These are downloaded into a local directory and then the rules
for local directory paths are followed. However, if the remote
directory contains a file named @filepath{.CHECKSUM}, then it is used
to determine the @tech{checksum}.
For example,
@filepath{http://game.com/tic-tac-toe/} is a directory URL package
source whose @tech{checksum} is found at
@filepath{http://game.com/tic-tac-toe/.CHECKSUM}.
A package source is inferred to be a URL the same for a directory or
file, and it is treated as a directory URL when it does not end with a
path element that has an archive file suffix or a @filepath{.git}
suffix. The inferred package name is the directory name.
@history[#:changed "6.1.1.1" @elem{Added special-casing of the @filepath{.git} suffix.}]}
@; ----------------------------------------
@item{a remote URL naming a Git repository --- The format for such
URLs is:
@inset{@nonterm{scheme}@exec{://@nonterm{host}/}...@exec{/}@nonterm{repo}@;
@optional{@exec{.git}}@optional{@exec{/}}@optional{@exec{?path=}@nonterm{path}}@;
@optional{@exec{#}@nonterm{rev}}}
where @nonterm{scheme} is @litchar{git}, @litchar{http}, or
@litchar{https}, and where @nonterm{host} is any address other than
@litchar{github.com} (which is treated more specifically as a GitHub
reference). The @nonterm{path} can contain multiple
@litchar{/}-separated elements to form a path within the repository,
and it defaults to the empty path. The @nonterm{rev} can be a branch,
tag, or commit, and it defaults to @exec{master}.
@margin-note{Due to properties of the Git protocol, the archive might
be accessed more efficiently when @nonterm{rev} refers to a branch or
tag (even if it is written as a commit). In those cases, the content
typically can be obtained without downloading irrelevant history.}
For example, @filepath{http://bitbucket.org/game/tic-tac-toe#master}
is a Git package source.
A checkout of the repository at @nonterm{rev} provides the content of
the package, and @nonterm{scheme} determines the protocol
that is used to clone the repository. The package's @tech{checksum}
is the hash identifying @nonterm{rev} if @nonterm{rev} is a branch or
tag, otherwise @nonterm{rev} itself serves as the @tech{checksum}.
A package source is inferred to be a Git reference when it starts with
@litchar{git://} and the host is not @litchar{github.com}. A package
source is also inferred to be a Git reference when it starts with
@litchar{http://} or @litchar{https://} and the last non-empty path
element ends in @litchar{.git}; a @litchar{.git} suffix is added if
the source is otherwise specified to be a Git reference. The inferred
package name is the last element of @nonterm{path} if it is non-empty,
otherwise the inferred name is @nonterm{repo}.
@history[#:changed "6.1.1.1" @elem{Added Git repository support.}]}
@; ----------------------------------------
@item{a remote URL naming a GitHub repository --- The format for such
URLs is the same as for a Git repository reference starting
@litchar{git://}, but with @litchar{github.com} as the host:
@inset{@exec{git://github.com/}@nonterm{user}@exec{/}@nonterm{repo}@;
@optional{@exec{.git}}@optional{@exec{/}}@optional{@exec{?path=}@nonterm{path}}@;
@optional{@exec{#}@nonterm{rev}}}
For example, @filepath{git://github.com/game/tic-tac-toe#master}
is a GitHub package source.
@margin-note{A Github repository source that starts with
@litchar{git://} obtains the same content that would be accessed if
@litchar{github.com} were not treated specially. The special treatment
is preserved for historical reasons, especially in combination
with @envvar{PLT_USE_GITHUB_API}.}
For backward compatibility, an older format is also supported:
@inset{@exec{github://github.com/}@nonterm{user}@exec{/}@nonterm{repo}@;
@exec{/}@nonterm{rev}@optional{@exec{/}@nonterm{path}}}
The @exec{zip}-formatted archive for the repository (generated by
GitHub for any commit) is used as a remote URL archive path. The
@tech{checksum} is the hash identifying @nonterm{rev} if @nonterm{rev}
is a branch or tag, otherwise @nonterm{rev} itself serves as the
@tech{checksum}.
A package source is inferred to be a GitHub reference when it starts
with @litchar{git://github.com/} or @litchar{github://}; a package
source that is otherwise specified as a GitHub reference is
automatically prefixed with @litchar{git://github.com/}. The inferred
package name is the last element of @nonterm{path} if it is non-empty,
otherwise the inferred name is @nonterm{repo}.
If the @indexed-envvar{PLT_USE_GITHUB_API} environment variable is
set, GitHub packages are obtained using the GitHub API protocol
instead of using the Git protocol.
@history[#:changed "6.3" @elem{Changed handling of
GitHub sources to use the Git
protocol by default.}]}
@; ----------------------------------------
@item{a @tech{package name} --- A @tech{package catalog} is
consulted to determine the source and @tech{checksum} for the package.
For
example, @exec{tic-tac-toe} is a package name that can be used as a
package source.
A package source is inferred
to be a package name when it fits the grammar of package names, which
means that it has only the characters @|package-name-chars|.}
]
@subsection[#:tag "concept:catalog"]{Package Catalogs}
A @deftech{package catalog} is a server or database that converts package
names to other package sources. A @tech{package catalog} is identified by a string
representing a URL, where a @litchar{http://} or @litchar{https://}
URL indicates a remote server, and a @litchar{file://} URL indicates a
local catalog in the form of an SQLite database or a directory tree.
PLT supports two @tech{package catalog} servers that are enabled by
default: @url{https://pkgs.racket-lang.org} for new packages and
@url{http://planet-compats.racket-lang.org} for automatically
generated packages for old @|PLaneT| packages. Anyone may host a
@tech{package catalog}, and any file-serving HTTP host can act
as a basic @tech{package catalog} server. See @secref["catalog-protocol"]
for information on how package information is extracted from a catalog.
@subsection[#:tag "concept:auto"]{Explicit vs@|._| Auto-Installation}
When a package is installed, the original source of its installation
is recorded, as well as whether the installation was an @tech{automatic installation}. An
@deftech{automatic installation} is one that was installed because it
was a dependency of some other package (as opposed to being installed
explicitly by a user).
@subsection[#:tag "concept:conflicts"]{Package Conflicts}
Two packages are in @deftech{conflict} if they contain the same
module. For example, if the package @pkgname{tic-tac-toe} contains the
module file @filepath{data/matrix.rkt} and the package
@pkgname{factory-optimize} contains the module file
@filepath{data/matrix.rkt}, then @pkgname{tic-tac-toe} and
@pkgname{factory-optimize} are in conflict.
A package may also be in
conflict with Racket itself, if it contains a module file that is part
of the base Racket implementation. For example, any package that
contains @filepath{racket/list.rkt} is in conflict with Racket.
For the purposes of conflicts, a module is a file that ends in
@filepath{.rkt}, @filepath{.ss}, or @filepath{.scrbl}.
@subsection[#:tag "concept:updates"]{Package Updates}
Package A is a @deftech{package update} of Package B if (1) B is
installed, (2) A and B have the same name, and (3) A's @tech{checksum} is
different than B's. A @tech{single-collection package}
can be a @tech{package update} of a @tech{multi-collection package}
and vice versa.
Note that a package @tech{version} is not taken
into account when determining a @tech{package update}, although a change
in a package's @tech{version} (in either direction)
implies a change in the @tech{checksum} because the checksum is
computed from the package source and the meta-data that specifies
the version is part of the source.
@subsection[#:tag "concept:scope"]{Package Scopes}
A @deftech{package scope} determines the effect of package
installations, updates, @|etc|, with respect to different users and
Racket installations. The default @tech{package scope} can be
configured, but it is normally @exec{user}, which makes actions
specific to both the current user and the installation's name/version
(in the sense of @racket[get-installation-name]). The
@exec{installation} scope means that package operations affect
all users of the Racket installation.
A directory path can be used as a @tech{package scope}, in which case
package operations affect the set of packages installations in the
directory. An installation can be configured to include the
directory in its search path for installed packages (see
@secref["config-file" #:doc raco-doc]).
Conflict checking disallows installation of the same or conflicting
package in different scopes, but if such a configuration is forced,
collections are found first in packages with @exec{user} @tech{package
scope}. Search then proceeds in a configured order, where
@exec{installation} @tech{package scope} typically precedes other
directory @tech{package scopes}.
@; ----------------------------------------
@section[#:tag "cmdline"]{Using @exec{raco pkg}}
The @exec{raco pkg} command provides package-management tools via
sub-commands.
@subcommand{@command/toc{install} @nonterm{option} ... @nonterm{pkg-source} ...
--- Installs the given @tech{package sources} (eliminating exact-duplicate @nonterm{pkg-source}s).
If a given @nonterm{pkg-source} is @seclink["concept:auto"]{auto-installed} (to satisfy some other package's
dependency), then it is promoted to explicitly installed.
If no @nonterm{pkg-source}s are supplied and the @DFlag{clone}
flag is not supplied, the current directory is installed as a
link. See the @DFlag{link} flag below for more details.
If no @nonterm{pkg-source}s are supplied and the @DFlag{clone}
flag is supplied, then the clone directory's name is used as the
only @nonterm{pkg-source} argument. See the @DFlag{clone} flag
below for more details.
The @exec{install} sub-command accepts
the following @nonterm{option}s:
@itemlist[
@item{@DFlag{type} @nonterm{type} or @Flag{t} @nonterm{type} --- Specifies an interpretation of the package source,
where @nonterm{type} is either @exec{file}, @exec{dir}, @exec{file-url}, @exec{dir-url}, @exec{git}, @exec{github},
or @exec{name}. The type is normally inferred for each @nonterm{pkg-source}.}
@item{@DFlag{name} @nonterm{pkg} or @Flag{n} @nonterm{pkg} --- Specifies the name of the package,
which makes sense only when a single @nonterm{pkg-source} is provided. The name is normally
inferred for each @nonterm{pkg-source}.}
@item{@DFlag{checksum} @nonterm{checksum} --- Specifies a checksum for the package,
which normally makes sense only when a single @nonterm{pkg-source} is provided. The use of
@nonterm{checksum} depends on @nonterm{pkg-source}: for a Git or GitHub source, @nonterm{checksum} selects a checksum;
for a @tech{package name}, file path, or remote URL as a source, @nonterm{checksum} specifies an expected checksum;
for a directory path (including a remote directory URL without a @filepath{.CHECKSUM} file) as a source,
@nonterm{checksum} assigns a checksum.}
@item{@DFlag{deps} @nonterm{behavior} --- Selects the behavior for dependencies, where @nonterm{behavior} is one of
@itemlist[
@item{@exec{fail} --- Cancels the installation if dependencies are uninstalled or version requirements are unmet.
This behavior is the default for non-@tech{interactive mode}.}
@item{@exec{force} --- Installs the package(s) despite missing dependencies or version requirements.
Forcing an installation may leave package content in an inconsistent state.}
@item{@exec{search-ask} --- Looks for dependencies (when uninstalled) or updates (when version requirements are unmet)
via the configured @tech{package catalogs},
but asks the user whether packages should be installed or updated. This behavior is the default in @tech{interactive mode}.}
@item{@exec{search-auto} --- Like @exec{search-ask}, but does not ask for permission to install or update.}
]}
@item{@DFlag{auto} --- Shorthand for @exec{@DFlag{deps} search-auto}.}
@item{@DFlag{update-deps} --- With @exec{search-ask} or @exec{search-auto} dependency behavior, checks
already-installed dependencies transitively for updates (even when
not forced by version requirements), asking or automatically updating a
package when an update is available. When a package is updated or installed,
unless @DFlag{skip-implies} is specified, any package that
it implies (see @secref["metadata"]) is automatically updated independent of the behavior
requested via @DFlag{update-deps} and @DFlag{deps}.}
@item{@DFlag{skip-implies} --- Disables special treatment of dependencies that are listed
in @racketidfont{implies} (see @secref["metadata"]) for an installed or updated package.}
@item{@DFlag{link} --- Implies @exec{--type dir}
and links the existing directory as an installed package, instead of copying the
directory's content to install. Directory @tech{package sources} are treated as links
by default, unless @DFlag{copy} is specified or the directory name was reported by
a catalog instead of specified directly.
The package is identified
as a @tech{single-collection package} or a @tech{multi-collection package} at the
time that it is installed, and that categorization does not change even if the @schemeidfont{collection}
definition in @filepath{info.rkt} is changed (i.e., the package must be removed and re-installed
for the change to take effect).}
@item{@DFlag{static-link} --- Implies @DFlag{link}, and also indicates that subdirectories
of the given directory will not change for each given directory that implements a
@tech{multi-collection package}.}
@item{@DFlag{copy} --- Disables default handling of directory @tech{package sources} as links,
and instead treats them like other sources: package content is copied to install.}
@item{@DFlag{clone} @nonterm{dir} --- A Git or GitHub @tech{package
source} is cloned as @nonterm{dir} and locally linked as the
package implementation. See also @secref["clone-link"].
If no @nonterm{pkg-source} is supplied, then the last path element
of @nonterm{dir} is used as a package name and used as a
@nonterm{pkg-source} argument.
Multiple @nonterm{pkg-source}
arguments make sense only if they all specify the same Git
repository (with different paths into the repository). The
@DFlag{clone} flag implies @DFlag{type} in the sense that each
@nonterm{pkg-source} must be either a Git or GitHub
@tech{package source} or a @tech{package name}, where a
@tech{package name} must be mapped by the @tech{package catalog} to a
Git or GitHub @tech{package source}.}
@item{@DFlag{binary} --- Strips source elements of a package before installing, and implies @DFlag{copy}.
See also @secref["strip"].}
@item{@DFlag{source} --- Strips built elements of a package before installing, and implies @DFlag{copy}.
See also @secref["strip"].}
@item{@DFlag{scope} @nonterm{scope} --- Selects the @tech{package scope} for installation, where @nonterm{scope} is one of
@itemlist[
@item{@exec{installation} --- Install packages for all users of a Racket installation, rather than user-specific.}
@item{@exec{user} --- Install packages for the current user and current installation's name/version.}
]
The default package scope is normally @exec{user}, but it can be configured with
@command-ref{config}@exec{ --set default-scope @nonterm{scope}}.
The default installation name is normally the Racket version, but it can be configured with
@command-ref{config}@exec{ --set name @nonterm{name}}.}
@item{@Flag{i} or @DFlag{installation} --- Shorthand for @exec{--scope installation}.}
@item{@Flag{u} or @DFlag{user} --- Shorthand for @exec{--scope user}.}
@item{@DFlag{scope-dir} @nonterm{dir} --- Select @nonterm{dir} as the @tech{package scope}.}
@item{@DFlag{catalog} @nonterm{catalog} --- Uses @nonterm{catalog} instead of of the currently configured
@tech{package catalogs}.}
@item{@DFlag{skip-installed} --- Ignores any @nonterm{pkg-source}
whose name corresponds to an already-installed package, except for promoting @seclink["concept:auto"]{auto-installed}
packages to explicitly installed.}
@item{@DFlag{pkgs} --- Disables default installation of the current directory when no @nonterm{pkg-source}s
are supplied.}
@item{@DFlag{all-platforms} --- Considers package dependencies independent of the current platform
(instead of filtering dependencies to platforms other than the current one).}
@item{@DFlag{force} --- Ignores module conflicts, including conflicts due to installing a single
package in multiple scopes. Forcing an installation may leave package content in an
inconsistent state.}
@item{@DFlag{ignore-checksums} --- Ignores errors verifying package @tech{checksums} (unsafe).}
@item{@DFlag{strict-doc-conflicts} --- Refuses to install in user @tech{package scope} when
documentation-directory names would conflict with other packages. ``Conflicting''
documentation names are normally allowed for installation in user @tech{package scope},
but strict checking ensures that installation would succeed in other @tech{package scopes}.}
@item{@DFlag{no-cache} --- Disables use of the download cache.}
@item{@DFlag{multi-clone} @nonterm{mode} --- Specifies the handling
of packages that are from the same Git repository but are installed
with different clone-linking modes or different clone directories.
(See also @secref["git-workflow"].)
The following modes are available:
@itemlist[
@item{@exec{convert} --- Converts non-clone-linked packages (either newly or previously installed)
to clone-linked packages, assuming that the packages that are clone-linked
all use the same clone directory. If clone-linked packages currently use
different clone directories, installation fails.}
@item{@exec{ask} --- In the case when packages can be converted, ask the user whether to convert
or allow the different clone-linking modes or clone directories. If converting
is not an option, the installation fails. This clone-handling mode is the default
in @tech{interactive mode}.}
@item{@exec{fail} --- Reports an error and cancels the installation (the default in non-@tech{interactive mode}).}
@item{@exec{force} --- Allows packages to have different clone-linking modes or clone directories.}
]}
@item{@DFlag{pull} @nonterm{mode} --- Specifies the way that commits
are merged to clone-linked packages (see @secref["git-workflow"])
on installation or update. The following modes are available:
@itemlist[
@item{@exec{ff-only} --- Commits are merged using @DFlag{ff-only}, and installation fails
if the fast-forward merge fails.}
@item{@exec{try} --- Like @exec{ff-only}, but if the fast-forward fails, the repository checkout is
left as-is, and installation continues.}
@item{@exec{rebase} --- Commits are merged using @exec{git rebase} instead of @exec{git merge}.}
]}
@item{@DFlag{dry-run} --- Prevents changes to the current installation. All installation and update work is
staged and checked, but the final installation step is skipped.}
@item{@DFlag{no-setup} --- Does not run @exec{raco setup} after installation. This behavior is also the case if the
environment variable @envvar{PLT_PKG_NOSETUP} is set to any non-empty value.}
@item{@DFlag{jobs} @nonterm{n} or @Flag{j} @nonterm{n} --- Installs and runs @exec{raco setup} with @nonterm{n} parallel jobs.}
@item{@DFlag{batch} --- Disables @deftech{interactive mode}, suppressing potential prompts for a user
(e.g., about package dependencies or clone sharing).}
@item{@DFlag{no-trash} --- Refrains from moving updated or removed packages to a trash folder.}
@item{@DFlag{fail-fast} --- Breaks @exec{raco setup} as soon as any error is encountered.}
]
@history[#:changed "6.1.1.5" @elem{Added the @DFlag{batch}, @DFlag{clone}, and
@DFlag{multi-clone} flags.}
#:changed "6.1.1.6" @elem{Added the @DFlag{no-trash} flag, and changed
the @DFlag{deps} default to depend only on interactive mode.}
#:changed "6.1.1.8" @elem{Added the @DFlag{pull} flag.}
#:changed "6.4.0.14" @elem{Added the @DFlag{dry-run} flag.}]}
@subcommand{@command/toc{update} @nonterm{option} ... @nonterm{pkg-source} ...
--- Checks the specified package names for @tech{package updates} or
replaces existing package installations with the given sources. If an
update or replacement cannot be installed (e.g. it conflicts with
another installed package), then this command fails without installing
any of the @nonterm{pkg-source}s (or their dependencies).
The treatment of a @nonterm{pkg-source} depends on the way that it parses:
@itemlist[
@item{When a @nonterm{pkg-source} parses as a @tech{package name},
then the named package must be installed already, and it is
checked for updates. The @DFlag{lookup} and @DFlag{clone} flags
change this interpretation of @nonterm{pkg-source}.}
@item{If @nonterm{pkg-source} parses as a directory @tech{package
source}, and if the named package is installed as a link to a
@seclink["clone-link"]{Git repository clone}, then the clone is checked for
updates. The @DFlag{link}, @DFlag{static-link}, and
@DFlag{copy} flags change this interpretation of
@nonterm{pkg-source}.}
@item{Otherwise, @nonterm{pkg-source} specifies a @tech{package
source} to replace the current installation of the named package.}
]
If no @nonterm{pkg-source}, @DFlag{all} or @Flag{a} flag, or
@DFlag{clone} flag is specified, and if the current directory is
within a package, then the enclosing package is updated. If no
@nonterm{pkg-source} is specified, but @DFlag{clone} is supplied, then
the clone directory's name is used as the only @nonterm{pkg-source}
argument.
If a @tech{package scope} is not specified, the scope is inferred from
the given @nonterm{pkg-source}s.
The @exec{update} sub-command accepts
the following @nonterm{option}s:
@itemlist[
@item{@DFlag{all} or @Flag{a} --- Updates all packages, if no packages are given in the argument list.}
@item{@DFlag{lookup} --- Causes a @tech{package name} as a
@nonterm{pkg-source} to be used as a replacement that is looked
up in a catalog, instead of the name of an installed package
that may have updates from its current source. (If the named
package was installed through a package name, then there's
effectively no difference, unless a different catalog is
used.)
By default, if @nonterm{pkg-source} refers to a package that is
currently linked as a @seclink["clone-link"]{Git repository
clone}, then replacing the installation with a
catalog-specified source has the effect of removing the clone
link. However, the @DFlag{lookup} flag can be combined with the
@DFlag{clone} flag (assuming that the catalog maps the package
to a Git repository) so that the resulting installation is a
linked repository clone.}
@item{@DFlag{type} @nonterm{type} or @Flag{t} @nonterm{type} --- Same as for @command-ref{install}.}
@item{@DFlag{name} @nonterm{pkg} or @Flag{n} @nonterm{pkg} --- Same as for @command-ref{install}.}
@item{@DFlag{checksum} @nonterm{checksum} --- Same as for @command-ref{install}.}
@item{@DFlag{deps} @nonterm{behavior} --- Same as for @command-ref{install}.}
@item{@DFlag{auto} --- Shorthand for @exec{@DFlag{deps} search-auto} plus @DFlag{update-deps}.}
@item{@DFlag{update-deps} --- Same as for @command-ref{install}, but
implied by @DFlag{auto} only for @command-ref{update}.}
@item{@DFlag{skip-implies} --- Same as for @command-ref{install}.}
@item{@DFlag{link} --- Same as for @command-ref{install}, but a
directory package source is treated as a link by default only
when it does not correspond to a link or a Git repository
clone.}
@item{@DFlag{static-link} --- Same as for @command-ref{install}.}
@item{@DFlag{copy} --- Same as for @command-ref{install}.}
@item{@DFlag{clone} @nonterm{dir} --- Same as for
@command-ref{install}, except that a @nonterm{pkg-source} as a
@tech{package name} is treated as the name of an installed
package (unless @DFlag{lookup} is specified). In that case, the package must be currently installed
from a Git or GitHub source---possibly as directed by a
catalog---and that source is used for the clone (which replaces
the existing package installation).
To convert a clone-linked package to a normal installation, use
@command-ref{update} either with the @DFlag{lookup} flag or with
a replacement @tech{package source} that is not a package name.}
@item{@DFlag{binary} --- Same as for @command-ref{install}.}
@item{@DFlag{source} --- Same as for @command-ref{install}.}
@item{@DFlag{scope} @nonterm{scope} --- Selects a @tech{package scope}, the same as for @command-ref{install}.}
@item{@Flag{i} or @DFlag{installation} --- Shorthand for @exec{--scope installation}.}
@item{@Flag{u} or @DFlag{user} --- Shorthand for @exec{--scope user}.}
@item{@DFlag{scope-dir} @nonterm{dir} --- Selects @nonterm{dir} as the @tech{package scope}, the same as for @command-ref{install}.}
@item{@DFlag{catalog} @nonterm{catalog} --- Same as for @command-ref{install}.}
@item{@DFlag{skip-uninstalled} --- Ignores any @nonterm{pkg-source} that does not correspond to an installed package.}
@item{@DFlag{all-platforms} --- Same as for @command-ref{install}.}
@item{@DFlag{force} --- Same as for @command-ref{install}.}
@item{@DFlag{ignore-checksums} --- Same as for @command-ref{install}.}
@item{@DFlag{strict-doc-conflicts} --- Same as for @command-ref{install}.}
@item{@DFlag{no-cache} --- Same as for @command-ref{install}.}
@item{@DFlag{multi-clone} @nonterm{mode} --- Same as for @command-ref{install}, except that when
@DFlag{lookup} is specified and @DFlag{clone} is not specified, then conversion goes from
clone to non-clone linking---but only for sharing differences implied by the immediate
command-line arguments compared against existing package installations.}
@item{@DFlag{pull} @nonterm{mode} --- Same as for @command-ref{install}}
@item{@DFlag{dry-run} --- Same as for @command-ref{install}.}
@item{@DFlag{no-setup} --- Same as for @command-ref{install}.}
@item{@DFlag{jobs} @nonterm{n} or @Flag{j} @nonterm{n} --- Same as for @command-ref{install}.}
@item{@DFlag{batch} --- Same as for @command-ref{install}.}
@item{@DFlag{no-trash} --- Same as for @command-ref{install}.}
]
@history[#:changed "6.1.1.5" @elem{Added the @DFlag{batch}, @DFlag{clone}, and
@DFlag{multi-clone} flags, and
added update of enclosing package
when no arguments are provided.}
#:changed "6.1.1.6" @elem{Added the @DFlag{no-trash} flag, and changed
the @DFlag{deps} default to depend only on interactive mode.}
#:changed "6.1.1.8" @elem{Added the @DFlag{skip-uninstalled} and @DFlag{pull} flags.}]
#:changed "6.4.0.14" @elem{Added the @DFlag{dry-run} flag.}}
@subcommand{@command/toc{remove} @nonterm{option} ... @nonterm{pkg} ...
--- Attempts to remove the given packages. By default, if a package is the dependency
of another package that is not listed, this command fails without
removing any of the @nonterm{pkg}s.
If a @tech{package scope} is not specified, the scope is inferred from
the given @nonterm{pkg}s.
The @exec{remove} sub-command accepts
the following @nonterm{option}s:
@itemlist[
@item{@DFlag{demote} --- ``Removes'' explicitly installed packages by demoting them to @seclink["concept:auto"]{auto-installed}
(leaving auto-installed packages as such). Combined with @DFlag{auto}, removes
packages for which there are no dependencies.}
@item{@DFlag{force} --- Ignores dependencies when removing packages.}
@item{@DFlag{auto} --- In addition to removing each @nonterm{pkg},
removes @seclink["concept:auto"]{auto-installed} packages (i.e., installed by the @exec{search-auto} or @exec{search-ask}
dependency behavior, or demoted via @DFlag{demote}) that are no longer required by any
explicitly installed package.}
@item{@DFlag{scope} @nonterm{scope} --- Selects a @tech{package scope}, the same as for @command-ref{install}.}
@item{@Flag{i} or @DFlag{installation} --- Shorthand for @exec{--scope installation}.}
@item{@Flag{u} or @DFlag{user} --- Shorthand for @exec{--scope user}.}
@item{@DFlag{scope-dir} @nonterm{dir} --- Selects @nonterm{dir} as the @tech{package scope}, the same as for @command-ref{install}.}
@item{@DFlag{dry-run} --- Same as for @command-ref{install}.}
@item{@DFlag{no-setup} --- Same as for @command-ref{install}.}
@item{@DFlag{jobs} @nonterm{n} or @Flag{j} @nonterm{n} --- Same as for @command-ref{install}.}
@item{@DFlag{batch} --- Same as for @command-ref{install}.}
@item{@DFlag{no-trash} --- Same as for @command-ref{install}.}
]
@history[#:changed "6.1.1.5" @elem{Added the @DFlag{batch} flag.}
#:changed "6.1.1.6" @elem{Added the @DFlag{no-trash} flag.}
#:changed "6.4.0.14" @elem{Added the @DFlag{dry-run} flag.}]}
@subcommand{@command/toc{new} @nonterm{pkg} ---
Populates a directory with the stubs for a new package, where
@nonterm{pkg} is the name of the new package.
If @nonterm{pkg} already exists as a directory in the current directory, no new
package is created.
@history[#:added "6.1.1.5"]}
@subcommand{@command/toc{show} @nonterm{option} ... @nonterm{pkg} ... --- Prints information about currently installed packages.
If @nonterm{pkg}s are specified, then only those packages are shown.
By default, packages are shown for all @tech{package scopes}, but only for packages
not marked as @seclink["concept:auto"]{auto-installed}. If a package is
explicitly specified, it is shown even if it is marked as
auto-installed. Unless @Flag{l} or @DFlag{long} is specified,
the output is roughly constrained to 80 columns or the number of columns specified by the @envvar{COLUMNS}
environment variable. Unless @DFlag{full-checksum} is specified,
checksums are abbreviated to 8 characters.
The @exec{show} sub-command accepts
the following @nonterm{option}s:
@itemlist[
@item{@Flag{a} or @DFlag{all} --- Includes @seclink["concept:auto"]{auto-installed} packages in the listing.}
@item{@Flag{l} or @DFlag{long} --- Shows complete columns, instead of abbreviating to a width,
and use a more regular (but less
human-readable) format for some columns.}
@item{@DFlag{rx} --- Treats the @nonterm{pkg}s as regular expressions
for displaying specific packages.}
@item{@DFlag{full-checksum} --- Prints the full instead of the
abbreviated checksum.}
@item{@Flag{d} or @DFlag{dir} --- Adds a column in the output to show the directory where the package is installed.}
@item{@DFlag{scope} @nonterm{scope} --- Shows only packages in @nonterm{scope}, which is one of
@itemlist[
@item{@exec{installation} --- Show only installation-wide packages.}
@item{@exec{user} --- Show only user-specific packages for the current installation's name/version
or the name/version specified with @DFlag{version} or @Flag{v}.}
]
The default is to show packages for all @tech{package scopes}.}
@item{@Flag{i} or @DFlag{installation} --- Shorthand for @exec{--scope installation}.}
@item{@Flag{u} or @DFlag{user} --- Shorthand for @exec{--scope user}.}
@item{@DFlag{scope-dir} @nonterm{dir} --- Shows only packages installed in @nonterm{dir}.}
@item{@DFlag{version} @nonterm{vers} or @Flag{v} @nonterm{vers} --- Show only user-specific packages for
the installation name/version @nonterm{vers}.}
]
@history[#:changed "6.1.1.5" @elem{Added @Flag{l}/@DFlag{long} and
@envvar{COLUMNS} support.}
#:changed "6.1.1.6" @elem{Added explicit @nonterm{pkg}s and
@DFlag{rx} and @DFlag{full-sha}.}]}
@subcommand{@command/toc{migrate} @nonterm{option} ... @nonterm{from-version}
--- Installs packages that were previously installed in @exec{user}
@tech{package scope} for @nonterm{from-version}, where
@nonterm{from-version} is an installation name/version.
The @exec{migrate} sub-command accepts
the following @nonterm{option}s:
@itemlist[
@item{@DFlag{deps} @nonterm{behavior} --- Same as for @command-ref{install}, except that @exec{search-auto} is
the default.}
@item{@DFlag{binary} --- Same as for @command-ref{install}.}
@item{@DFlag{source} --- Same as for @command-ref{install}.}
@item{@DFlag{scope} @nonterm{scope} --- Same as for @command-ref{install}.}
@item{@Flag{i} or @DFlag{installation} --- Shorthand for @exec{--scope installation}.}
@item{@Flag{u} or @DFlag{user} --- Shorthand for @exec{--scope user}.}
@item{@DFlag{scope-dir} @nonterm{dir} --- Select @nonterm{dir} as the @tech{package scope}.}
@item{@DFlag{catalog} @nonterm{catalog} --- Same as for @command-ref{install}.}
@item{@DFlag{all-platforms} --- Same as for @command-ref{install}.}
@item{@DFlag{force} --- Same as for @command-ref{install}.}
@item{@DFlag{ignore-checksums} --- Same as for @command-ref{install}.}
@item{@DFlag{strict-doc-conflicts} --- Same as for @command-ref{install}.}
@item{@DFlag{no-cache} --- Same as for @command-ref{install}.}
@item{@DFlag{dry-run} --- Same as for @command-ref{install}.}
@item{@DFlag{no-setup} --- Same as for @command-ref{install}.}
@item{@DFlag{jobs} @nonterm{n} or @Flag{j} @nonterm{n} --- Same as for @command-ref{install}.}
]
@history[#:changed "6.4.0.14" @elem{Added the @DFlag{dry-run} flag.}]}
@subcommand{@command/toc{create} @nonterm{option} ... @nonterm{directory-or-package}
--- Bundles a package into an archive. Bundling
is not needed for a package that is provided directly from a
Git repository or other non-archive formats. The @exec{create}
sub-command can create an archive from a directory (the default) or
from an installed package. It can also adjust the archive's content
to include only sources, only compiled bytecode and rendered documentation,
or both---but packages are
normally provided as source and converted to binary form by an
automatic service, instead of by a package author.
The @exec{create} sub-command accepts
the following @nonterm{option}s:
@itemlist[
@item{@DFlag{from-dir} --- Treats @nonterm{directory-or-package} as a directory path; this is the default mode.}
@item{@DFlag{from-install} --- Treats @nonterm{directory-or-package} as the name of an installed package
(instead of a directory).}
@item{@DFlag{format} @nonterm{format} --- Specifies the archive format.
The allowed @nonterm{format}s are: @exec{zip} (the default), @exec{tgz}, and @exec{plt}.
This option must be specified if @DFlag{manifest} is not present.}
@item{@DFlag{manifest} --- Creates a manifest file for a directory, rather than an archive.}
@item{@DFlag{as-is} --- Bundles all content of the package directory as is, with no filtering
of sources, compiled files, or repository elements.}
@item{@DFlag{source} --- Bundles only sources in the package directory; see @secref["strip"].}
@item{@DFlag{binary} --- Bundles compiled bytecode and rendered
documentation in the package directory; see @secref["strip"].}
@item{@DFlag{built} --- Bundles compiled sources, bytecode, and rendered
documentation in the package directory, filtering repository elements; see @secref["strip"].}
@item{@DFlag{dest} @nonterm{dest-dir} --- Writes generated bundles to @nonterm{dest-dir}.}
]
}
@subcommand{@command/toc{config} @nonterm{option} ... @optional[@nonterm{key}] @nonterm{val} ... ---
Views and modifies the configuration of the package manager. If @nonterm{key} is not provided,
the values for all recognized keys are shown. The @nonterm{val} arguments are allowed
only when @DFlag{set} is used, in which case the @nonterm{val}s are used as the new values
for @nonterm{key}.
The @exec{config} sub-command accepts
with the following @nonterm{option}s:
@itemlist[
@item{@DFlag{set} --- Sets an option, rather than printing it.}
@item{@DFlag{scope} @nonterm{scope} --- Selects a @tech{package scope}, the same as for @command-ref{install}.
A configuration value set at @exec{installation} scope serves
as the default value at @exec{user} scope.}
@item{@Flag{i} or @DFlag{installation} --- Shorthand for @exec{--scope installation}.}
@item{@Flag{u} or @DFlag{user} --- Shorthand for @exec{--scope user}.}
@item{@DFlag{scope-dir} @nonterm{dir} --- Same as for @command-ref{install}.}
]
The valid @nonterm{key}s and corresponding @nonterm{val}s are:
@itemlist[
@item{@exec{name} --- A string for the installation's name, which is used by @exec{user}
@tech{package scope} and defaults to the Racket version.}
@item{@exec{catalogs} --- A list of URLs for @tech{package catalogs}. An empty-string
@nonterm{val} is replaced by the sequence of catalogs for the default configuration.
A @nonterm{val} that does not start with alphabetic characters followed by @litchar{://}
is treated as a path relative to the configuration directory (as
reported by @racket[find-config-dir]).}
@item{@exec{default-scope} --- Either @exec{installation} or @exec{user}.
The value of this key at @exec{user} scope (possibly defaulting from
@exec{installation} scope) is
the default @tech{package scope} for @exec{raco pkg} commands for which
a scope is not inferred from a given set of package names
(even for @command{config}, which is consistent but potentially confusing).}
@item{@exec{download-cache-dir} --- A directory that holds copies of
downloaded packages, used to avoid re-downloading if the
same URL and checksum combination is requested again. The default cache directory is
user-specific (but not specific to a Racket version or
installation name).}
@item{@exec{download-cache-max-files} --- A limit on the number of files to
be kept in the download cache directory.}
@item{@exec{download-cache-max-bytes} --- A limit on the total size of files
that are kept in the download cache directory.}
@item{@exec{doc-open-url} --- A URL to use in place of a local
filesystem path for viewing (or at least searching)
documentation; an empty string, which is the default, disables
the URL so that the local filesystem is used. This key can be
set only in @exec{installation} scope.}
@item{@exec{git-checkout-credentials} --- A list that starts with a format
specification (currently only @racket['basic] is supported), followed
by git credentials in the form @nonterm{username}@litchar{:}@nonterm{password}
that are tried when downloading packages with git sources using the
HTTP or HTTPS protocols. The credentials are currently stored
@bold{unencrypted} on the filesystem.}
@item{@exec{trash-max-packages} --- A limit on the number of package implementations
that are kept in a trash folder when the package is removed or updated.}
@item{@exec{trash-max-seconds} --- A limit on the time since a package is removed or
updated that its implementation is kept in the trash folder. Package implementations are
removed from a trash folder only when another package is potentially added
to the trash folder or @command-ref{empty-trash} is used.}
@item{@exec{network-retries} --- The number of times to retry a network communication that
fails due to a connection error.}
]
@history[#:changed "6.1.1.6" @elem{Added @exec{trash-max-packages} and @exec{trash-max-seconds}.}
#:changed "6.3" @elem{Added @exec{network-retries}.}
#:changed "6.6.0.5" @elem{Added @exec{git-checkout-credentials}.}]}
@subcommand{@command/toc{catalog-show} @nonterm{option} ... @nonterm{package-name} ...
--- Consults @tech{package catalogs} for a package (that is not necessarily installed)
and displays the catalog's information for the package, such as its source URL and
a checksum.
The @exec{catalog-show} sub-command accepts
the following @nonterm{option}s:
@itemlist[
@item{@DFlag{all} --- Shows information for all available packages. When using this flag,
supply no @nonterm{packaee-name}s.}
@item{@DFlag{only-names} --- Shows only package names. This option is mainly useful with
@DFlag{all}, but when a @nonterm{packaee-name} is provided,
catalogs are consulted to ensure that he package is available.}
@item{@DFlag{modules} --- Shows the modules that are implemented by a package.}
@item{@DFlag{catalog} @nonterm{catalog} --- Queries @nonterm{catalog} instead of the currently configured
@tech{package catalogs}.}
@item{@DFlag{version} @nonterm{version} or @Flag{v} @nonterm{version} --- Queries catalogs
for a result specific to @nonterm{version},
instead of the installation's Racket version.}
]
}
@subcommand{@command/toc{catalog-copy} @nonterm{option} ... @nonterm{src-catalog} ... @nonterm{dest-catalog}
--- Copies information from the @tech{package catalog} named by @nonterm{src-catalog}s
to a local database or directory @nonterm{dest-catalog},
which can be used as a new @tech{package catalog}.
The @nonterm{src-catalog}s can be remote or local, while @nonterm{dest-catalog} must be local
(i.e., a directory path or a SQLite database path, as inferred from the path).
If a @nonterm{src-catalog} or @nonterm{dest-catalog} does not start with a URL scheme, it is
treated as a filesystem path. Information from multiple @nonterm{src-catalog}s is merged,
with information from earlier @nonterm{src-catalog}s taking precedence over later
@nonterm{src-catalog}s.
The @exec{catalog-copy} sub-command accepts
the following @nonterm{option}s:
@itemlist[
@item{@DFlag{from-config} --- Adds the currently configured
@tech{package catalogs} to the end of the @nonterm{src-catalog}s list.}
@item{@DFlag{force} --- Replaces @nonterm{dest-catalog} if it exists already.}
@item{@DFlag{merge} --- Adds to @nonterm{dest-catalog} if it exists already. By default,
information already in @nonterm{dest-catalog} takes precedence
over new information.}
@item{@DFlag{override} --- Changes merging so that new information takes precedence
over information already in @nonterm{dest-catalog}.}
@item{@DFlag{relative} --- Writes package sources to @nonterm{dest-catalog} in relative-path form,
when possible.}
@item{@DFlag{version} @nonterm{version} or @Flag{v} @nonterm{version} --- Copies catalog
results specific to @nonterm{version}
(for catalogs that make a distinction), instead of the installation's Racket version.}
]
}
@subcommand{@command/toc{catalog-archive} @nonterm{option} ... @nonterm{dest-dir} @nonterm{src-catalog} ...
--- Copies information from the @tech{package catalog} named by @nonterm{src-catalog}s
to a @filepath{catalog} directory catalog in @nonterm{dest-dir}, and also copies
all package sources to a @filepath{pkgs} directory in @nonterm{dest-dir}.
Packages sources are downloaded and repacked as needed, so that
all packages are written to the @filepath{pkgs} directory as
@filepath{.zip} archives. This conversion may change the checksum
on each archived package.
The @exec{catalog-archive} sub-command accepts
the following @nonterm{option}s:
@itemlist[
@item{@DFlag{from-config} --- Adds the currently configured
@tech{package catalogs} to the end of the @nonterm{src-catalog}s list.}
@item{@DFlag{state} @nonterm{state-database} --- To enable incremental
updating, reads and writes the database @nonterm{state-database}, which must have the suffix
@filepath{.sqlite}, as the current state of @nonterm{dest-dir}.}
@item{@DFlag{relative} --- Writes package sources to @nonterm{dest-catalog} in relative-path form.}
@item{@DFlag{version} @nonterm{version} or @Flag{v} @nonterm{version} --- Copies catalog
results specific to @nonterm{version}
(for catalogs that make a distinction), instead of the installation's Racket version.}
@item{@DFlag{pkg-fail} @nonterm{mode} --- Determines handling of failure for an individual
package, such as when a @nonterm{src-catalog} contains a bad package source. The
following @nonterm{mode}s are available:
@itemlist[
@item{@exec{fail} (the default) --- archiving stops and fails;}
@item{@exec{skip} --- the package is skipped and omitted from the archive catalog; or}
@item{@exec{continue} --- like @exec{skip}, but @exec{raco pkg catalog-archive}
exits with a status code of @exec{5} if any package was skipped.}
]}
]
@history[#:added "6.0.17"]
}
@subcommand{@command/toc{archive} @nonterm{option} ... @nonterm{dest-dir} @nonterm{pkg} ...
--- Copies information from installed packages named by @nonterm{pkgs}s
to a @filepath{catalog} directory catalog in @nonterm{dest-dir}, and also copies
all package sources to a @filepath{pkgs} directory in @nonterm{dest-dir}.
Packages sources are copied and repacked as needed, so that
all packages are written to the @filepath{pkgs} directory as
@filepath{.zip} archives. This conversion may change the checksum
on each archived package.
The @exec{archive} sub-command accepts
the following @nonterm{option}s:
@itemlist[
@item{@DFlag{include-deps} --- Includes the dependencies of the specified packages
in the resulting catalog.}
@item{@DFlag{exclude} @nonterm{pkg} --- Omits the specified @nonterm{pkg} from the
resulting catalog. This also causes the dependencies of @nonterm{pkg} to be
omitted if @DFlag{include-deps} is specified. This flag can be provided multiple times.}
@item{@DFlag{relative} --- Writes package sources to @nonterm{dest-catalog} in relative-path form.}
]
@history[#:added "6.1.0.8"]
}
@subcommand{@command/toc{empty-trash} @nonterm{option} ...
--- Removes or lists package implementations that were previously removed or updated and
are currently in the trash directory
for the specified @tech{package scope}. The @exec{trash-max-packages} and
@exec{trash-max-seconds} configuration keys (see @command-ref{config}) control
how many packages are kept in the trash directory and for how long.
The @exec{empty-trash} sub-command accepts
the following @nonterm{option}s:
@itemlist[
@item{@DFlag{scope} @nonterm{scope} --- Selects a @tech{package scope}, the same as for @command-ref{install}.}
@item{@Flag{i} or @DFlag{installation} --- Shorthand for @exec{--scope installation}.}
@item{@Flag{u} or @DFlag{user} --- Shorthand for @exec{--scope user}.}
@item{@DFlag{scope-dir} @nonterm{dir} --- Same as for @command-ref{install}.}
@item{@DFlag{list} or @Flag{l} --- Shows the trash directory path and its content, instead of
removing the current content.}
]
@history[#:added "6.1.1.6"]
}
@; ----------------------------------------
@section[#:tag "metadata"]{Package Metadata}
Package metadata, including dependencies on other packages, is reported
by an @filepath{info.rkt} module within the package. This module must be
implemented in the @racketmodname[info] language.
For example, a basic @filepath{info.rkt} file might be
@codeblock{
#lang info
(define version "1.0")
(define deps (list _package-source-string ...))
}
The following @filepath{info.rkt} fields are used by the package manager:
@margin-note{
When a package is a @tech{single collection package}, its @filepath{info.rkt}
file may specify additional fields that are used for the Scribble documentation
system or other tools. Many of these fields are described
in @secref["setup-info" #:doc raco-doc].
}
@(define (definfofield s) @as-index{@racketidfont{@s}})
@itemlist[
@item{@definfofield{collection} --- either @racket['multi] to
implement a @tech{multi-collection package} or a string or
@racket['use-pkg-name] to implement a @tech{single-collection
package}. If @racketidfont{collection} is defined as a string,
then the string is used as the name of the collection
implemented by the package. If @racketidfont{collection} is
defined as @racket['use-pkg-name], then the package name is used
as the package's collection name.
Beware that omitting @racketidfont{collection} or defining it
as @racket['use-pkg-name] means that a package's content
effectively changes with the package's name. A package's
content should normally be independent of the package's name,
and so defining @racketidfont{collection} to a string is
preferable for a @tech{single-collection package}.}
@item{@definfofield{version} --- a @tech{version} string. The default
@tech{version} of a package is @racket["0.0"].}
@item{@definfofield{deps} --- a list of dependencies, where each
dependency has one of the following forms:
@itemlist[
@item{A string for a @tech{package source}.}
@item{A list of the form
@racketblock[(list _package-source-string
_keyword-and-spec ...)]
where each @racket[_keyword-and-spec] has a
distinct keyword in the form
@racketgrammar*[#:literals (quote)
[keyword-and-spec
(code:line '#:version version-string)
(code:line '#:platform platform-spec)]
[platform-spec string symbol regexp]]
A @racket[_version-string] specifies a lower bound
on an acceptable @tech{version} of the needed package.
A @racket[_platform-spec] indicates that the dependency
applies only for platforms with a matching result from
@racket[(system-type)] when @racket[_platforms-spec] is
a symbol or @racket[(path->string
(system-library-subpath #f))] when
@racket[_platform-spec] is a string or regular expression.
See also @racket[matching-platform?]. For
example, platform-specific binaries can be placed into
their own packages, with one separate package and one
dependency for each supported platform.}
@item{A list of the form
@racketblock[(list _package-source-string _version-string)]
which is deprecated and equivalent to
@racketblock[(list _package-source-string '#:version _version-string)]}
]
Each element of the @racketidfont{deps} list determines a
dependency on the @tech{package} whose name is inferred from
the @tech{package source} (i.e., dependencies are on package
names, not package sources), while the @tech{package source}
indicates where to get the package if needed to satisfy the
dependency.
Using the package name @racket["racket"] specifies a dependency
on the Racket run-time system, which is potentially useful when
a version is included in the dependency. For most purposes,
it's better to specify a versioned dependency on
@racket["base"], instead.
See also @secref["setup-check-deps" #:doc raco-doc].}
@item{@definfofield{build-deps} --- like @racketidfont{deps}, but for
dependencies that can be dropped in a @tech{binary package},
which does not include sources; see @secref["strip"] and
@secref["setup-check-deps" #:doc raco-doc]. The
@racketidfont{build-deps} and @racketidfont{deps} lists are
appended, while @command-ref["create"] strips away
@racketidfont{build-deps} when converting a package for
@DFlag{binary} mode.}
@item{@definfofield{implies} --- a list of strings and
@racket['core]. Each string refers to a package listed in
@racketidfont{deps} and indicates that a dependency on the
current package counts as a dependency on the named package;
for example, the @pkgname{gui} package is defined to ensure
access to all of the libraries provided by @pkgname{gui-lib},
so the @filepath{info.rkt} file of @pkgname{gui} lists
@racket["gui-lib"] in @racketidfont{implies}. Packages listed
in @racketidfont{implies} list are treated specially by
updating: implied packages are automatically updated whenever
the implying package is updated. The special value
@racket['core] is intended for use by an appropriate
@pkgname{base} package to declare it as the representative of
core Racket libraries.}
@item{@definfofield{update-implies} --- a list of strings. Each
string refers to a package listed in @racketidfont{deps}
or @racketidfont{build-deps}
and indicates that the implied packages are automatically updated
whenever the implying package is updated.}
@item{@definfofield{setup-collects} --- a list of path strings and/or
lists of path strings, which are used as collection names to
set up via @exec{raco setup} after the package is installed, or
@racket['all] to indicate that all collections need to be
setup. By default, only collections included in the package are
set up (plus collections for global documentation indexes and
links).}
@item{@definfofield{distribution-preference} --- either
@racket['source], @racket['built], or @racket['binary],
indicating the most suitable distribution mode for the package
(but not a guarantee that it will be distributed as
such). Absence of this definition implies @racket['binary] if
the package has no @filepath{.rkt} or @filepath{.scrbl} files
other than @filepath{info.rkt} files, and if it has any
@filepath{.so}, @filepath{.dll}, @filepath{.dylib}, or
@filepath{.framework} files; otherwise, absence implies
@racket['built].}
@item{@definfofield{package-content-state} --- a list of two items;
the first item is @racket['binary], @racket['binary-lib], or
@racket['built], and the second item is either @racket[#f] or a
string to represent a Racket version for compiled content. This
information is used by @exec{raco pkg install} or @exec{raco
pkg update} with @DFlag{source}, @DFlag{binary}, or
@DFlag{binary-lib} to ensure that the package content is
consistent with the requested conversion; see also
@secref["strip"]. Absence of this definition is treated the
same as @racket[(list 'source #f)].}
]
@history[#:changed "6.1.0.5" @elem{Added @racketidfont{update-implies}.}
#:changed "6.1.1.6" @elem{Added @racketidfont{distribution-preference}.}]
@; ----------------------------------------
@include-section["strip.scrbl"]
@; ----------------------------------------
@include-section["git-workflow.scrbl"]
@; ----------------------------------------
@include-section["apis.scrbl"]
@include-section["catalog-protocol.scrbl"]
@; ----------------------------------------
@section{@|Planet1| Compatibility}
PLT maintains a @tech{package catalog} to serve packages that
were developed using the original @seclink[#:doc '(lib
"planet/planet.scrbl") "top"]{@|Planet1|} package system. This
compatibility catalog is at
@link["http://planet-compats.racket-lang.org/"]{http://planet-compats.racket-lang.org/},
which is included by default in the package-server search path.
Copies of @|Planet1| packages are automatically created by the
server according to the following system: for all packages that are in
the @litchar{4.x} @|Planet1| repository, the latest minor version of
@tt{@nonterm{user}/@nonterm{package}.plt/@nonterm{major-version}} will be available as
@pkgname{planet-@nonterm{user}-@nonterm{package}@nonterm{major-version}}. For example,
@tt{jaymccarthy/opencl.plt/1} minor version @tt{2}, will be available as
@pkgname{planet-jaymccarthy-opencl1}.
The contents of these copies is a single collection with the name
@filepath{@nonterm{user}/@nonterm{package}@nonterm{major-version}} with all the files from the
original @|Planet1| package in it.
Each file has been transliterated to use direct Racket-style requires
rather than @|Planet1|-style requires. For example, if any file contains
@racket[(planet jaymccarthy/opencl/module)], then it is transliterated
to @racket[jaymccarthy/opencl1/module]. @emph{This transliteration is
purely syntactic and is trivial to confuse, but works for most
packages, in practice.} Any transliterations that occurred are automatically added as
dependencies for the compatibility package.
We do not intend to improve this compatibility system much more over
time, because it is simply a stop-gap as developers port their @|Planet1|
packages to the new system. Additionally, the existence of the compatibility
server is not meant
to imply that we will be removing @|Planet1| from existence in the near
future.
@; ----------------------------------------
@section[#:style 'quiet]{FAQ}
This section answers anticipated frequently asked questions about
the package manager.
@subsection{Are package installations versioned with respect to the
Racket version?}
Most Racket installations are configured to that installing a package
installs it for a specific user and a specific version of Racket. That
is, the @tech{package scope} is user- and version-specific. More
precisely, it is user-specific and installation-name-specific, where
an installation name is typically a Racket version.
You can change the default @tech{package scope} (for a particular
Racket installation) with @command-ref{config}@exec{ -i --set
default-scope installation}, in which case package operations apply
for all users of a Racket installation. You can also use the @Flag{i}
or @DFlag{installation} flag with a specific @exec{raco pkg} command,
instead of changing the default scope for all uses of @exec{raco
pkg}. Note that an installation-wide package is not exactly
version-specific, because the version of an installation can change if
it corresponds to a source-code checkout that is periodically updated
and rebuilt.
If you change the default @tech{package scope}, you can use the
@Flag{u} or @DFlag{user} flag with a specific @exec{raco pkg} command
to perform the command with user-specific @tech{package scope}.
@subsection{Where and how are packages installed?}
User-specific and Racket-version-specific packages are in
@racket[(find-user-pkgs-dir)], and installation-wide packages
are in @racket[(find-pkgs-dir)]. They are linked as
collections (for single-collection packages) or collection roots (for
multi-collection packages) with @exec{raco link}.
@subsection{How are user-specific and installation-wide @tech{package scopes}
related for conflict checking?}
User-specific packages are checked against installation-wide packages
for package-name conflicts and provided-module
conflicts. Installation-wide packages are checked against
user-specific packages only for provided-module conflicts.
Beware that a conflict-free, installation-wide change by one user can
create conflicts for a different user.
@subsection{Do I need to change a package's version when I update a package with error fixes, @|etc|?}
If you have new code for a package, then it should have a new
@tech{checksum}. When package updates are searched for, the checksum
of the installed package is compared with the checksum of the source,
if they are different, then the source is re-installed. This allows
code changes to be distributed. You do not need to declare an update a
version number, except to allow other package implementors to indicate
a dependency on particular features (where a bug fix might be
considered a feature, but it is not usually necessary to consider it
that way).
@subsection{How can I specify which version of a package I depend on
if its interface has changed and I need an @emph{old} version?}
In such a situation, the author of the package has released a
backwards incompatible edition of a package. The package manager provides
no help to deal with this situation (other than, of course, not
installing the ``update''). Therefore, package authors should not make
backwards incompatible changes to packages. Instead, they should
release a new package with a new name. For example, package
@pkgname{libgtk} might become @pkgname{libgtk2}. These packages
should be designed to not conflict with each other, as well.
@subsection{How can I fix my installation to a specific set of package
implementations or @tech{checksums}?}
Packages are updated only when you run a tool such as
@command-ref{update}, so packages are never updated
implicitly. Furthermore, you can snapshot a set of package archives
and install from those archives, instead of relying on package name
resolution through a @tech{package catalog}.
If you want to control the resolution of package names (including
specific @tech{checksum}s) but not necessary keep a copy of all package
code (assuming that old @tech{checksum}s remain available, such as
through GitHub), you can create a snapshot of the @tech{package name}
to @tech{package source} mapping by using @command-ref{catalog-copy}.
For example,
@commandline{raco pkg catalog-copy --from-config /home/joe/snapshot.sqlite}
creates a snapshot @filepath{/home/joe/snapshot.sqlite} of the current
package name resolution, and then
@commandline{raco pkg config --set catalogs file:///home/joe/snapshot.sqlite}
directs all package-name resolution to the snapshot. You can configure
resolution for specific package names by editing the snapshot.
You can go even further with
@commandline{raco pkg catalog-archive --from-config /home/joe/snapshot/}
which not only takes a snapshot of the catalog, but also takes a
snapshot of all package sources (so that you do not depend on the
original sources).
@subsection{How can I install a package without its documentation?}
If package is available in the form of a @tech{built package}, then
you can use @exec{raco pkg install --binary-lib} to strip source,
tests, and documentation from a package before installing it.
The main package catalog at @url{https://pkgs.racket-lang.org/} refers
to @tech{source packages}, not @tech{built packages}. Other catalogs
provide @tech{built packages}:
@itemlist[
@item{For packages associated with a Racket distribution (such as the
current release), the site that hosts the distribution will
normally also host @tech{built packages}---but only for packages
that are already included in the distribution.}
@item{Built variants of the @url{https://pkgs.racket-lang.org/}
packages are currently provided by the catalog
@url{https://pkg-build.racket-lang.org/server/built/catalog/}
(for the current release only). See
@hyperlink["https://pkg-build.racket-lang.org/about.html"]{the
package-build service} for more information.}
]
Some packages have been split at the source level into separate
library, test, and documentation packages. For example,
@pkgname{net-lib} provides modules such as @racketmodname[net/cookie]
without documentation, while @pkgname{net-doc} provides documentation
and @pkgname{net-test} provides tests. The @pkgname{net} package
depends on @pkgname{net-lib} and @pkgname{net-doc}, and it implies
@pkgname{net-lib}, so you can install @pkgname{net} in a minimal
Racket distribution to get the libraries with documentation (and lots
of additional packages to support documentation), or install
@pkgname{net-lib} to get just the libraries.
If you develop a package that is especially widely used or is
especially useful in a constrained installation environment, then
splitting your package into @pkgname{-lib}, @pkgname{-doc}, and
@pkgname{-test} components may be worthwhile. Most likely, you should
keep the packages together in a single source-code repository and use
metedata such as @racketidfont{implies} and
@racketidfont{update-implies} (see @secref["metadata"]) so that the
packages are updated in sync.
@subsection{Why is the package manager so different than @|Planet1|?}
There are two fundamental differences between @|Planet1| and this package manager.
The first is that @|Planet1| uses ``internal linking'' whereas the current package manager
uses ``external linking.'' For example, an individual module requires a
@|Planet1| package directly in a require statement:
@racketblock[
(require (planet game/tic-tac-toe/data/matrix))
]
whereas using the package manager, the module would simply require the module of
interest:
@racketblock[
(require data/matrix)
]
and would rely on the external system having the
@pkgname{tic-tac-toe} package installed.
This change is good because it makes the origin of modules more
flexible---so that code can migrate in and out of the core, packages
can easily be split up, combined, or taken over by other authors, etc.
This change is bad because it makes the meaning of your program
dependent on the state of the system.
The second major difference is that @|Planet1| is committed to
guaranteeing that packages that never conflict with one another, so
that any number of major and minor versions of the same package can be
installed and used simultaneously. The package manager does not share this
commitment, so package authors and users must be mindful of potential
conflicts and plan around them.
This change is good because it is simpler and lowers the burden of
maintenance (provided most packages don't conflict.)
The change is bad because users must plan around potential conflicts.
In general, the goal of the package manager is to be a lower-level
system, more like the package systems used by operating systems. The
goals of @|Planet1| are not bad, but we believe they are needed
infrequently and a system like @|Planet1| could be more easily built
atop the package manager than the reverse.
In particular, our plans to mitigate the downsides of these changes
are documented in @secref["short-term"].
@; ----------------------------------------
@section{Future Plans}
@subsection[#:tag "short-term"]{Short Term}
This section lists some short term plans for the package manager. These are
important, but didn't block its release. The package manager will be considered
out of beta when these are completed.
@itemlist[
@item{The official catalog server will divide packages into three
categories: @reponame{ring-0}, @reponame{ring-1}, and @reponame{ring-2}. The definitions
for these categories are:
@itemlist[
@item{@reponame{ring-2} --- No restrictions.}
@item{@reponame{ring-1} --- Must not conflict any package
in @reponame{ring-1} or @reponame{ring-0}.}
@item{@reponame{ring-0} --- Must not conflict any package in @reponame{ring-1}
or @reponame{ring-0}. Must have documentation and tests. The author must be
responsive about fixing regressions against changes in Racket, etc.}
]
These categories will be curated by PLT.
Our goal is for all packages to be in @reponame{ring-1}, with
@reponame{ring-2} as a temporary place while the curators work with the
authors of conflicting packages to determine how modules should be
renamed for unity.
However, before curation is complete, each package will be
automatically placed in @reponame{ring-2} or @reponame{ring-1}
depending on its conflicts, with preference being given to older
packages. (For example, if a new package B conflicts with an old
package A, then A will be in @reponame{ring-1}, but B will be in
@reponame{ring-2}.) During curation, however, it is not necessarily
the case that older packages have preference. (For example,
@pkgname{tic-tac-toe} should probably not provide
@filepath{data/matrix.rkt}, but that could be spun off into another
package used by both @pkgname{tic-tac-toe} and
@pkgname{factory-optimize}.)
In contrast, the @reponame{ring-0} category will be a special category that
authors may apply for. Admission requires a code audit and implies
a "stamp of approval" from PLT. In the future, packages in this
category will have more benefits, such as automatic regression testing
on DrDr, testing during releases, provided binaries, and advertisement
during installation.
The @|Planet1| compatibility packages will also be included in
the @reponame{ring-1} category, automatically.
}
@item{In order to mitigate the costs of external linking vis a vis the
inability to understand code in isolation, we will create exception
printers that search for providers of modules on the configured
@tech{package catalogs}. For example, if a module requires
@filepath{data/matrix.rkt}, and it is not available, then the catalog will
be consulted to discover what packages provide it. @emph{Only packages
in @reponame{ring-1} or @reponame{ring-0} will be
returned.} (This category restriction ensures that the package to
install is unique.)
Users can configure their systems to then automatically install the
package provided is has the appropriate category (i.e., some users may
wish to automatically install @reponame{ring-0} packages but not
@reponame{ring-1} packages, while others may not want to install
any.)
This feature will be generalized across all @tech{package catalogs},
so users could maintain their own category definitions with
different policies.}
]
@subsection{Long Term}
This section lists some long term plans for the package manager. Many of these
require a lot of cross-Racket integration.
@itemlist[
@item{The official catalog server is bare bones. It could conceivably do a lot
more: keep track of more statistics, enable "social" interactions
about packages, licenses, etc. Some of this is easy and obvious, but the
community's needs are unclear.}
@item{It would be nice to encrypt information from the official
@tech{package catalog} with a public key shipped with Racket, and
allow other catalogs to implement a similar security scheme.}
@item{Packages in the @reponame{ring-0} category should be tested on
DrDr. This would require a way to communicate information about how
they should be run to DrDr. This is currently done via the
@filepath{meta/props} script for things in the core. We should
generalize this script to a @filepath{meta/props.d} directory so that
packages can install DrDr metadata to it.}
@item{We hope that this package system will encourage more incremental
improvements to pieces of Racket. In particular, it would be wonderful
to have a very thorough @filepath{data} collection of different
data-structures. However, our existing setup for Scribble would force
each new data structue to have a different top-level documentation
manual, rather than extending the documentation of the existing
@filepath{data} collection. Similar issues will exist for the
@filepath{net} and @filepath{file} collections. We should design a way
to have such "documentation plugins" in Scribble and support
similar "plugin" systems elsewhere in the code-base.}
@item{The user interface could be improved. For example, it would be good if
DrRacket would poll for package updates periodically and if when it was first
started it would display available, popular packages.}
]
@; ----------------------------------------
@include-section["implementation.scrbl"]