A few days ago several discussions have been launched where people try to deal with managing none Raku / native dependencies for Raku modules. While a solution is far from being found or at least is complete here is my, Sparrow take on the problem.
Raku-native-deps
Raku-native-deps is a Sparrow plugin to parse META6.json file and turn it to native packages dependencies. It has a lot of limitations, e.g only supporting CentOS and only parsing `:from<native>` statements but it could give one a sence of the approach:
my %state = task-run "get packages", "raku-native-deps", %( path => "META6.json" ); for %state<packages><> -> $i { say "package: $i<package>" }
Basically one just give it a path to module’s META file and the plugin parses the file converting it to native package dependencies, then it’s possible to install ones using underlying package manager:
for %state<packages><> -> $i { package-install $i<package> }
Full scenario
So full scenario to install a module with native dependencies would be:
# Fetch module and get a directory where it's fetched my %state = task-run 'fetch dbd-sqlite', 'zef-fetch', %( identity => 'DBD::SQLite' ); # Build native packages list from META6.json my %state2 = task-run "get packages", "raku-native-deps", %( path => "{%state<directory>}/META6.json" ); # Install native packages (libsqlite3) for %state2<packages><> -> $i { package-install $i<package>; } # Install module, at this point external dependencies are installed # So this step will only install Raku dependencies and module itself zef "DBD::SQLite";
RakuDist integration
RakuDist – Raku modules testing service uses the method to test distributions containing native dependencies. Known modules examples:
DBD::SQLite ( META6 pull request – https://github.com/CurtTilmes/raku-dbsqlite/pull/10 )
LibCurl ( META6 pull request – https://github.com/CurtTilmes/raku-libcurl/pull/15 )
GPGME ( META6 pull request – https://github.com/CurtTilmes/raku-gpgme/pull/1 )
Further thoughts
The approach is not complete, though right now it could solve installation of native dependencies for a single module ( but not recursively for module’s dependencies’s native dependencies ), one can read ongoing discussion here – https://github.com/ugexe/zef/issues/356 and suggest ideas.
Thanks for reading
—
Aleksei
One thought on “Managing External Raku Dependencies using Sparrow”