3

目前,Nix 中默认和最新的 Ruby 是 2.2.2-p0。当我运行nix-env -qaP ruby它时,它会返回一个列表,上面说这个 ruby​​ 版本是通过nixpkgs.ruby. 我希望这个 Ruby 链接将更改为与最新支持的 ruby​​ 版本保持同步。我没有可选的 nixpkgs.ruby_2_2_2 来确保我的 ruby​​ 版本。

但是,查看https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/interpreters/ruby/ruby-2.2.2.nix的 .nix 定义文件,我看到他们在那个脚本。

所以我想知道,当我在buildInputs我的 Nix 表达式中列出它以创建开发环境(将通过 访问nix-shell .)时,是否有某种方法可以指定我想要的 Nix 包的修订版?或者我可以做些什么来确保使用 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的文档中看到这一点

4

1 回答 1

3

我没有可选的 nixpkgs.ruby_2_2_2 来确保我的 ruby​​ 版本。

实际上ruby_2_2_2在nixpkgs中有一个:

$ 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

通过查看index 中 ruby​​ 包的定义,可以看到当前默认的 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
    ];
  };
}
于 2015-10-01T10:30:58.447 回答