Being project-based means that dependencies are local to each project you manage with Akku. Each project specifies its dependencies through a manifest and a lockfile. When working on a project, you run akku install and then .akku/env to start a new shell with that project's environment variables set. This ensures that the code you load into your program is that of your direct or indirect dependencies, instead of something that just happened to exist somewhere in your load path.
A project's direct dependencies are listed in the manifest. By running a dependency solver, specific versions of those dependencies are locked. The lockfile contains locations, cryptographic checksums and other information needed for Akku to install selected versions of all dependencies. This means that everyone using the same lockfile will get exactly the same dependencies installed as you.
This manpage mostly describes the command line interface, where these commands are available:
This command follows the instructions in the lockfile to download and install the listed dependencies. A file scanner looks at each file in the downloaded projects and figures out what type of source it is and where it goes in the file system.
The index files are signed with GnuPG signatures that are verified before they are used. The SHA-2 implementation is a little slow, so this takes a few seconds.
The range notation is provided by the semver package.
The --dev option adds the package as a development dependency. Development dependencies are ignored when the package is used as a dependency by a third package (they are only needed when doing development on the current package).
It is wise to commit both the manifest and the lockfile in your source code repository. Neither are used by your reverse dependencies after a package has been published, but both are useful for yourself and other people.
The version to publish is taken from the manifest but can be overridden by using the --version=version option. By default it looks for a tag named vversion. It is possible to override the tag using the --tag=tag option if the repository does not use the v1.2.3 tagging scheme. If it does not find a tag then the published revision will match the current HEAD.
It is always the lock section of the printed index snippet that controls which revision is used for the published version. It is also the currently checked out manifest that will be used to populate the metadata of the index snippet; not the manifest that happens to be checked in under the revision.
There is no strong requirement to commit the manifest before publishing. This means that you can also publish other people's repositories, even if you do not have commit rights.
See section PUBLISHING PACKAGES below for a checklist of things to go through before publishing.
This command requires gpg, a gpg key and curl.
Some words are worth repeating here: this program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
http://snow-fort.org/
Snow
instead so that your package will also be available in other R7RS
package managers. Here is a checklist of items to consider before
publishing:
https://semver.org/
SemVer specification
.
If you are packaging software that does not follow the SemVer rules
then adjust the version numbers so that they follow the rules (they don't
need to match the original software exactly).
https://\:spdx.org/\:licenses/
the SPDX project
,
making sure to use an open source license.
All packages in the index are signed with GnuPG signatures. This provides important benefits: third parties can verify the package index and the archive software can verify that a newly uploaded version came from same author as previously uploaded versions. The email on your GnuPG key is used to contact you if there are any questions.
Packages are manually reviewed before they are accepted into the package index. Ask in #akku on Freenode if there are problems.
Publishing is meant to be easy and hassle-free after some initial setup, so please report any usability problems with the publish command.
The conversion of R7RS code is not complete. It does not add quotes to vectors, which are self-quoting in R7RS but not in R6RS. If the R7RS code uses shared data at the lexical level then the written R6RS library will also use that and may end up not being loadable by a conformant R6RS implementation. The R7RS support needs the akku-r7rs package to be installed.
The lock command (and any command that uses it behind the scenes) does not preserve the versions of previously locked packages. This is planned to be fixed.
The Cygwin and MSYS2 ports do not support colons in filenames. This has the unfortunate consequence that Chez Scheme and SRFI 97-compliant SRFI distributions do not work on these platforms. Symlinks are also not supported.
Whereas GNU Guile 3.0 has the --r6rs command line argument, GNU Guile 2.2 does not provide a direct way to enable full R6RS support. It should be started with the flags -x .guile.sls -x .sls on the command line. Alternatively you can add these lines to your ~/.guile:
(set! %load-extensions (append \(aq(".guile.sls" ".sls") %load-extensions)) (read-enable \(aqr6rs-hex-escapes) (read-enable \(aqhungry-eol-escapes)
Please report bugs to
https://\:gitlab.com/\:akkuscm/\:akku/\:issues
GitLab issues
or by
email
$ akku update
$ akku init my-project $ cd my-project $ akku install $ .akku/env
$ akku add chez-srfi # writes Akku.manifest $ akku lock # writes Akku.lock $ akku install # updates .akku/
AKKU_LOG_LEVEL log level: trace, debug, info, warning, error, critical AKKU_ENV informative variable; not used (set by .akku/env) AKKU_R6RS R6RS Scheme library path, for system libraries AKKU_R7RS R7RS Scheme library path, for system libraries AKKU_PROJECTS extra project directories to install into .akku/ AKKU_SETTINGS comma-separated list of settings (see below) XDG_CACHE_HOME cache directory home (default: ~/.cache) XDG_DATA_HOME data directory home (default: ~/.local/share/) HOME user's home directory
The AKKU_SETTINGS variable can contain these settings:
no-network do not use the network (and fail if it would be needed) no-dependencies do not use any projects from the lockfile copy-current-project copy (do not symlink) the current project
PREFIX/share/akku/bootstrap.db the package index from the distribution PREFIX/share/akku/keys.d trusted keys for package indices ~/.local/share/akku/keys.d/ extra trusted keys ~/.local/share/akku/index.db the latest package index ~/.cache/akku cached downloads Akku.manifest the package manifest Akku.lock instructions for installing dependencies .akkuignore files to ignore (no wildcards) .akku/bin/ programs from packages; activate script .akku/lib/ installed libraries from packages .akku/ffi/ compiled libraries for use with an FFI .akku/list a list of files and whence they came .akku/notices/ license notices from installed packages .akku/src/ downloaded source code
Thanks to everyone who has contributed to Scheme over the years.
http://\:gnu.org/\:licenses/\:gpl.html
https://akkuscm.org/
https://gitlab.com/akkuscm/akku/wikis/home