#lang scribble/manual @(require "common.rkt" (for-label (except-in racket/base remove) racket/contract/base pkg pkg/lib (only-in pkg/db current-pkg-catalog-file) net/url syntax/modcollapse setup/getinfo setup/matching-platform)) @title[#:tag "lib"]{Package Management Functions} @defmodule[pkg/lib]{The @racketmodname[pkg/lib] library provides building blocks on which the @racket[pkg] library and @exec{raco pkg} commands are built. It re-exports the bindings of @racketmodname[pkg/path].} @deftogether[( @defform[(with-pkg-lock body ...+)] @defform[(with-pkg-lock/read-only body ...+)] )]{ Evaluates the @racket[body]s while holding a lock to prevent concurrent modification to the package database for the current @tech{package scope}. Use the @racket[with-pkg-lock/read-only] form for read-only access. The lock is reentrant but not upgradable from read-only. Use these form to wrap uses of functions from @racketmodname[pkg/lib] that are documented to require the lock. Other functions from @racketmodname[pkg/lib] take the lock as needed.} @deftogether[( @defparam[current-pkg-scope scope (or/c 'installation 'user (and/c path? complete-path?))] @defparam[current-pkg-scope-version s string?] )]{ Parameters that determine @tech{package scope} for management operations and, in the case of @racket['user] scope, the relevant installation name/version.} @deftogether[( @defparam[current-pkg-lookup-version s string?] )]{ Parameter that determines the relevant Racket version for extracting package information from a catalog. @history[#:added "6.0.1.7"]} @defparam[current-pkg-error err procedure?]{ A parameter whose value is used to report errors that are normally intended for end uses. The arguments to the procedure are the same as for @racket[error], except that an initial symbol argument is omitted. The default value uses @racket[error] with @racket['pkg] as the first argument. The @exec{raco pkg} command sets this parameter to use @racket[raise-user-error] with the sub-command name as its first argument.} @defparam[current-pkg-catalogs catalogs (or/c #f (listof url?))]{ A parameter that determines the @tech{package catalogs} that are consulted to resolve a @tech{package name}. If the parameter's value is @racket[#f], then the result of @racket[pkg-config-catalogs] is used.} @defproc[(pkg-config-catalogs) (listof string?)]{ Returns a list of URL strings for the user's configured @tech{package catalogs}.} @deftogether[( @defparam[current-pkg-download-cache-dir dir (or/c #f (and/c path-string? complete-path?))] @defparam[current-pkg-download-cache-max-files max-files (or/c #f real?)] @defparam[current-pkg-download-cache-max-bytes max-bytes (or/c #f real?)] )]{ Parameters that determine the download cache location and limits. If a parameter's value is @racket[#f], then the user's configuration is used.} @deftogether[( @defparam[current-pkg-trash-max-packages max-packages (or/c #f real?)] @defparam[current-pkg-trash-max-seconds max-seconds (or/c #f real?)] )]{ Parameters that determine the trash-directory limits. If a parameter's value is @racket[#f], then the user's configuration is used. @history[#:added "6.1.1.6"]} @deftogether[( @defparam[current-pkg-network-retries max-retries (or/c #f real?)] )]{ A parameter that determines the number of times to retry a network communication that fails due to a connection error. If a parameter's value is @racket[#f], then the user's configuration is used. @history[#:added "6.3"]} @defproc[(pkg-directory [name string?] [#:cache cache (or/c #f (and/c hash? (not/c immutable?))) #f]) (or/c path-string? #f)]{ Returns the directory that holds the installation of the installed (in any scope) package @racket[name], or @racket[#f] if no such package is installed. For multiple calls to @racket[pkg-directory], supply the same @racket[equal?]-based mutable hash table (initially empty) as the @racket[cache] argument. Otherwise, package-installation information must be re-parsed on every call to @racket[pkg-directory]. @history[#:changed "6.1.1.6" @elem{Added the @racket[#:cache] argument.}]} @defproc[(default-pkg-scope) (or/c 'installation 'user (and/c path? complete-path?))]{ Returns the user's configured default @tech{package scope}.} @defproc[(installed-pkg-names [#:scope scope (or/c #f 'installation 'user (and/c path? complete-path?))]) (listof string?)]{ Returns a list of installed package names for the given @tech{package scope}, where @racket[#f] indicates the user's default @tech{package scope}.} @defproc[(installed-pkg-table [#:scope scope (or/c #f 'installation 'user (and/c path? complete-path?))]) (hash/c string? pkg-info?)]{ Returns a hash table of installed packages for the given @tech{package scope}, where @racket[#f] indicates the user's default @tech{package scope}.} @deftogether[( @defproc[(pkg-desc? [v any/c]) boolean?] @defproc[(pkg-desc [source string?] [type (or/c #f 'name 'file 'dir 'link 'static-link 'file-url 'dir-url 'git 'github 'clone)] [name (or/c string? #f)] [checksum (or/c string? #f)] [auto? boolean?] [#:path path (or/c #f path-string?) #f]) pkg-desc?] )]{ A @racket[pkg-desc] value describes a package source plus details of its intended interpretation, where the @racket[auto?] field indicates that the package is should be treated as installed automatically for a dependency. The optional @racket[path] argument is intended for use when @racket[type] is @racket['clone], in which case it specifies a directory containing the repository clone (where the repository itself is a directory within @racket[path]). @history[#:changed "6.1.1.1" @elem{Added @racket['git] as a @racket[type].} #:changed "6.1.1.5" @elem{Added @racket['clone] as a @racket[type].}]} @defproc[(pkg-stage [desc pkg-desc?] [#:checksum checksum (or/c #f string?) #f] [#:in-place? in-place? boolean? #f] [#:namespace namespace namespace? (make-base-namespace)] [#:strip strip (or/c #f 'source 'binary 'binary-lib) #f] [#:force-strip? force-string? boolean? #f] [#:use-cache? use-cache? boolean? #f] [#:quiet? quiet? boolean? #t]) (values string? path? (or/c #f string?) boolean? (listof module-path?))]{ Locates the implementation of the package specified by @racket[desc] and downloads and unpacks it to a temporary directory (as needed). If @racket[desc] refers to an existing directory and @racket[in-place?] is true, then the directory is used in place. The @racket[namespace] argument is passed along to @racket[get-info/full] when the package's @filepath{info.rkt} is loaded. If @racket[strip] is not @racket[#f], then files and directories are removed from the prepared directory the same as when creating the corresponding kind of package. A directory that is staged in-place cannot be stripped. If @racket[force-strip?] is true, then a consistency check (intended to avoid stripping a source package as binary, for example) is skipped. If @racket[use-cache?] is true, then a local cache is consulted before downloading a particular package with a particular checksum. Note that the default for @racket[use-cache?] is @racket[#f], while the default is @racket[#t] for other functions that accept @racket[#:use-cache?]. The result is the package name, the directory containing the unpacked package content, the checksum (if any) for the unpacked package, whether the directory should be removed after the package content is no longer needed, and a list of module paths provided by the package.} @defproc[(pkg-config [set? boolean?] [keys/vals list?] [#:from-command-line? from-command-line? boolean? #f]) void?]{ Implements @racket[pkg-config-command]. If @racket[from-command-line?] is true, error messages may suggest specific command-line flags for @command-ref{config}. The package lock must be held (allowing writes if @racket[set?] is true); see @racket[with-pkg-lock].} @defproc[(pkg-create [format (or/c 'zip 'tgz 'plt 'MANIFEST)] [dir path-string?] [#:source source (or/c 'dir 'name)] [#:mode mode (or/c 'as-is 'source 'binary 'binary-lib 'built)] [#:dest dest-dir (or/c (and/c path-string? complete-path?) #f)] [#:quiet? quiet? boolean? #f] [#:from-command-line? from-command-line? boolean? #f]) void?]{ Implements @racket[pkg-create-command]. Unless @racket[quiet?] is true, information about the output is reported to the current output port. If @racket[from-command-line?] is true, error messages may suggest specific command-line flags for @command-ref{create}.} @defproc[(pkg-install [descs (listof pkg-desc?)] [#:dep-behavior dep-behavior (or/c #f 'fail 'force 'search-ask 'search-auto) #f] [#:update-deps? update-deps? boolean? #f] [#:force? force? boolean? #f] [#:ignore-checksums? ignore-checksums? boolean? #f] [#:strict-doc-conflicts? strict-doc-conflicts? boolean? #f] [#:use-cache? use-cache? boolean? #t] [#:quiet? quiet? boolean? #f] [#:use-trash? use-trash? boolean? #f] [#:from-command-line? from-command-line? boolean? #f] [#:strip strip (or/c #f 'source 'binary 'binary-lib) #f] [#:force-strip? force-string? boolean? #f] [#:multi-clone-mode multi-clone-mode (or/c 'fail 'force 'convert 'ask) 'fail] [#:pull-mode pull-mode (or/c 'ff-only 'try 'rebase) 'ff-only] [#:link-dirs? link-dirs? boolean? #f] [#:dry-run? dry-run? boolean? #f]) (or/c 'skip #f (listof (or/c path-string? (non-empty-listof path-string?))))]{ Implements @racket[pkg-install-command]. The result indicates which collections should be setup via @exec{raco setup}: @racket['skip] means that no setup is needed, @racket[#f] means all, and a list means only the indicated collections. The @racket[link-dirs?] argument determines whether package sources inferred to be directory paths should be treated as links or copied (like other package sources). Note that the default is @racket[#f], unlike the default built into @racket[pkg-install-command]. A @racket[pkg-desc] can have the type @racket['clone] and a source with the syntax of a package name, in which case it refers to a @tech{package name} that must be mapped to a Git repository by the @tech{package catalog}, and in will be installed as a clone. Status information and debugging details are mostly reported to a logger named @racket['pkg], but information that is especially relevant to a user (such as a download action) is reported to the current output port, unless @racket[quiet?] is true. If @racket[from-command-line?] is true, error messages may suggest specific command-line flags for @command-ref{install}. The package lock must be held; see @racket[with-pkg-lock]. @history[#:changed "6.1.1.5" @elem{Added the @racket[#:multi-clone-mode] and @racket[#:infer-clone-from-dir?] arguments.} #:changed "6.1.1.6" @elem{Added the @racket[#:use-trash?] argument.} #:changed "6.1.1.8" @elem{Added the @racket[#:pull-mode] argument.} #:changed "6.4.0.14" @elem{Added the @racket[#:dry-run] argument.}]} @defproc[(pkg-update [sources (listof (or/c string? pkg-desc?))] [#:all? all? boolean? #f] [#:dep-behavior dep-behavior (or/c #f 'fail 'force 'search-ask 'search-auto) #f] [#:update-deps? update-deps? boolean? #f] [#:force? force? boolean? #f] [#:ignore-checksums? ignore-checksums? boolean? #f] [#:strict-doc-conflicts? strict-doc-conflicts? boolean? #f] [#:use-cache? use-cache? boolean? #t] [#:skip-uninstalled? skip-uninstalled? boolean? #t] [#:quiet? quiet? boolean? #f] [#:use-trash? use-trash? boolean? #f] [#:from-command-line? from-command-line? boolean? #f] [#:strip strip (or/c #f 'source 'binary 'binary-lib) #f] [#:force-strip? force-string? boolean? #f] [#:lookup-for-clone? lookup-for-clone? boolean? #f] [#:multi-clone-mode multi-clone-mode (or/c 'fail 'force 'convert 'ask) 'fail] [#:pull-mode pull-mode (or/c 'ff-only 'try 'rebase) 'ff-only] [#:link-dirs? link-dirs? boolean? #f] [#:infer-clone-from-dir? infer-clone-from-dir? boolean? #f] [#:dry-run? dry-run? boolean? #f]) (or/c 'skip #f (listof (or/c path-string? (non-empty-listof path-string?))))]{ Implements @racket[pkg-update-command]. The result is the same as for @racket[pkg-install]. A string in @racket[sources] refers to an installed package that should be checked for updates. A @racket[pkg-desc] in @racket[sources] indicates a package source that should replace the current installation; as an exception, if a @racket[pkg-desc] has the type @racket['clone] and a source with the syntax of a package name, it refers to an existing package installation that should be converted to a Git repository clone---unless @racket[lookup-for-clone?] is true, in which case the package name is resolved through a catalog to locate a Git repository clone. The @racket[link-dirs?] and @racket[infer-clone-from-dir?] arguments affect how directory paths in @racket[sources] are treated. The @racket[link-dirs?] argument is propagated to @racket[package-source->name+type], while @racket[infer-clone-from-dir?] introduces a conversion from a directory source to a repository-clone source when the directory corresponds to an existing repository-clone installation. If @racket[from-command-line?] is true, error messages may suggest specific command-line flags for @command-ref{update}. The package lock must be held; see @racket[with-pkg-lock]. @history[#:changed "6.1.1.5" @elem{Added the @racket[#:multi-clone-mode] and @racket[#:infer-clone-from-dir?] arguments.} #:changed "6.1.1.6" @elem{Added the @racket[#:use-trash?] argument.} #:changed "6.1.1.8" @elem{Added the @racket[#:skip-uninstalled?] and @racket[#:pull-mode] arguments.} #:changed "6.4.0.14" @elem{Added the @racket[#:dry-run] argument.}]} @defproc[(pkg-remove [names (listof string?)] [#:demote? demote? boolean? #f] [#:auto? auto? boolean? #f] [#:force? force? boolean? #f] [#:quiet? quiet? boolean? #f] [#:use-trash? boolean? use-trash? #f] [#:from-command-line? from-command-line? boolean? #f] [#:dry-run? dry-run? boolean? #f]) (or/c 'skip #f (listof (or/c path-string? (non-empty-listof path-string?))))]{ Implements @racket[pkg-remove-command]. The result is the same as for @racket[pkg-install], indicating collects that should be setup via @exec{raco setup}. If @racket[from-command-line?] is true, error messages may suggest specific command-line flags for @command-ref{remove}. The package lock must be held; see @racket[with-pkg-lock]. @history[#:changed "6.1.1.6" @elem{Added the @racket[#:use-trash?] argument.} #:changed "6.4.0.14" @elem{Added the @racket[#:dry-run] argument.}]} @defproc[(pkg-new [name path-string?]) (void?)]{ Implements @racket[pkg-new-command]. The @racket[name] parameter is the name of the new package. } @defproc[(pkg-show [indent string?] [pkgs-or-patterns (or/c #f (listof string?))] [#:prefix-line prefix-line (or/c #f string?) #f] [#:auto? auto? boolean? #f] [#:rx? rx? boolean? #f] [#:long? long? boolean? #f] [#:full-checksum? full-checksum? boolean? #f] [#:directory show-dir? boolean? #f]) void?]{ Implements @racket[pkg-show-command] for a single package scope, printing to the current output port. If @racket[prefix-line]s is not @racket[#f], it is printed before the output. See also @racket[installed-pkg-names] and @racket[installed-pkg-table]. If @racket[pkgs-or-patterns] is @racket[#f], then information is shown for all installed packages, otherwise only matching packages are shown. In @racket[rx?] is true, then elements of @racket[pkgs-or-patterns] are treated as regular expression patterns, otherwise they are treated as package names. The package lock must be held to allow reads; see @racket[with-pkg-lock/read-only]. @history[#:changed "6.1.1.5" @elem{Added the @racket[#:long?] argument.} #:changed "6.1.1.6" @elem{Added the @racket[#:full-checksum?] and @racket[#:rx?] arguments.} #:changed "6.5.0.1" @elem{Added the @racket[#:prefix-line] argument.}]} @defproc[(pkg-migrate [from-version string?] [#:dep-behavior dep-behavior (or/c #f 'fail 'force 'search-ask 'search-auto) #f] [#:force? force? boolean? #f] [#:use-cache? use-cache? boolean? #t] [#:ignore-checksums? ignore-checksums? boolean? #f] [#:strict-doc-conflicts? strict-doc-conflicts? boolean? #f] [#:quiet? quiet? boolean? #f] [#:from-command-line? from-command-line? boolean? #f] [#:strip strip (or/c #f 'source 'binary 'binary-lib) #f] [#:force-strip? force-string? boolean? #f] [#:dry-run? dry-run? boolean? #f]) (or/c 'skip #f (listof (or/c path-string? (non-empty-listof path-string?))))]{ Implements @racket[pkg-migrate-command]. The result is the same as for @racket[pkg-install]. If @racket[from-command-line?] is true, error messages may suggest specific command-line flags for @command-ref{migrate}. The package lock must be held; see @racket[with-pkg-lock]. @history[#:changed "6.4.0.14" @elem{Added the @racket[#:dry-run] argument.}]} @defproc[(pkg-catalog-show [names (listof string?)] [#:all? all? boolean? #f] [#:only-names? only-names? boolean? #f] [#:modules? modules? boolean? #f]) void?]{ Implements @racket[pkg-catalog-show-command]. If @racket[all?] is true, then @racket[names] should be empty. The @racket[current-pkg-lookup-version] parameter determines the version included in the catalog query. @history[#:changed "6.0.1.7" @elem{Use @racket[current-pkg-lookup-version] instead of @racket[current-pkg-scope-version].}]} @defproc[(pkg-catalog-copy [sources (listof path-string?)] [dest path-string?] [#:from-config? from-config? boolean? #f] [#:merge? merge? boolean? #f] [#:force? force? boolean? #f] [#:override? override? boolean? #f] [#:relative-sources? relative-sources? boolean? #f]) void?]{ Implements @racket[pkg-catalog-copy-command]. The @racket[current-pkg-lookup-version] parameter determines the version for extracting existing catalog information. @history[#:changed "6.0.1.7" @elem{Use @racket[current-pkg-lookup-version] instead of @racket[current-pkg-scope-version].}]} @defproc[(pkg-catalog-archive [dest-dir path-string?] [sources (listof path-string?)] [#:from-config? from-config? boolean? #f] [#:state-catalog state-catalog (or/c #f path-string?) #f] [#:relative-sources? relative-sources? boolean? #f] [#:quiet? quiet? boolean? #f] [#:package-exn-handler package-exn-handler (string? exn:fail? . -> . any) (lambda (_pkg-name _exn) (raise _exn))]) void?]{ Implements @racket[pkg-catalog-archive-command]. The @racket[package-exn-handler] argument handles any exception that is raised while trying to archive an individual package; the first argument is the package name, and the second is the exception. The default re-@racket[raise]s the exception, which aborts the archiving process, while a function that logs the exception message and returns would allow archiving to continue for other packages. The @racket[current-pkg-lookup-version] parameter determines the version for extracting existing catalog information. @history[#:added "6.0.1.7" #:changed "6.0.1.13" @elem{Added the @racket[#:package-exn-handler] argument.}]} @defproc[(pkg-archive-pkgs [dest-dir path-string?] [pkgs (listof path-string?)] [#:include-deps? include-deps? boolean? #f] [#:exclude exclude (listof string?) null] [#:relative-sources? relative-sources? boolean? #f] [#:quiet? quiet? boolean? #f] [#:package-exn-handler package-exn-handler (string? exn:fail? . -> . any) (lambda (_pkg-name _exn) (raise _exn))]) void?]{ Implements @racket[pkg-archive-command]. The @racket[package-exn-handler] argument handles any exception that is raised while trying to archive an individual package; the first argument is the package name, and the second is the exception. The default re-@racket[raise]s the exception, which aborts the archiving process, while a function that logs the exception message and returns would allow archiving to continue for other packages. @history[#:added "6.1.0.8"]} @defproc[(pkg-empty-trash [#:list? show-list? boolean? #f] [#:quiet? quiet? boolean? #t]) void?]{ Implements @racket[pkg-empty-trash]. @history[#:added "6.1.1.6"]} @defproc[(pkg-catalog-update-local [#:catalogs catalogs (listof string?) (pkg-config-catalogs)] [#:catalog-file catalog-file path-string? (current-pkg-catalog-file)] [#:quiet? quiet? boolean? #f] [#:set-catalogs? set-catalogs? boolean? #t] [#:consult-packages? consult-packages? boolean? #f]) void?]{ Consults the @tech{package catalogs} specified by @racket[catalogs] (in the same way as @racket[pkg-catalog-copy]) and the user's configured package servers (if @racket[consult-packages?] is true) to populate the database @racket[catalog-file] with information about available packages and the modules that they implement. The local catalog @racket[catalog-file] records the set of source catalogs, including @racket[catalogs], from which its information is drawn. If @racket[set-catalogs?] is true (which is the default), then @racket[catalogs] is recorded as the set of sources, and information from any other catalog is discarded. If @racket[set-catalogs?] is @racket[#f], then @racket[catalogs] must be a subset of the source catalogs already recorded in @racket[catalog-file]. @history[#:changed "6.0.1.6" @elem{Added @racket[#:catalogs] and @racket[#:set-catalogs?] arguments.}]} @defproc[(pkg-catalog-suggestions-for-module [module-path module-path?] [#:catalog-file catalog-file path-string? ....]) (listof string?)]{ Consults @racket[catalog-file] and returns a list of available packages that provide the module specified by @racket[module-path]. The default @racket[catalog-file] is @racket[(current-pkg-catalog-file)] if that file exists, otherwise a file in the racket installation is tried.} @defproc[(get-all-pkg-scopes) (listof (or/c 'installation 'user path?))]{ Obtains a list of all the currently-available package scopes. @history[#:added "6.1.0.5"]} @defproc[(get-all-pkg-names-from-catalogs) (listof string?)]{ Consults @tech{package catalogs} to obtain a list of available @tech{package names}.} @defproc[(get-all-pkg-details-from-catalogs) (hash/c string? (hash/c symbol? any/c))]{ Consults @tech{package catalogs} to obtain a hash table of available @tech{package names} mapped to details about the package. Details for a particular package are provided by a hash table that maps symbols such as @racket['source], @racket['checksum], and @racket['author].} @defproc[(get-pkg-details-from-catalogs [name string?]) (or/c #f (hash/c symbol? any/c))]{ Consults @tech{package catalogs} to obtain information for a single @tech{package name}, returning @racket[#f] if the @tech{package name} has no resolution. Details for the package are provided in the same form as from @racket[get-all-pkg-details-from-catalogs].} @defproc[(pkg-single-collection [dir path-string?] [#:name name string? @elem{... from @racket[dir] ...}] [#:namespace namespace namespace? (make-base-namespapce)]) (or/c #f string?)]{ Returns a string for a collection name if @racket[dir] represents a @tech{single-collection package}, or returns @racket[#f] if @racket[dir] represents a @tech{multi-collection package}. For some single-collection packages, the package's single collection is the package name; if the package name is different from the directory name, supply @racket[name]. Determining a single-collection package's collection name may require loading an @filepath{info.rkt} file, in which case @racket[namespace] is passed on to @racket[get-info/full].} @defproc[(get-pkg-content [desc pkg-desc?] [#:extract-info extract-proc ((or/c #f ((symbol?) ((-> any)) . ->* . any)) . -> . any) (lambda (get-pkg-info) ...)] [#:namespace namespace namespace? (make-base-namespace)] [#:use-cache? use-cache? boolean? #f] [#:quiet? quiet? boolean? #t]) (values (or/c #f string?) (listof module-path?) any/c)]{ Gets information about the content of the package specified by @racket[desc]. The information is determined inspecting the package---resolving a @tech{package name}, downloading, and unpacking into a temporary directory as necessary. The results are as follows: @itemize[ @item{The checksum, if any, for the downloaded package.} @item{A list of module paths that are provided by the package. Each module path is normalized in the sense of @racket[collapse-module-path].} @item{Information extracted from the package's metadata. By default, this information is the package's dependencies, but in general it is the result of @racket[extract-proc], which receives an information-getting function (or @racket[#f]) as returned by @racket[get-info].} ] The @racket[namespace] argument is effectively passed along to @racket[get-info/full] and/or @racket[pkg-stage] for reading package and collection @filepath{info.rkt} files. The @racket[use-cache?] and @racket[quiet?] arguments are effectively passed to @racket[pkg-stage] to control the use of a download cache and status reporting. @history[#:changed "6.1.1.2" @elem{Added the @racket[#:use-cache?] and @racket[#:quiet?] arguments.}]} @defproc[(extract-pkg-dependencies [info (symbol? (-> any/c) . -> . any/c)] [#:build-deps? build-deps? boolean? #t] [#:filter? filter? boolean? #f] [#:versions? versions? boolean? #f]) (listof (or/c string? (cons/c string? list?)))]{ Returns packages dependencies reported by the @racket[info] procedure (normally produced by @racket[get-info]). If @racket[build-deps?] is true, then the result includes both run-time dependencies and build-time dependencies. If @racket[filter?] is true, then platform-specific dependencies are removed from the result list when they do not apply to the current platform, and other information is stripped so that the result list is always a list of either strings (when @racket[versions?] is true) or a two-element list containing a string and a version (when @racket[versions?] is @racket[#f]). @history[#:changed "6.0.1.6" @elem{Added the @racket[#:versions?] argument.}]} @defproc[(pkg-directory->module-paths [dir path-string?] [pkg-name string] [#:namespace namespace namespace? (make-base-namespace)]) (listof module-path?)]{ Returns a list of module paths (normalized in the sense of @racket[collapse-module-path]) that are provided by the package represented by @racket[dir] and named @racket[pkg-name].} @defproc[(pkg-directory->additional-installs [dir path-string?] [pkg-name string] [#:namespace namespace namespace? (make-base-namespace)] [#:system-type sys-type (or/c #f symbol?) (system-type)] [#:system-library-subpath sys-lib-subpath (or/c #f path-for-some-system?) (system-library-subpath #f)]) (listof (cons/c symbol? string?))]{ Returns a list of pairs for items that are installed by the package represented by @racket[dir] and named @racket[pkg-name]. Installed items can include documentation, executables, foreign libraries, other shared files, and man pages---all as specified by @filepath{info.rkt} files. The symbol for each item gives it a category, such as @racket['doc] or @racket['exe], and the string part is a normalized name, such as the destination name for a document or a case-folded executable name without a file suffix. The @racket[sys-type] and @racket[sys-lib-subpath] arguments are used in the same way as for @racket[matching-platform?] to determine platform-specific installations as determined by @racketidfont{install-platform} definitions in @filepath{info.rkt} files. @history[#:added "6.0.1.13"]}