【问题标题】:nix: referencing one local perl package from anothernix:从另一个引用一个本地 perl 包
【发布时间】:2019-06-30 14:33:49
【问题描述】:

我正在尝试构建一个使用另一个作为依赖项的本地 perl 包。

有问题的依赖是Getopt-Plus;它是使用这个 nix 表达式安装的:

{ fetchurl, perlPackages }:

perlPackages.buildPerlModule rec {
  version = "0.99";
  name = "Getopt-Plus";

  src = fetchurl {
    url = "mirror://cpan/authors/id/F/FL/FLUFFY/${name}-${version}.tar.gz";
    sha256 = "0vsr4d0myv98aqbs7rc5rvqdpfz1vg1w7b5wyn4i6lmycp1wxxqk";
  };

  buildInputs = [ ];
  propagatedBuildInputs = with perlPackages; [ ];

  doCheck = false;
}

安装成功,如下所示:

$ nix-env -q | grep Getopt
perl5.28.2-Getopt-Plus-0.99

现在,我有一个本地软件包,令人兴奋地称为Finance,它使用 Getopt-Plus。所以这是一个假定的 nix 表达式:

{ nixpkgs }:

with nixpkgs;
with perlPackages;
buildPerlModule rec {
  version = "1.01";
  name = "Finance";

  src = fetchurl {
    url = "http://localhost:8888/${name}-${version}-002.tar.gz";
    sha256 = "0fib0rbzx8519imsw9jrfl805r6lrl6qzbnhipxxix5scar913r7";
  };

  buildInputs = [ ];
  propagatedBuildInputs = [ "Getopt-Plus" ];

  doCheck = false;
}

连同覆盖文件,以允许引用本地定义的包(通过self):

self: super: {
  Finance = import ../pkgs/Finance/default.nix { nixpkgs = self; };
}

我的问题是,如何参考Getopt-Plus;我尝试的一切都会导致build input Getopt-Plus does not exist 形式的错误。

我尝试过带双引号和不带双引号(不带引号会导致“未定义变量”错误;显然它认为Getopt-Plus 将是一个变量,我猜是因为连字符);我试过perl5.28.2-Getopt-Plus-0.99的“已安装”名称;我已经尝试过这些的其他变体(例如,perl5.28.2-Getopt-Plusperl-Getopt-Plusperl-Getopt-Plus-0.99。我还尝试从 Getopt-Plus 安装中删除连字符以成为 GetoptPlus;它当然可以自行安装,但是似乎对这个问题没有帮助。

如果我启动 nix repl,设置 p = import <nixpkgs> {};然后它清楚地将p.GetoptPlus(和p.Finance)显示为有效的派生。

我的问题是:

  1. 让 Finance 依赖 Getopt-Plus 的正确名称是什么?和
  2. 我应该在这里使用 buildInputs 还是propagatedBuildInputs?我不清楚其中的区别。

感谢您的帮助。

【问题讨论】:

  • 我检查了一个 Nix Perl 模块包,它依赖于另一个 Perl 模块(DBD-SQLite),它建议您需要添加依赖项(例如 GetoptPlus 到您的函数参数(以及nixpkgs 你已经拥有),然后将其添加到 propagatedBuildInputs 未引用。请参见此处:github.com/NixOS/nixpkgs/blob/master/pkgs/development/…
  • 啊哈!谢谢@EmmanuelRosa,你是绝对正确的,那行得通。更重要的是,它让我找到了一个更好的解决方案;我错过了 GetoptPlus 的覆盖 - 一旦包含它,GetoptPlus 就会出现在nixpkgs 中,因此我根本不需要显式导入。好样的!

标签: perl nix nixos


【解决方案1】:

添加一个指向 GetoptPlus 的覆盖使其在 nixpkgs 中可用,我的问题就解决了:

self: super: {
  Getopt-Plus = import ../pkgs/Getopt-Plus/default.nix { nixpkgs = self; };
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 2018-10-19
    • 2018-06-14
    • 1970-01-01
    • 2012-03-10
    • 2012-12-17
    相关资源
    最近更新 更多