在等了几天没有得到回复后,我找到了thistalk,结合 nix-shell、nix-build 和 nix-instantiate 手册页中的示例,产生了所需的答案。
相当于:
nix-shell '<nixpkgs>' -A gnused
是:
nix-shell -E 'with import <nixpkgs> {}; gnused'
或作为 shell.nix:
# shell.nix
with import <nixpkgs> {};
gnused
相当于:
nix-shell -p ctags
是:
nix-shell -E 'with import <nixpkgs> {}; runCommand "dummy" { buildInputs = [ ctags ]; } ""'
或作为 shell.nix:
# shell.nix
with import <nixpkgs> {};
runCommand "dummy" { buildInputs = [ ctags ]; } ""
注意runCommand 接受 3 个输入参数,在这种情况下,第 3 个参数故意留空。
为了将两者结合起来,我们使用了一个覆盖而不是gnused.override,它会覆盖mkDerivation 的参数以用于gnused,而是使用gnused.overrideAttrs,它覆盖mkDerivation 内部的属性。
nix-shell -E 'with import <nixpkgs> {}; gnused.overrideAttrs (oldAttrs: { buildInputs = [ ctags ]; })'
或作为 shell.nix:
# shell.nix
with import <nixpkgs> {};
gnused.overrideAttrs (oldAttrs: { buildInputs = [ ctags ]; })
注意要查找派生的属性,例如gnused,请使用nix repl '<nixpkgs>' 调用nix repl,然后键入gnused.,然后按tab 完成或使用nix edit nixpkgs.gnused,这将在@987654339 设置的编辑器中打开派生@。