Aperture is somewhere between nix, guix, and homebrew. It uses a source-tracked approach to installing pre-built software. This means that the exact instructions used to compiled a package are used as it's identifier. Ergo, to find a pre-built version of a package, it's identifier is computed by inspecting the instructions.
This means that there is no definitive version of any package, only the current versions that match the source. This allows, for instance, for many versions of a library to be installed and not conflict.
- Aperture: The overarching project name
- iris: The command line tool used to manage packages
- package: A set of files that are created by instructions in a .xcr file
- car: A pre-built file tree that corresponds to a package
- repository: A set of .xcr files and configuration on where car files can be downloaded
- name: The name of a package, used to identify the package within a repository
- id: Identifier for a package, which includes the hash of the instructions, the name, and the version
- profile: For a package to be usable, the files for the package are symlinked into a profile directory. This profile directory can then access all the packages that have been installed into the profile.
- global packages: Packages installed onto a system and then link to a global profile in the users home directory
For now, you must have go
installed. Then you can simply run go install github.com/lab47/aperture/cmd/iris@latest
By default, https://github.com/lab47/aperture-packages is used as the package repository.
Packages can be discovered using iris search
, for instance iris search awscli
.
Global packages are ones that are available in all of a users sessions. The files are installed into the computers store and then link to a global profile in the users home directory.
iris add <name>
. For example, to add neovim: iris add neovim
.
Rather than using global packages, users can use project settings. These come in the form of a
file that contains the list of packages to install, the file is project.xcr
.
A project.xcr
file uses the same programming language as packages, allowing the user
the ability to call functions and compose new packages.
For instance, here is an example of a project.xcr
file that installs a set of go
tools:
# This loads the go package from the repository. The go package contains a set of
# exported functions that can be called, such as build_module.
import go
install(
"protobuf", # as a string, the installer will lookup a package of this name
go, # as a local variable that contains a script
# These lines generate a package for each call to build_module that
# will be installed. See https://github.com/lab47/aperture-packages/blob/main/packages/go/go.export.xcr#L3-L27
# for the definition of build_module.
go.build_module("gotest.tools/gotestsum", "v1.6.4"),
go.build_module("github.com/golang/protobuf/protoc-gen-go", "78b1f09"),
go.build_module("github.com/mitchellh/protoc-gen-go-json", "069933b8c"),
go.build_module("github.com/hashicorp/go-changelog/cmd/changelog-build", "56335215"),
go.build_module("golang.org/x/tools/cmd/stringer", "35839b70"),
go.build_module(
path: "github.com/vektra/mockery/cmd/mockery",
version: "v1.1.2",
buildFlags: ["-ldflags=-s -w -X github.com/vektra/mockery/mockery.SemVer=1.1.2"],
)
)