Hi there!
I’ve been working on an alternative package manager for Julia for a while, called Ajt. I built it because I’ve hit some limitations with Pkg.jl in a game engine i am working on which is made in Julia (currently working on it privately). Ajt is implemented in the zig programming language.
Its not meant to replace or overthrow Pkg, i made it to see how far i can go and what will be the tradeoffs.
Some of the things it focuses on:
very fast startup (static binary)
a different dependency resolver (based on PubGrub) with more explicit error messages
parallel installation / compilation scheduling instead of phase barriers
Curious about whether it supports functionality like Pkg’s Pkg.Apps? I use that for some of my projects but have had a few issues along the way and am wondering if this provides another option?
currently not, if you will try to use Pkg.apps via Ajt it will forward the call to Pkg due to it not being implemented yet, however, i am planning to implement it soon.
update: Pkg.apps is now partly supported (dev, rm, status).
the full Pkg.apps will be supported soon along with binary releases in github releases
note: for all of you who want Ajt in the general registry, that is not possible currently.
Ajt is written in zig and is a standalone package manager for Julia, not a Julia package, sorry for the inconvenience
Hmm I did find a zig recipe here, as well as a recipe that uses zig, so it seems quite possible to do something there. Not sure if those are the versions you need though, but that can always be updated by a PR
JLLs are not being retired, they are going strong and underpin quite a bit of the ecosystem these days. BinaryBuilder.jl, the thing which builds JLLs, is at some point going to be swapped out for the new BinaryBuilder2.jl, but that is at some point in the future.
oh, i didnt find that, thank you for pointing it out to me! and my bad for thinking JLLs are retiring anyhow, ill start to work on shipping Ajt as a JLL, thank you!
a phase barrier in this context is waiting for one stage to happen before moving to the next, Ajt does something different, it moves to the next phase per item instead of waiting globally, for example: if package A is downloaded before package B, it wont wait for package B unless its a dependency
I thought that’s what Pkg already does? I don’t know how to actually check for parallel downloads, but that’s how I interpreted JULIA_PKG_CONCURRENT_DOWNLOADS.
yes, Pkg.jl does concurrent downloads, but it dosent immediately go to compile the downloaded package, it waits for the other packages to finish, only then moving on to the next phase, Ajt models packages as a dependency graph and starts the next phase per package as soon as its ready to move on to that phase.
if you need more clarification please let me know
Imo, a good package manager should really be language agnostic. Language toolchain should provide language specific parts of build system, and package manager handle multi-language dependencies and reproducible dev environments. One example of this approach is nix+devenv.sh. Nix implementation may be not optimal, but the idea is right imo.