我正在尝试探索 gnu sed 代码库。
我可以从命令行执行此操作:
nix-shell '<nixpkgs>' -A gnused
unpackPhase
cd sed-4.8
configurePhase
buildPhase
Run Code Online (Sandbox Code Playgroud)
然后在 sed 等下编辑代码
但是,我想使用未安装的 ctags:
nix-shell -p ctags
Run Code Online (Sandbox Code Playgroud)
安装软件包但是:
nix-shell '<nixpkgs>' -A gnused -p ctags
Run Code Online (Sandbox Code Playgroud)
得到错误:
error: attribute 'gnused' in selection path 'gnused' not found
Run Code Online (Sandbox Code Playgroud)
我意识到我必须使用 shell.nix 但我找不到上述的 mkShell 示例。
PS 两次调用 nix-shell 达到了所需的结果,但这似乎很笨拙:
nix-shell -p ctags
nix-shell '<nixpkgs>' -A gnused
Run Code Online (Sandbox Code Playgroud)
等了几天但没有得到任何回应后,我找到了这个演讲,结合 nix-shell、nix-build 和 nix-instantiate 手册页中的示例,产生了所需的答案。
相当于:
nix-shell '<nixpkgs>' -A gnused
Run Code Online (Sandbox Code Playgroud)
是:
nix-shell -E 'with import <nixpkgs> {}; gnused'
Run Code Online (Sandbox Code Playgroud)
或者作为 shell.nix:
# shell.nix
with import <nixpkgs> {};
gnused
Run Code Online (Sandbox Code Playgroud)
相当于:
nix-shell -p ctags
Run Code Online (Sandbox Code Playgroud)
是:
nix-shell -E 'with import <nixpkgs> {}; runCommand "dummy" { buildInputs = [ ctags ]; } ""'
Run Code Online (Sandbox Code Playgroud)
或者作为 shell.nix:
# shell.nix
with import <nixpkgs> {};
runCommand "dummy" { buildInputs = [ ctags ]; } ""
Run Code Online (Sandbox Code Playgroud)
注意:runCommand需要 3 个输入参数,在本例中,第三个参数特意留空。
为了将两者结合起来,我们使用覆盖,但不是gnused.override覆盖mkDerivationfor gnused 的参数,而是使用gnused.overrideAttrs覆盖mkDerivation.
nix-shell -E 'with import <nixpkgs> {}; gnused.overrideAttrs (oldAttrs: { buildInputs = [ ctags ]; })'
Run Code Online (Sandbox Code Playgroud)
或者作为 shell.nix:
# shell.nix
with import <nixpkgs> {};
gnused.overrideAttrs (oldAttrs: { buildInputs = [ ctags ]; })
Run Code Online (Sandbox Code Playgroud)
注意:要查找派生的属性,例如gnused,请使用 调用 nix replnix repl '<nixpkgs>'并键入gnused.,然后按 Tab 完成或使用nix edit nixpkgs.gnused,这将在由 设定的编辑器中打开派生$EDITOR。
| 归档时间: |
|
| 查看次数: |
912 次 |
| 最近记录: |