GENE (GENEric package manager) is a package manager management system.
I like to call it package 2xmanager. GENE targets general popular package managers (See Supported Package Managers) by wrapping the binaries directly from your system shell. So GENE can do anything you will do by hand.
Package managers are not standardized which can be a problem when you are installing or even searching the package you want. Maybe you were able to find it for X package manager but not yours. At least I have been facing this issue some time (especially when installing C libraries)
There are several problems that GENE tries to resolve:
- Package manager's installation system differ by one to another. Standardizing small commands will help users to adapt other package managers easily.
- Package names are not standardized which is a major problem on general system package managers that requires time and effort to get resolved.
Here is a quick representation on how does GENE manage and standardize package managers
Every machine that runs GENE should include a config file containing the information about the system and optionally a configuration.
# $XDG_CONFIG_HOME/gene/gene.toml
# Example GENE configuration
[system]
backends = [
"apt",
]
To install a package using GENE, you have to declare them first (Direct installation is present on Appendix I) As an example I will write the build scripts for my project Vimacs.
Note
the syntax is just the same. It's merged with your system configuration before GENE starts installing the packages.
# $VIMACS/gene.toml
[system]
deps = [
"tuir",
"mapscii",
"weechat",
"neovim-nightly",
# ...
]
inside $VIMACS/
(where the project's gene.toml
exists) run:
gene install
and gene will start to install everything present on gene.toml
as it should.
One of the GENE's most powerful feature is It's plugin system. Because everything is written in rust, installing a plugin requires recompilation of GENE (Or maybe It'll be in lua to make it easier to maintain the plugin system and usability)
The plugin specific standards are not planned yet (Also this feature will be added later on development)
Note
All of these are but nothing thoughts. They are not implemented yet.
Installing packages are boring. They do the same thing everytime! (That's the good-case btw.) There are a lot of functionality that you could inject into your package manager using just by using custom scripts.
Installing a plugin manager is super simple. Just put it on you system.plugins
as shown below:
# $XDG_CONFIG_HOME/gene.toml
[system]
plugins = [
"binder",
]
[plug.binder.config] # Plugin specific configuration
backend = "git"
verbose = true
prettify = false
ban = [
"pip",
"npm",
]
Then running any gene
command from shell will trigger plugin installation process.
You can just type gene
to just install it.
Here are some example plugin ideas that I've come with.
After installing a dependency from a registry you have the ability to wrap it using language aware binding generators (e.g cbindgen) To address potential project-specific errors that may occur this plugin takes an interactive approach to resolve issues related to non-standardization problems with the help of your assistance.
This plugin adds functionality to install packages to your virtual machines. (Or maybe servers over SSH)
This plugin adds functionality to remove related configuration when you delete a package.
This plugin wraps GENE with a TUI and adds theming options.
Hook your scripts into GENE processes.
Note
GENE Project is in planning stage.
-
whohas - A system utility to search from general package registries.
-
pacaptr - pacman-like syntax for all package managers
-
bedrock linux's package manager manager - also known as
pmm
Bedrock linux's package manager manager is one of the closest projects to GENE. But has a major drawback: It's also meant to get used as a package manager of an unpopular linux distribution, bedrock linux, that drastically limits It's potential.
cargo build --release --bin gene
This feature is heavily discouraged as It's harder to maintain your system packages.
gene -f install <package>
gene -f remove <package>