作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
或者,目标:如何以声明方式从 Nix 不稳定中获取单个包?
我是 NixOS 的新手,目前正在尝试安装比默认版本更新的 Consul 0.5.2
我的 NixOS 版本(最新稳定版)。我正在尝试通过覆盖我的 /etc/nix/configuration.nix
中的导数来实现这一点。 .
我想保持稳定运行,但我发现不稳定已经有了我想要的 Consul 版本( 0.7.0
),所以我决定使用这个包的属性作为起点来覆盖 https://github.com/NixOS/nixpkgs/blob/master/pkgs/servers/consul/default.nix
我把它大部分复制到我的 configuration.nix
中, 以下是相关部分:
nixpkgs.config.packageOverrides = pkgs: rec {
consul = pkgs.lib.overrideDerivation pkgs.consul (attrs: rec {
version = "0.7.0";
name = "consul-${version}";
rev = "v${version}";
goPackagePath = "github.com/hashicorp/consul";
src = pkgs.fetchFromGitHub {
owner = "hashicorp";
repo = "consul";
inherit rev;
sha256 = "04h5y5vixjh9np9lsrk02ypbqwcq855h7l1jlnl1vmfq3sfqjds7";
};
# Keep consul.ui for backward compatability
passthru.ui = pkgs.consul-ui;
});
};
environment.systemPackages = with pkgs; [
vim
which
telnet
consul-ui
consul-alerts
consul-template
consul
];
nix-build (Nix) 1.11.2
抛出:
$ nixos-rebuild switch
building Nix...
building the system configuration...
error: cannot coerce a set to a string, at /etc/nixos/configuration.nix:19:7
(use ‘--show-trace’ to show detailed location information)
19
时这是哪里
name
设置为
"consul-${version}"
.
configuration.nix
声明性地这样做,而不是命令式?
最佳答案
补充一下 Rok 所说的:
Which should point you that an error actually happens at passthru, line. If you comment it out it will probably build. I'm assuming some recursive calls are at play here and error occurs when it tries to evaluate consul/consul-ui packages.
overrideDerivation
是一种覆盖事物的低级方法。后面
stdenv.mkDerivation
,我们有一个更小的原始函数,称为
derivation
.
derivation
function 接受一些属性,并且(或多或少 - 请参阅文档以获得更详细的信息)在构建期间将这些属性作为环境变量传递。
stdenv.mkDerivation
另一方面,函数在顶部有一大堆智能分层,在将它们传递给
derivation
之前按摩赋予它的属性。 -- 在某些情况下,就像
passthru
一样,它不会将该属性传递给
derivation
根本。
overrideDerivation
:它需要最后的、调整过的属性
stdenv.mkDerivation
将传递给
derivation
,就在这发生之前,它允许你用你给它的函数覆盖这些属性(例如,这意味着,在这一点上,
passthru
已经被删除)。当您的函数添加
passthru
,进入
derivation
,然后想要强制
passthru
的值成一个字符串,以便它可以使
passthru
构建期间的环境变量;然而,因为
passthru
现在指向一个属性集,并且不支持这种强制,然后 Nix 提示。
{ stdenv, lib, buildGoPackage, consul-ui, fetchFromGitHub }:
buildGoPackage rec {
name = "consul-${version}";
version = "0.6.4";
rev = "v${version}";
goPackagePath = "github.com/hashicorp/consul";
src = fetchFromGitHub {
owner = "hashicorp";
repo = "consul";
inherit rev;
sha256 = "0p6m2rl0d30w418n4fzc4vymqs3vzfa468czmy4znkjmxdl5vp5a";
};
# Keep consul.ui for backward compatability
passthru.ui = consul-ui;
}
buildGoPackage
是
stdenv.mkDerivation
的包装器。)
consul.override
,它允许您提供不同的输入(例如可能是
consul-ui
或
buildGoPackage
的不同版本),但它不允许您覆盖不是输入的内容(例如
src
、
passthru
、等等)。同时,
overrideDerivation
允许您修改赋予
derivation
的属性,但不是给
stdenv.mkDerivation
的那些.理想情况下会有一些介于两者之间的东西,这将允许操纵赋予
stdenv.mkDerivation
的属性。 ,而且碰巧有一个公关可以解决这个问题:
关于nixos - 如何在不抛出 `cannot coerce a set to a string` 的情况下覆盖 Nix 导数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39581045/
我是一名优秀的程序员,十分优秀!