racket/collects/planet/doc.txt

632 lines
24 KiB
Plaintext

_PLaneT_
The PLaneT Module Repository Interaction Collection
The PLaneT system is a method for automatically sharing code packages,
both as libraries and as full applications, that gives every user of a
PLaneT client the illusion of having a local copy of every code
package on the server, but is parsimonious in its transmission. It
consists of a centralized server that holds all packages and
individual clients that hold some portion of the archive
locally. Maintenance of that archive should be transparent, and is the
complete responsibility of the PLaneT client.
The PLaneT client receives user requests (i.e., the (require (planet
...)) forms) and loads the appropriate modules in response. In the
course of handling these requests it may download new code packages
from the PLaneT server.
The structure of user PLaneT invocations is listed below.
PLANET-REQUEST ::= (planet FILE-NAME PKG-SPEC [PATH ...])
FILE-NAME ::= string
PKG-SPEC ::= (FILE-PATH ... PKG-NAME) | (FILE-PATH ... PKG-NAME VER-SPEC)
VER-SPEC ::= Nat | (Nat MINOR)
MINOR ::= Nat ; the specified revision or above
| (Nat Nat) ; a revision between the two specified numbers (inclusive)
| (= Nat) ; exactly the revision specified
| (+ Nat) ; the specified revision or above
| (- Nat) ; the specified revision or below
FILE-PATH ::= string ; the path to the given package in the repository
PKG-NAME ::= string
OWNER-NAME ::= string
PATH ::= string ; the subdirectory path to the specified file within the package
All strings must be legal filename strings.
When encountered, a planet-request is interpreted as requiring the
given file name from the given logical package, specified by the
client's host language (automatically deduced by the client), the
package spec and the collection specification, if given. If no
VER-SPEC is provided, the most recent version is assumed. If no
owner-name/path ... clause is provided, the default package is
assumed.
For example,
(require (planet "test-connection.ss" ("planet" "test-connection.plt" 1 0)))
requires the file "test-connection.ss" from the package owned by
"planet" called "test-connection.plt", and says that any package with
major version 1 and any minor version greater than or equal to 0 will
do.
_config.ss_: client configuration
This file provides several parameters useful for configuring how
PLaneT works.
Parameters:
> (PLANET-DIR) -> directory-string
> (PLANET-DIR directory-string) -> void
The root PLaneT directory. If the environment variable PLTPLANETDIR is
set, default is its value; otherwise the default is the directory in
which config.ss is found.
> (CACHE-DIR) -> directory-string
> (CACHE-DIR directory-string) -> void
The root of the PLaneT client's cache directory.
> (UNINSTALLED-PACKAGE-CACHE) -> directory-string
> (UNINSTALLED-PACKAGE-CACHE directory-string) -> void
The root of the PLaneT client's uninstalled-packages cache. PLaneT
stores package distribution files in this directory, and searches for
them in this directory for them if necessary. Unlike the main PLaneT
cache, which contains compiled files and is specific to each
particular version of PLT Scheme, the uninstalled package cache is
shared by all versions of PLT Scheme that use the same package
repository, and it is searched if a package is not installed in the
primary cache and cannot be downloaded from the central PLaneT repository
(for instance due to a loss of Internet connectivity). This behavior
is intended to primarily benefit users who upgrade their PLT Scheme
installations frequently.
> (LINKAGE-FILE) file-string
> (LINKAGE-FILE file-string) -> void
The file to use as the first place PLaneT looks to determine how a
particular PLaneT dependence in a file should be satisfied. The
contents of this file are used to ensure that no "magic upgrades"
occur after a package is installed. The default is the file "LINKAGE"
in the root PLaneT directory.
> (LOG-FILE) -> file-string or #f
> (LOG-FILE [file-string or #f]) -> void
If #f, indicates that no logging should take place. Otherwise
specifies the file into which logging should be written. The default
is the file "INSTALL-LOG" in the root PLaneT directory.
> (USE-HTTP-DOWNLOADS?) -> boolean
> (USE-HTTP-DOWNLOADS? boolean) -> void
PLaneT can use two different protocols to retrieve packages. If #t,
PLaneT will use the HTTP protocol; if #f it will use the custom-built
PLaneT protocol. The default value for this parameter is #t.
> (HTTP-DOWNLOAD-SERVLET-URL) -> url-string
> (HTTP-DOWNLOAD-SERVLET-URL url-string) -> void
The URL for the servlet that will provide PLaneT packages if
USE-HTTP-DOWNLOADS? is #t, represented as a string. The default
value is "http://planet.plt-scheme.org/servlets/planet-servlet.ss".
> (PLANET-SERVER-NAME) -> string
> (PLANET-SERVER-NAME string) -> void
The name of the PLaneT server to which the client should connect if
USE-HTTP-DOWNLOADS? is #f. The default value for this parameter is
"planet.plt-scheme.org".
> (PLANET-SERVER-PORT) -> Nat
> (PLANET-SERVER-PORT Nat) -> void
The port on the server the client should connect to if
USE-HTTP-DOWNLOADS? is #f. The default value for this parameter is
270.
Note that while these parameters can be useful to modify
programmatically, PLaneT code runs at module-expansion time and so
most user programs cannot set them until PLaneT has already
run. Therefore to meaningfully change these settings it is best to
manually edit the config.ss file.
_util.ss_
utility functions
The functions in this module support examination of the pieces of
PLaneT. They are meant primarily to support debugging and to allow
easier development of higher-level package-management tools.
> (download/install-pkg string? string? nat nat) -> (union pkg? false/c))
Downloads and installs the package specifed by the given owner name,
package name, major and minor version number. Returns false if no such
package is available; otherwise returns a package structure for the
installed package.
> (current-cache-contents) -> ((string ((string ((nat (nat ...)) ...)) ...)) ...)
Returns a listing of all package names and versions installed in the
local cache.
> (current-linkage) -> ((filename (package-name nat nat) ...) ...)
Gives the current linkage table.
> (make-planet-archive directory [file-string]) -> file-string
Makes a .plt archive file suitable for PLaneT whose contents are all
files in the given directory and returns that file's name. If the
optional filename argument is provided, that filename will be used as
the output file's name.
> (remove-pkg owner name major-version minor-version) -> void
Removes the specified package from the local planet cache. Owner and
name must be strings; major-version and minor-version must be natural
numbers and major-version must be greater than zero.
> (unlink-all) -> void
Removes the entire linkage table from the system, which will force all
modules to relink themselves to PLaneT modules the next time they run.
> (add-hard-link owner name major-version minor-version directory) -> void
Adds a development link between the specified package and the given
directory; once a link is established, PLaneT will treat the cache as
having a package with the given owner, name, and version whose files
are located in the given path. This is intended for package
development; users only interested in using PLaneT packages
available online should not need to create any development links.
owner and name must be strings, major-version and minor-version must
be natural numbers, and directory must be a path (not a string)
indicating a directory.
If the specified package already has a development link, this function
first removes the old link and then adds the new one.
> (remove-hard-link owner name major-version minor-version) -> void
Removes any hard link that may be associated with the given package.
> (resolve-planet-path quoted-planet-require-spec) -> path
Returns the file system path to the file specified by the given quoted
planet require specification. This function downloads and installs the
specified package if necessary, but does not verify that the actual
file within it actually exists.
_The PLaneT search order_
-------------------------
PLaneT has three strategies it uses to match a request with an appropriate
package that it tries in order.
1. Previous linkage
Whenever a file requires a package via PLaneT and that requirement is
satisfied, the system makes a note of exactly which package satisfied
that requirement and from then on always uses that exact same package,
even if a newer version is available. This is done to prevent "magic
upgrades" in which a program stops working after installation because
an unrelated package was installed. Such connections are called links
and are stored in a user-specific table called the linkage table.
2. Acceptable local package
If the PLaneT client doesn't have any previous linkage information, it
checks its list of already-installed PLaneT packages for one that
meets the requirement, and uses it if available. Both PLaneT-installed
packages and packages established through a development link are
checked simultaneously at this stage.
3. Acceptable remote package
If there is no acceptable local package, the PLaneT client sends
a request to the PLaneT server for a new package that would satisfy
the requirement. The server then finds the newest matching package
and sends it back to the client, which then installs it and uses
it to satisfy the original requirement.
4. Cached installation archive
If the remote server cannot be contacted (or fails in any way to
deliver an acceptable package), the PLaneT client consults the
uninstalled-packages cache, a cache of all previously-downloaded
packages, even those that are not currently installed. PLT Scheme
users who frequently upgrade their installations may have many
packages downloaded but not installed at any given time; this step
is intended to ensure that these users can still run programs even
if they temporarily lose network connection.
_The planet command-line tool_
------------------------------
The planet command-line tool allows you to examine and manipulate your
local planet cache and linkage table. It has several modes (only one
of which may be used in a single invocation):
-f, --file <plt-file> <owner> <maj> <min>
Install local file <plt-file> as though it had been downloaded from
the planet server. The installed package has path (planet (<owner>
<plt-file's filename> <maj> <min>)), where maj and min are natural
numbers and maj is greater than 0.
-c, --create-archive <path>
Create a PLaneT archive in the current directory whose contents are
the directory <path>
-i, --install <owner> <pkg> <maj> <min>
Download and install the package that
(require (planet "file.ss" (<owner> <pkg> <maj> <min>))
would install. In this mode, min can be any s-expression that
the (require (planet ...)) form can interpret, not just a natural
number.
This function updates the uninstalled-package cache if it downloads
a package that already appears there.
-d, --download <owner> <pkg> <maj> <min>
Download the given package file (specified as with the --install
flag) without installing it. This function does not update the
uninstalled-package cache.
-r, --remove <owner> <pkg> <maj> <min>
Remove the specified package from the local cache.
-e, --erase <owner> <pkg> <maj> <min>
Remove the specified package from the local cache and the
uninstalled-packages cache.
-p, --packages
List the packages installed in the local cache.
-l, --linkage
List the current linkage table
-U, --unlink-all
Clear the linkage table, unlinking all packages and allowing upgrades.
-a, --associate <owner> <pkg> <maj> <min> <dir>
Create a development link from the given package specifier
to the given directory, clearing any previous development
links that may have been in place. (See below for an explanation
of what development links are.)
-u, --unassociate <owner> <pkg> <maj> <min>
Remove any development links from the given package specifier.
_Development links_
-------------------
To aid development, PLaneT allows users to establish direct
associations between a particular planet package (e.g. myname
myfirstpackage.plt 1 0) with an arbitrary directory on the filesystem
(e.g., /home/myname/svn/mypackages/devel/). These associations are
intended to allow developers to use their own directory structures,
version control systems, etc. while developing PLaneT packages while
still being able to use the packages they create as though they were
distributed directly by PLaneT. Development links are local to a
particular user and repository (but not to a particular MzScheme minor
revision).
To establish a development link, use the planet command-line tool:
$ planet --associate myname mypackage.plt 1 0 ~/svn/mypackages/devel
Once you are finished developing a package, you should remove any
development links you have established for it, again using the planet
command-line tool:
$ planet --unassociate myname mypackage.plt 1 0
_Distributing Packages with PLaneT_
-----------------------------------
To put a package on PLaneT, or release an upgrade to an
already-existing package:
0. WRITE YOUR PACKAGE
PLaneT can distribute whatever programs you write, but keep
these guidelines in mind as you write:
i. Organize your code into modules. Since the planet client is
integrated into mzscheme's `require' form, it works best if your code
is arranged into modules.
ii. When one module in your program depends on another, it is best
to require it using the relative-file-name form rather than the
planet require form. For instance, if your program contains files
primary.ss and helper.ss where primary.ss requires helper, use the form
(require "helper.ss")
instead of
(require (planet "helper.ss" ("username" "packagename.plt" 1 0)))
in files that will also be a part of the package.
1. PREPARE A DIRECTORY
Make sure that all source files, documentation, etc. that you want to
be a part of the package are in a single directory and its
subdirectories. Furthermore make sure that nothing else, e.g. unneeded
backup files, is in that directory (with the exception that the
subdirectories and files CVS or Subversion creates are allowed).
For instance, in the following directory tree, my-app/ is set up
appropriately:
home/
...
jacob/
...
my-app/
doc.txt
my-app.ss
graphic-for-my-app.png
private/
implementation.ss
There are no strict requirements for what sorts of files can go in
your package, but for it to work well with PLT Scheme's module
system you should arrange your Scheme code into modules.
2. CREATE INFO.SS AND DOC.TXT FILES [OPTIONAL]
If you put a file named info.ss in your package's root directory, the
PLaneT system will look in it for descriptive metadata about your
package. The PLaneT system looks for certain names in that file:
The _'blurb field_
If present, the blurb field should contain a list of XHTML fragments
encoded as x-expressions (see the xml collection for details) that
PLaneT will use as a short description of your project. This field
is also used by the Help Desk.
The _'release-notes field_
If present, the release-notes field should contain a list of XHTML
fragments encoded as x-expressions (see the xml collection for
details) that PLaneT will use as a short description of what's new
in this release of your package.
The _'categories field_
If present, the categories field should be a list of symbols
corresponding to the categories under which this package should be listed.
The valid categories are:
Symbol Description
------ -----------
devtools Development Tools
net Networking and Protocols
media Graphics and Audio
xml XML-Related
datastructures Data Structures and Algorithms
io Input/Output and Filesystem
scientific Mathematical and Scientific
system Hardware/Operating System-Specific Tools
ui Textual and Graphical User Interface
metaprogramming Metaprogramming Tools
planet PLaneT-Related
misc Miscellaneous
If you put symbols other than these the categories field, they will be
ignored. If you put no legal symbols in the categories field or do not
include this field in your info.ss file, your package will be
categorized as "Miscellaneous."
The _'can-be-loaded-with field_
If present, the can-be-loaded-with field should be a quoted datum of
one of the following forms:
can-be-loaded-with = 'all
| 'none
| (list 'all-except VER-SPEC ...)
| (list 'only VER-SPEC ...)
where VER-SPEC is a quoted instance of the VER-SPEC form defined at the
beginning of this document.
Depending on your package's behavior, it may or may not be okay for
multiple versions of the same package to be loaded at one time on the
entire system --- for instance, if your package relies on writing to a
particular file and assumes that nothing else writes to that same
file, then multiple versions of the same package being loaded
simultaneously may be a problem. This field allows you to specify
whether your package can be loaded simultaneously with older versions
of itself. If its value is 'all, then the package may be loaded with
any older version. If it is 'none, then it may not be loaded with
older versions at all. If it is (list 'all-except VER-SPEC ...) then
any package except those that match one of the given VER-SPEC forms
may be loaded with this package; if it is (list 'only VER-SPEC ...)
then only packages that match one of the given VER-SPEC forms may be
loaded with this package.
When checking to see if a package may be loaded, PLaneT compares it to
all other currently-loaded instances of the same package with any
version: for each comparison, it checks to see if the newer package's
can-be-loaded-with field allows the older package to be loaded. If all
such comparisons succeed then the new package may be loaded; otherwise
PLaneT signals an error.
The default for this field is 'none as a conservative protection
measure. For many packages it is safe to set this field to
'any.
The _'doc.txt field_
If present, the doc.txt field should be a string corresponding to the
name (without path) of the text documentation file for your
package. If this field is the value "doc.txt" and a file called
"doc.txt" exists in your package's root directory, it will be used as
the online documentation visitors to the planet.plt-scheme.org website
will be able to read.
The _'html-docs field_
If present, this field should be a list of strings representing
subdirectories of your package. These directories will be used by
Help Desk as HTML documentation for your package. See
_Creating Help Desk Documentation in HTML format_ for more information
on how to write useful HTML Help Desk documentation.
The _'homepage field_
If present, the URL field should be a string corresponding to a URL
for the package. PLaneT provides this link with the description of your
package on the main PLaneT web page.
The _'primary-file field_
If present, the primary-file field should be a either a string
corresponding to the name (without path) of the main Scheme source
file of your package, or a list of such strings. The PLaneT web page
corresponding to this package will present all files listed here as
interface files for your package; it will give direct links to each
package and a listing of all names provided by the package along with
their contracts (if present).
If you include only a single string, it will be used as the require
line printed on your package's page. If you include a list of strings,
then the first legal file string in the list will be used.
The _'required-core-version field_
If present, the required-core-version field should be a string with
the same syntax as the output of mzscheme's built-in (version)
function. Defining this field indicates that PLaneT should only allow
users of a version of mzscheme equal to or more recent than the
version specified by this field. This allows you finer-grained control
of your package's core-language requirements than its inclusion in a
particular repository; for instance, setting this field to "300.2"
would cause the PLaneT server not to serve it to MzScheme v300
clients.
The _'version field_
If present, the version field should be a string that describes the
version number of this code that should be presented to users (e.g.,
"0.15 alpha"). This field does not override or in any way interact
with your package's package version number, which is assigned by
PLaneT, but may be useful to users.
In addition, PLaneT uses the setup-plt installer to install packages
on client machines, so most fields it looks for can be included with
their usual effects. In particular, adding a 'name field indicates that
the Scheme files in the package should be compiled during
installation; it is a good idea to add it.
An example info.ss file looks like this:
(module info (lib "infotab.ss" "setup")
(define name "My Application")
(define blurb
(list "My application runs 60% faster on 20% less peanut "
"butter. It even shows a fancy graphic!"))
(define primary-file "my-app.ss")
(define doc.txt "doc.txt")
(define categories '(system xml)))
See the PLT mzc: MzScheme Compiler Manual, chapter 7 for more
information on info.ss files.
The other special file PLaneT looks for in the root directory of your
package is doc.txt. Its contents should be documentation for your
package. Its contents will be available as a link on your package's
listing on the PLaneT web page.
3. BUILD A .PLT FILE
Use the planet command-line tool in its archive-creation mode to
create a planet archive:
planet --create-archive /home/jacob/my-app/
This will create a planet archive named my-app.plt in the current
directory whose contents are the contents of /home/jacobm/my-app and
all its subdirectories.
Alternately, you can run the function make-planet-archive from the
util.ss module in the planet collection with the name of the directory
you've prepared as its argument:
(make-planet-archive "/home/jacob/my-app/")
This function will build a packaged version of your directory and
return the path to that package. The path will always be a file named
X.plt, where X is the name of the directory you gave to
make-planet-archive, located in that same directory.
You can now test that your .plt file works as intended using the
planet command-line tool in its install mode:
planet --file <path to your .plt file> <owner name> <maj> <min>
will install the specified .plt file into your local PLaneT cache as
though it had been downloaded from the PLaneT server with the given
owner name and major and minor versions. After you run this command,
you can require your package on your local machine using
(require (planet (<owner name> <.plt file name without path> <maj> <min>)))
to verify everything works. After you do so, you can use
planet --remove <owner name> <.plt file name> <maj> <min>
to remove the test package from your local cache. (Not removing it is
safe as long as you use the same name and version numbers the package
will have on the official PLaneT server; otherwise you may experience
problems.)
4. SUBMIT THE PACKAGE
Go to http://planet.plt-scheme.org/ and click on the link marked
"contribute a package / log in" in the upper-right-hand corner. If you
have not yet created an account, then do so on that page by providing
your name, a user name, an email address, and a password and then
responding to the confirmation message delivered to the email address
you provide.
Once you have an account, then if this is a new package then upload it
using the "Contribute a package" section in your user account page. If
this is a package update then click "update this package" next to its
name in the "Manage your packages" section of your user account page,
then upload the .plt file and indicate on the form whether your update
is backwards-compatible with the prior version or not.
WARNING:
It's very important that packages you say are backwards-compatible
with the prior version, at a minimum contain all the same modules and
provide all the same names the prior version did. If you do not,
programs that use your package will break on some systems.