Pint Packages
The first part of the module system we’ll cover are packages.
A package is a bundle of one or more modules that provides a set of functionality. A package
contains a pint.toml file that describes how to build it.
Packages can come in one of two forms: a "contract" package and a "library" package. Contract
packages represent smart contracts that can be compiled to bytecode and deployed to a blockchain.
Each contract package must have a contract.pnt file in its src directory, which represents the
entry point of the contract. Library packages don't compile to bytecode. Instead, they define
functionality intended to be shared with multiple projects. The entry point of a library crate is
always a lib.pnt file in the src directory.
Let's walk through what happens when we create a package. First, we enter the command pint new my-project:
$ pint new my-project
Created my-project [contract] (/path/to/my-project)
$ ls my-project
pint.toml src
$ ls my-project/src
contract.pnt
After we run pint new, we use ls to see what the pint tool creates. In the project directory,
there's a pint.toml file, giving us a package. There's also an src directory that contains
contract.pnt. Open pint.toml in your text editor, and note there's no mention of
src/contract.pnt. The pint tool follows a convention that src/contract.pnt is the root file of a
contract package. Likewise, src/lib.pnt is the root file of a library package.
Note that the pint.toml file does contain a field called kind, which is set to contract in the
example above, to indicate that this particular package is a contract. In contrast, if we were to
create a library package using pint new my-library --lib, then we would find that the kind field
in the generated pint.toml is set to library.