Ruby
There currently is support to bundle applications that are packaged as Ruby
gems. The utility "bundix" allows you to write a
Gemfile, let bundler create a
Gemfile.lock, and then convert this into a nix
expression that contains all Gem dependencies automatically.
For example, to package sensu, we did:
Gemfile
source 'https://rubygems.org'
gem 'sensu'
$ $(nix-build '' -A bundix --no-out-link)/bin/bundix --magic
$ cat > default.nix
{ lib, bundlerEnv, ruby }:
bundlerEnv rec {
name = "sensu-${version}";
version = (import gemset).sensu.version;
inherit ruby;
# expects Gemfile, Gemfile.lock and gemset.nix in the same directory
gemdir = ./.;
meta = with lib; {
description = "A monitoring framework that aims to be simple, malleable, and scalable";
homepage = http://sensuapp.org/;
license = with licenses; mit;
maintainers = with maintainers; [ theuni ];
platforms = platforms.unix;
};
}]]>
Please check in the Gemfile,
Gemfile.lock and the gemset.nix so
future updates can be run easily.
For tools written in Ruby - i.e. where the desire is to install a package and
then execute e.g. rake at the command line, there is an
alternative builder called bundlerApp. Set up the
gemset.nix the same way, and then, for example:
The chief advantage of bundlerApp over
bundlerEnv is the executables introduced in the
environment are precisely those selected in the exes list,
as opposed to bundlerEnv which adds all the executables
made available by gems in the gemset, which can mean e.g.
rspec or rake in unpredictable versions
available from various packages.
Resulting derivations for both builders also have two helpful attributes,
env and wrappedRuby. The first one
allows one to quickly drop into nix-shell with the
specified environment present. E.g. nix-shell -A sensu.env
would give you an environment with Ruby preset so it has all the libraries
necessary for sensu in its paths. The second one can be
used to make derivations from custom Ruby scripts which have
Gemfiles with their dependencies specified. It is a
derivation with ruby wrapped so it can find all the needed
dependencies. For example, to make a derivation my-script
for a my-script.rb (which should be placed in
bin) you should run bundix as
specified above and then use bundlerEnv like this: