使用最新版本时确保 Nix 开发环境中的 Ruby 版本

Ensure Ruby version in Nix Dev Environment when using latest version

目前,Nix 中的默认和最新 Ruby 是 2.2.2-p0。当我 运行 nix-env -qaP ruby 它 returns 一个列表时,它说这个 ruby 版本是通过 nixpkgs.ruby 访问的。我希望这个 Ruby link 会更改为与最新支持的 ruby 版本保持同步。没有可选的 nixpkgs.ruby_2_2_2 供我使用以确保我的 ruby 版本。

但是,查看 https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/interpreters/ruby/ruby-2.2.2.nix 的 .nix 定义文件,我看到他们在该脚本中指定了修订版。

所以我想知道,当我在创建开发环境的 Nix 表达式的 buildInputs 中列出它时,是否有一些方法可以指定我想要的 Nix 包的修订版(将通过 nix-shell . 访问)?或者还有什么我可以做的事情可以让我确保 ruby 2.2.2-p0 用于安装,而不仅仅是最新的 Ruby,这可能会改变?

当前脚本:

  let
    pkgs = import <nixpkgs> {};
  in with pkgs; {
    rubyEnv = stdenv.mkDerivation rec {
      name = "ruby-env";
      version = "0.1";
      src = ./.;
      buildInputs = [
        stdenv
        ruby
        bundler_HEAD
      ];
    };
  }

我没有在 http://nixos.org/nix/manual/#chap-writing-nix-expressions

的文档中看到这一点

There is no optional nixpkgs.ruby_2_2_2 for me to use to ensure my ruby version.

其实在nixpkgs里面有一个ruby_2_2_2:

$ nix-env -qaP ruby
nixos.ruby_1_8      ruby-1.8.7-p374
nixos.ruby_1_9      ruby-1.9.3-p551
nixos.ruby_2_0      ruby-2.0.0-p645
nixos.ruby_2_1_0    ruby-2.1.0-p0
nixos.ruby_2_1_1    ruby-2.1.1-p0
nixos.ruby_2_1_2    ruby-2.1.2-p353
nixos.ruby_2_1_3    ruby-2.1.3-p0
nixos.ruby_2_1      ruby-2.1.6-p0
nixos.ruby_2_2_0    ruby-2.2.0-p0
nixos.ruby          ruby-2.2.2-p0
nixos.bundler_HEAD  ruby-2.2.2-p0-bundler-2015-01-11

通过查看ruby package in the index的定义,可以看到当前默认的ruby只是ruby 2.2:

的一个别名
ruby = ruby_2_2;

这又是 ruby 2.2.2:

的别名
ruby_2_2 = ruby_2_2_2; 

要在 nix 表达式中将 ruby 包覆盖到特定的 ruby 版本,可以使用 overridePackages

let
  nixpkgs = import <nixpkgs> {};
  pkgs = nixpkgs.overridePackages (self: super: {
    ruby = nixpkgs.ruby_2_2_2;
  });
in with pkgs; 
{
  rubyEnv = stdenv.mkDerivation rec {
    name = "ruby-env";
    version = "0.1";
    src = ./.;
    buildInputs = [
      stdenv
      ruby
      bundler
    ];
  };
}