|Robby Zambito 78cf4fff2e||10 months ago|
|project||10 months ago|
|src||10 months ago|
|.gitignore||10 months ago|
|LICENSE||10 months ago|
|README.md||10 months ago|
|build.sbt||10 months ago|
The zng package manager is designed with the intent to combine the best of nix and portage.
The configuration files for portage are well structured, and offer simple abstractions to have powerful control over you system. USE flags can enable or disable features system-wide, or per package. However, over time these files can become messy and hard to work with. Packages can also conflict with one another, and require tedious workarounds, or may not work at all together.
Nix offers features that shine where portage lacks. For example, nix packages have a degree of isolation that allows packages that portage would find conflicts with to be installed side by side. Nix also centralizes configuration into a single file, which makes it easy to define and deploy a system, or track changes with version control. However, it does this with the nix language which is noisy, and feels unfamiliar to many. There is also no clear way to globally enable and disable features like portages USE flags.
The zng package manager offers declarative control over your system using a terse DSL defined in the Scala programming language. It also leverages the IPFS network for decentralized package distribution. This means that packages will automatically be downloaded from the fastest source available. It also means that you do not need to worry about PPAs, overlays, channels, or any other kind of third party repositories.
Packages which have been defined in the zngpkgs repository can be installed like this:
zng i gimp
Packages which are not defined in the zngpkgs repository can be installed using the hash of the .zng package definiton.
zng i /ipfs/QmZX1WWA8s9fbdRcZ8u7yqzaoeVeCHfQfhNmAqARL4ifFT
This will download the .zng file that defines the package. This package definition will have the IPFS hash of the package source. It may define optional features that can be included or excluded from the package. It also defines any required dependencies for the package. These dependencies are then recursively aquired and installed.