The Package Catalog | |||||
################### | |||||
``dds`` stores a catalog of available packages, along with their dependency | |||||
statements and information about how a source distribution thereof may be | |||||
maintained. | |||||
Viewing Catalog Contents | |||||
************************ | |||||
The default catalog database is stored in a user-local location, and the | |||||
package IDs available can be listed with ``dds catalog list``. This will only | |||||
list the IDs of the packages, but none of the additional metadata about them. | |||||
Adding Packages to the Catalog | |||||
****************************** | |||||
There are two primary ways to add entries to the package catalog. | |||||
Adding Individual Packages | |||||
========================== | |||||
A single package can be added to the catalog with the ``dds catalog add`` | |||||
command: | |||||
.. code-block:: text | |||||
dds catalog add <package-id> | |||||
[--depends <requirement> [--depends <requirement> [...]]] | |||||
[--git-url <url>] | |||||
[--git-ref <ref>] | |||||
[--auto-lib <Namespace>/<Name>] | |||||
The ``<package-id>`` positional arguments is the ``name@version`` package ID | |||||
that will be added to the catalog. The following options are supported: | |||||
``--depends <requirement>`` | |||||
This argument, which can be specified multiple times to represent multiple | |||||
dependencies, sets the dependencies of the package within the catalog. If | |||||
the obtained package root contains a ``package.dds``, then the dependencies | |||||
listed here must be identical to those listed in ``package.dds``, or | |||||
dependency resolution may yield unexpected results. | |||||
``--git-url <url>`` | |||||
Specify a Git URL to clone from to obtain the package. The root of the | |||||
cloned repository must be a package root, but does not necessarily need to | |||||
have the ``package.dds`` and ``library.dds`` files if relying on the | |||||
``--auto-lib`` parameter. | |||||
``--git-ref`` **must** be passed with ``--git-url``. | |||||
``--git-ref <ref>`` | |||||
Specify a Git ref to clone. The remote must support cloning by the ref that | |||||
is specified here. Most usually this should be a Git tag. | |||||
``dds`` will perform a shallow clone of the package at the specified | |||||
Git reference. | |||||
``--auto-lib`` | |||||
This option must be provided if the upstream does not already contain the | |||||
``dds`` files that are necessary to export the library information. This | |||||
can only be specified for packages that contain a single library root at | |||||
the package root. | |||||
The form of the argument is that of ``<Namespapce>/<Name>``, where | |||||
``Namespace`` and ``Name`` are the usage requirement keys that should be | |||||
generated for the library. | |||||
Bulk Imports via JSON | |||||
===================== | |||||
The ``dds catalog import`` supports a ``--json`` flag that specifies a JSON | |||||
file from which catalog entries will be generated. | |||||
.. note:: | |||||
The ``--json`` flag can be passed more than once to import multiple JSON | |||||
files at once. | |||||
The JSON file has the following structure: | |||||
.. code-block:: jsonc | |||||
{ | |||||
// Import version spec. | |||||
"version": 1, | |||||
// Packages section | |||||
"packages": { | |||||
// Subkeys are package names | |||||
"acme-gadgets": { | |||||
// Keys within the package names are the versions that are | |||||
// available for each package. | |||||
"0.4.2": { | |||||
// `depends` is an object of dependencies for this | |||||
// particular version of the package. | |||||
"depends": { | |||||
// A mapping of package names to version ranges | |||||
"acme-widgets": "^1.4.1" | |||||
}, | |||||
// Specify the Git remote information | |||||
"git": { | |||||
// `url` and `ref` are required. | |||||
"url": "http://example.com/git/repo/acme-gadgets.git", | |||||
"ref": "v0.4.2-stable", | |||||
// The `auto-lib` is optional, to specify an automatic | |||||
// library name/namespace pair to generate for the | |||||
// root library | |||||
"auto-lib": "Acme/Gadgets" | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} |
design | design | ||||
packages | packages | ||||
toolchains | toolchains | ||||
source-dists | |||||
catalog |
location rather than modifying their source code. | location rather than modifying their source code. | ||||
.. _pkgs.source-root: | |||||
Source Roots in ``dds`` | Source Roots in ``dds`` | ||||
======================= | ======================= | ||||
``library.dds`` file must be present at the corresponding library root. | ``library.dds`` file must be present at the corresponding library root. | ||||
.. _pkgs.pkg-root: | |||||
Package Roots | Package Roots | ||||
************* | ************* | ||||
A package is defined by some *package root*, and contains some number of | A package is defined by some *package root*, and contains some number of | ||||
*libraries*. In order for a package to be exported by ``dds`` it must have a | *libraries*. In order for a package to be exported by ``dds`` it must have a | ||||
``package.dds`` file at its package root. | |||||
``package.dds`` file at its package root. | |||||
The primary distribution format of packages that is used by ``dds`` is the | |||||
*source distribution*. Refer to the page :doc:`source-dists`. | |||||
Packages are identified by a name/version pair, joined together by an ``@`` | |||||
symbol. The version of a package must be a semantic version string. Together, | |||||
the ``name@version`` string forms the *package ID*, and it must be unique | |||||
within a repository or package catalog. |
The Local Package Repository | |||||
############################ | |||||
``dds`` maintains a local repository of packages that it has obtained at the | |||||
request of a user. The packages themselves are stored as | |||||
:doc:`source distributions <source-dists>` (``dds`` does not store the binaries | |||||
that it builds within the repository). | |||||
Reading Repository Contents | |||||
*************************** | |||||
Most times, ``dds`` will manage the repository content silently, but it may be | |||||
useful to see what ``dds`` is currently storing away. | |||||
The content of the repostiory can be seen with the ``repo`` subcommand:: | |||||
> dds repo ls | |||||
This will print the names of packages that ``dds`` has downloaded, as well as | |||||
the versions of each. | |||||
Obtaining Packages | |||||
****************** | |||||
When ``dds`` builds a package, it will also build the dependency libraries of | |||||
that package. In order for the dependency build to succeed, it must have a | |||||
local copy of the source distribution of that dependency. | |||||
When ``dds`` performs dependency resolution, it will consider both existing | |||||
packages in the local repository, as well as packages that are available from | |||||
the :doc:`package catalog <catalog>`. If the dependency solution requires any | |||||
packages that are not in the local repository, it will use the information in | |||||
the catalog to obtain a source distribution for each missing package. The | |||||
source distributions will automatically be added to the local repository, and | |||||
later dependency resolutions will not need to download that package again. | |||||
.. _repo.export-local: | |||||
Exporting a Project into the Repository | |||||
*************************************** | |||||
``dds`` can only use packages that are available in the local repository. For | |||||
packages that have a listing in the catalog, this is not a problem. If one is | |||||
developing a local package and wants to allow it to be used in another local | |||||
package, that can be done by exporting a source distribution from the package | |||||
root:: | |||||
> dds sdist export | |||||
This command will create a source distribution and put it into the local | |||||
repository. The package available to other projects on the local system. | |||||
.. note:: | |||||
This doesn't export in "editable" mode: A snapshot of the package root | |||||
will be taken and exported to the local repository. | |||||
If one tries to export a package root into a repository that already contains | |||||
a package with a matching identifier, ``dds`` will issue an error. If the | |||||
``--replace`` flag is specified with ``sdist export``, then ``dds`` will | |||||
forcibly replace the package in the local repository with a new copy. |
Source Distributions | |||||
#################### | |||||
A *source distribution* is ``dds``'s primary format for consuming and | |||||
distributing packages. A source distribution, in essence, is a | |||||
:ref:`package root <pkgs.pkg-root>` directory that contains only the files | |||||
necessary for ``dds`` to reproduce the full build of all libraries in the | |||||
package. The source distribution retains the directory structure of every | |||||
:ref:`source root <pkgs.source-root>` of the original package, and thus retains | |||||
the header structure thereof. In this way, the ``#include`` directives to use | |||||
a library in a source distribution are identical to if the libraries therein | |||||
were directly part of the consuming project. | |||||
Generating a Source Distribution | |||||
******************************** | |||||
Generating a source distribution from a project directory is done with the | |||||
``sdist`` subcommand:: | |||||
> dds sdist create | |||||
The above command can be executed within any package root, and the result will | |||||
be a new directory that reproduces the package's filesystem structure, but | |||||
only maintaining the files that are necessary for ``dds`` to reproduce the | |||||
build of that package. | |||||
The ``--project=<dir>``` flag can be provided to override the directory that | |||||
``dds`` will use as the package root. The default is the working directory of | |||||
the project. | |||||
The ``--out=<path>`` flag can be provided to override the destination path of | |||||
the resulting source distribution. The path should not name an existing file or | |||||
directory. By default, ``dds`` will generate a source distribution in the | |||||
working directory with the name ``project.dsd/`` (The output is itself a | |||||
directory, not an archive). If the ``--replace`` flag is provided, then ``dds`` | |||||
will overwrite the destination if it names an existing file or directory. | |||||
Exporting a Package to the Local Repository | |||||
******************************************* | |||||
.. seealso:: :ref:`repo.export-local` |