通过“安装包”,我的意思是评估 Nix 构建表达式(使用nix-env
、nix-shell -p
等)从源代码构建,而不是使用替代品。
最初发布在 Stackoverflow 上,但 [Charles Duffy 指出][3] 如果它是关于命令行工具或配置的,那么在这里更合适。仍然把它留在那里,因为我假设通过使用 Nix 语言本身可以强制包始终从源代码编译,我只是还不知道如何做。(或者如果实际上不可能,有人会指出,那么这个问题就属于这里。)
将该substitute
选项设置为false
in nix.conf
(默认为true
)或--option substitute false
在调用 Nix 命令时使用。
nix-env --options substitute false -i hello\n\nnix-shell --options substitute false -p hello\n
Run Code Online (Sandbox Code Playgroud)\n正如 Robert Hensing(评论、聊天)、Henri Menke(评论)和 Vladim\xc3\xadr \xc4\x8cun\xc3\xa1t(评论)指出的那样,这可能不是您真正想要的东西。
\n详细说明:我一直自信地使用最基本的 Nix 功能,但到了需要维护和部署用 C 编写的大型应用程序的自定义分支的地步,这在一开始就非常令人生畏。
\n试图用最简单的方法来解决这个问题,即获取我的分叉并使用新源重新构建它,所以我将其归结为这个问题。尽管如此,我怀疑对我来说正确的方向是NixOS Wiki中的Nixpkgs/Create and debug packages。
\nVladim\xc3\xadr \xc4\x8cun\xc3\xa1t 评论道:“禁用替代项会让您重建本地缺少的所有内容,尽管我怀疑提出此类问题的人通常只想重建指定的包本身。 ”
\n(这可能是通过nix-build
或“只是”覆盖原始包来实现的,但可能是错误的。后者在 NixOS wiki 文章开发环境nix-shell
中提到(甚至可能被演示?) ,但尚未能够彻底阅读它。 )
如果人们想确保后续构建是确定性的,那么他们可能会提出同样的问题。正如亨利·门克(Henri Menke)评论的那样,人们应该使用nix-build --check
它。
这个--check
选项很容易被错过;它没有记录man nix-build
在Nix 手册nix-build
中,而是记录在因为(如所解释的那样):nix-store --realize
man nix-build
\n\n\n
nix-build
本质上是一个包装器nix-instantiate
(将高级 Nix 表达式转换为低级存储派生)和nix-store --realise
(构建存储派生)[因此]此处未列出的所有选项都传递给nix-store --realise
,除了--arg
和--attr
/-A
传递给nix-instantiate
.
请参阅Nix 手册第18.1 节中的详细示例。抽查构建确定性及其之后的下一部分。
\nNix 手册部分中substitute
配置选项的相关部分nix.conf
:
\n\n姓名
\n\n
nix.conf
\xe2\x80\x94 Nix 配置文件描述
\nNix 从两个配置文件中读取设置:
\n\n
\n- \n
系统范围的配置文件
\nsysconfdir/nix/nix.conf
(即/etc/nix/nix.conf
在大多数系统上),或者$NIX_CONF_DIR/nix.conf
如果NIX_CONF_DIR
已设置。- \n
用户配置文件
\n$XDG_CONFIG_HOME/nix/nix.conf
,或者~/.config/nix/nix.conf
如果XDG_CONFIG_HOME
没有设置。\n
--option
您可以使用标志覆盖命令行上的设置,\ne.g。--option keep-outputs false
。目前可以使用以下设置:
\n[..]
\n替代
\n
\n如果设置为 true (默认),Nix 将使用二进制替代(如果可用)。可以禁用此选项以强制从源构建。
(原名use-binary-caches
。)
如果命令多次发出,设置substitute
为false
(使用--options
或 in nix.conf
)将不会重新编译包。也就是说,hello
上面的命令第一次会从源代码编译,然后如果再次发出命令,它将访问已经存在的存储路径。
这就是它变得模糊的地方:很明显,不会发生重新编译,因为除非包的 Nix 构建表达式不改变,否则存储输出哈希也不会改变,使得下一个编译输出等于前一个,因此该操作是多余的。
\n因此,如果有人要对一个包进行一些轻微的黑客攻击,并且只想在本地尝试一下(例如,使用nix-shell
),那么就必须使用-I nixpkgs=a/local/nixpkgs/dir
来获取这些更改 - 并最终进行重新编译?或者应该使用吗nix-build
?
另请参阅问题如何nix-build
再次构建存储路径?\n
归档时间: |
|
查看次数: |
3913 次 |
最近记录: |