在我的存储库中实现覆盖
implementing override in my repository
我想要什么
https://nixos.org/nixpkgs/manual/#sec-pkg-overrideAttrs 文档 overrideAttrs
并且它可以与 top-level/all-packages.nix
.
一起使用
所以我希望能够在我自己的 nixpkgs 叠加层中使用 overrideAttrs!
代码
rec {
frontend = pkgs.callPackage "${nixcloud-frontend}/release.nix" {
inherit nixcloud-editor;
};
AAA = frontend.overrideAttrs (oldAttrs: rec {
API_HOST="wss://";
});
helloWithDebug = pkgs.hello.overrideAttrs (oldAttrs: rec {
separateDebugInfo = true;
});
}
问题
但问题是评估 AAA
不起作用:
nix-build nixcloud-pkgs.nix -A AAA
error: attribute ‘overrideAttrs’ missing, at /home/joachim/Desktop/projects/nixcloud/nixcloud-webservices/nixcloud-pkgs.nix:17:9
相比之下,评估 helloWithDebug
有效:
nix-build nixcloud-pkgs.nix -A helloWithDebug
these derivations will be built:
/nix/store/x01q7lfqbwlj08iknph37jxh2bk3il68-hello-2.10.drv
these paths will be fetched (0.69 MiB download, 0.69 MiB unpacked):
/nix/store/3x7dwzq014bblazs7kq20p9hyzz0qh8g-hello-2.10.tar.gz
提示
在 nixpkgs 中我看到:
lib/customisation.nix
在 lib/default.nix
中使用,我还不能说它是在哪里注入的。
破解nixpkgs
为了查看堆栈,我刚刚将中断代码添加到 lib/customisation.nix
:
nix-build -I nixpkgs=../nixpkgs -A tests --show-trace ~/Desktop/projects/nixos/nixpkgs
error: while evaluating anonymous function at /home/joachim/Desktop/projects/nixos/nixpkgs/pkgs/top-level/impure.nix:15:1, called from undefined position:
while evaluating anonymous function at /home/joachim/Desktop/projects/nixos/nixpkgs/pkgs/top-level/default.nix:20:1, called from /home/joachim/Desktop/projects/nixos/nixpkgs/pkgs/top-level/impure.nix:64:1:
while evaluating anonymous function at /home/joachim/Desktop/projects/nixos/nixpkgs/pkgs/stdenv/booter.nix:42:1, called from /home/joachim/Desktop/projects/nixos/nixpkgs/pkgs/top-level/default.nix:97:10:
while evaluating ‘dfold’ at /home/joachim/Desktop/projects/nixos/nixpkgs/pkgs/stdenv/booter.nix:60:27, called from /home/joachim/Desktop/projects/nixos/nixpkgs/pkgs/stdenv/booter.nix:104:4:
while evaluating ‘go’ at /home/joachim/Desktop/projects/nixos/nixpkgs/pkgs/stdenv/booter.nix:63:18, called from /home/joachim/Desktop/projects/nixos/nixpkgs/pkgs/stdenv/booter.nix:71:8:
while evaluating the file ‘/home/joachim/Desktop/projects/nixos/nixpkgs/lib/default.nix’:
syntax error, unexpected ID, expecting '.' or '=', at /home/joachim/Desktop/projects/nixos/nixpkgs/lib/customisation.nix:37:3
我最后做了什么
cat nixcloud-pkgs.nix
{ pkgs ? import <nixpkgs> {}
, nixcloud-backend ? pkgs.stdenv.lib.cleanSource ../nixcloud-backend
, nixcloud-frontend ? pkgs.stdenv.lib.cleanSource ../nixcloud-frontend
, nixcloud-editor ? pkgs.stdenv.lib.cleanSource ../nixcloud-editor
, nixcloud-container ? pkgs.stdenv.lib.cleanSource ../nixcloud-container
, ...
} @ args:
let
nc-backend = nixcloud-backend;
nc-frontend = nixcloud-frontend;
newpkgs = import pkgs.path { overlays = [ (self: super: {
nixcloud-backend = super.callPackage nc-backend { inherit newpkgs; };
nixcloud-frontend = super.callPackage "${nc-frontend}/release.nix" {
inherit nixcloud-editor;
};
} ) ]; };
in newpkgs
用
评估这个
nix-build nixcloud-pkgs.nix -A nixcloud-frontend
使用覆盖
cat nixcloud-pkgs.nix
{ pkgs ? import <nixpkgs> {}
, nixcloud-backend ? pkgs.stdenv.lib.cleanSource ../nixcloud-backend
, nixcloud-frontend ? pkgs.stdenv.lib.cleanSource ../nixcloud-frontend
, nixcloud-editor ? pkgs.stdenv.lib.cleanSource ../nixcloud-editor
, nixcloud-container ? pkgs.stdenv.lib.cleanSource ../nixcloud-container
, ...
} @ args:
let
nc-backend = nixcloud-backend;
nc-frontend = nixcloud-frontend;
newpkgs = import pkgs.path { overlays = [ (self: super: {
nixcloud-backend = super.callPackage nc-backend { inherit newpkgs; };
nixcloud-frontend = supber.callPackage "${nc-frontend}/release.nix" {
inherit nixcloud-editor;
};
} ) ]; };
in newpkgs.nixcloud-frontend.override (oldAttrs: rec {
API_HOST="wss://....";
})
用
评估这个
nix-build nixcloud-pkgs.nix
文档
另请参阅https://github.com/NixOS/nixpkgs/pull/26321讨论此问题的地方
我想要什么
https://nixos.org/nixpkgs/manual/#sec-pkg-overrideAttrs 文档 overrideAttrs
并且它可以与 top-level/all-packages.nix
.
所以我希望能够在我自己的 nixpkgs 叠加层中使用 overrideAttrs!
代码
rec {
frontend = pkgs.callPackage "${nixcloud-frontend}/release.nix" {
inherit nixcloud-editor;
};
AAA = frontend.overrideAttrs (oldAttrs: rec {
API_HOST="wss://";
});
helloWithDebug = pkgs.hello.overrideAttrs (oldAttrs: rec {
separateDebugInfo = true;
});
}
问题
但问题是评估 AAA
不起作用:
nix-build nixcloud-pkgs.nix -A AAA
error: attribute ‘overrideAttrs’ missing, at /home/joachim/Desktop/projects/nixcloud/nixcloud-webservices/nixcloud-pkgs.nix:17:9
相比之下,评估 helloWithDebug
有效:
nix-build nixcloud-pkgs.nix -A helloWithDebug
these derivations will be built:
/nix/store/x01q7lfqbwlj08iknph37jxh2bk3il68-hello-2.10.drv
these paths will be fetched (0.69 MiB download, 0.69 MiB unpacked):
/nix/store/3x7dwzq014bblazs7kq20p9hyzz0qh8g-hello-2.10.tar.gz
提示
在 nixpkgs 中我看到:
lib/customisation.nix
在 lib/default.nix
中使用,我还不能说它是在哪里注入的。
破解nixpkgs
为了查看堆栈,我刚刚将中断代码添加到 lib/customisation.nix
:
nix-build -I nixpkgs=../nixpkgs -A tests --show-trace ~/Desktop/projects/nixos/nixpkgs
error: while evaluating anonymous function at /home/joachim/Desktop/projects/nixos/nixpkgs/pkgs/top-level/impure.nix:15:1, called from undefined position:
while evaluating anonymous function at /home/joachim/Desktop/projects/nixos/nixpkgs/pkgs/top-level/default.nix:20:1, called from /home/joachim/Desktop/projects/nixos/nixpkgs/pkgs/top-level/impure.nix:64:1:
while evaluating anonymous function at /home/joachim/Desktop/projects/nixos/nixpkgs/pkgs/stdenv/booter.nix:42:1, called from /home/joachim/Desktop/projects/nixos/nixpkgs/pkgs/top-level/default.nix:97:10:
while evaluating ‘dfold’ at /home/joachim/Desktop/projects/nixos/nixpkgs/pkgs/stdenv/booter.nix:60:27, called from /home/joachim/Desktop/projects/nixos/nixpkgs/pkgs/stdenv/booter.nix:104:4:
while evaluating ‘go’ at /home/joachim/Desktop/projects/nixos/nixpkgs/pkgs/stdenv/booter.nix:63:18, called from /home/joachim/Desktop/projects/nixos/nixpkgs/pkgs/stdenv/booter.nix:71:8:
while evaluating the file ‘/home/joachim/Desktop/projects/nixos/nixpkgs/lib/default.nix’:
syntax error, unexpected ID, expecting '.' or '=', at /home/joachim/Desktop/projects/nixos/nixpkgs/lib/customisation.nix:37:3
我最后做了什么
cat nixcloud-pkgs.nix
{ pkgs ? import <nixpkgs> {}
, nixcloud-backend ? pkgs.stdenv.lib.cleanSource ../nixcloud-backend
, nixcloud-frontend ? pkgs.stdenv.lib.cleanSource ../nixcloud-frontend
, nixcloud-editor ? pkgs.stdenv.lib.cleanSource ../nixcloud-editor
, nixcloud-container ? pkgs.stdenv.lib.cleanSource ../nixcloud-container
, ...
} @ args:
let
nc-backend = nixcloud-backend;
nc-frontend = nixcloud-frontend;
newpkgs = import pkgs.path { overlays = [ (self: super: {
nixcloud-backend = super.callPackage nc-backend { inherit newpkgs; };
nixcloud-frontend = super.callPackage "${nc-frontend}/release.nix" {
inherit nixcloud-editor;
};
} ) ]; };
in newpkgs
用
评估这个nix-build nixcloud-pkgs.nix -A nixcloud-frontend
使用覆盖
cat nixcloud-pkgs.nix
{ pkgs ? import <nixpkgs> {}
, nixcloud-backend ? pkgs.stdenv.lib.cleanSource ../nixcloud-backend
, nixcloud-frontend ? pkgs.stdenv.lib.cleanSource ../nixcloud-frontend
, nixcloud-editor ? pkgs.stdenv.lib.cleanSource ../nixcloud-editor
, nixcloud-container ? pkgs.stdenv.lib.cleanSource ../nixcloud-container
, ...
} @ args:
let
nc-backend = nixcloud-backend;
nc-frontend = nixcloud-frontend;
newpkgs = import pkgs.path { overlays = [ (self: super: {
nixcloud-backend = super.callPackage nc-backend { inherit newpkgs; };
nixcloud-frontend = supber.callPackage "${nc-frontend}/release.nix" {
inherit nixcloud-editor;
};
} ) ]; };
in newpkgs.nixcloud-frontend.override (oldAttrs: rec {
API_HOST="wss://....";
})
用
评估这个nix-build nixcloud-pkgs.nix
文档
另请参阅https://github.com/NixOS/nixpkgs/pull/26321讨论此问题的地方