学习如何使用Nix包管理器时遇到的第一类Nix表达式之一是default.nix; 上精彩NixOS IRC频道我学到的存在shell.nix,并release.nix为好.
我得到的印象是-大概- default.nix是用来用nix-build的只是建立包,shell.nix与用于nix-shell制造与封装的交互环境和release.nix使用与nixops部署包.
由于这可能是不完整和部分不正确的,并且由于这似乎没有明确记录,我想要清楚准确地解释这些"标准文件"; 特别是,对于每种文件类型(以及我缺少的任何其他标准文件),我想知道:
作为一个额外的奖励问题,我想知道在将软件包安装到NixOS模块时应该使用哪些标准文件(如果有的话)?怎么办?
据我所知,Nix是cabal沙箱的替代品.我终于设法安装了Nix,但我仍然不明白它如何取代沙盒.
我知道你不需要使用Nix和封装版GHC的cabal; 但是如果你想发布一个软件包,你需要在某个时候用cabal打包它.因此,您需要能够在NIX中编写和测试您的cabal配置.你是怎样做的?
理想情况下,我想要一个类似于cabal沙箱但在NIX中"包含"的环境,这可能吗?事实上,我真正想要的是等效的嵌套沙箱 - 因为我通常使用由多个包组成的项目.
目前我在2或3个独立项目(P1,P2,P3)上工作,每个项目由2或3个cabal模块/包组成,假设P1:L11,L12(库)和E11(可执行文件).E11取决于L12,它取决于L11.我主要是从库中拆分可执行文件,因为它们是私有的,并保存在私有git仓库中.
理论上,每个项目都可以拥有自己的沙箱(在其子模块之间共享).我尝试过(有一个L11 L12和E11的普通沙箱),但它很快就会烦人,因为如果修改L11,你就无法重建它,因为E11依赖它,所以我必须首先卸载E11重新编译L11.情况可能并非如此,但我遇到了类似的问题.如果我偶尔修改L11,这样会好的,但在实践中,我更改了E11.
由于共享沙箱不起作用,所以我回到了每个包解决方案的一个沙箱.它工作但不太理想.主要问题是如果我修改L11,我需要编译两次(一次在L11中,然后再在E11中).此外,每次我开始一个新的沙箱时,每个人都知道,我需要等待一段时间才能让所有包下载并重新编译.
因此,通过使用Nix,我正在努力为每个项目设置单独的cabal"环境",这解决了上述所有问题.
希望这更清楚.
如何使用新的haskell-ng基础架构在NixOS上设置简单的Haskell开发环境?
我刚刚开始接触Nix,如果我在文档中错过了我的问题的答案,那么道歉.
我想使用Nix来设置一个安全的生产机器,其中包含最少的库和可执行文件.我不希望出现任何编译器或其他构建工具,因为这些可能存在安全风险.
当我安装一些软件包时,它们似乎只依赖于最小的运行时依赖项集.例如,如果我安装,apache-tomcat-8.0.23那么我得到一个Java运行时(JRE)和包含Tomcat的预构建JAR文件.
另一方面,一些软件包似乎包含一个完整的构建工具链作为依赖项.以另一个基于Java的示例为例,当我安装spark-1.4.0Nix 时,请下载包含编译器的Java开发工具包(JDK),它还会提取Maven构建工具等.
所以,我的问题如下:
非常感谢.
我删除了 /nix 并开始全新安装 nix,但是在安装 nix install nix (MACBook Pro M1 arm64 BigSur) 后 sh <(curl -L https://nixos.org/nix/install) 运行,$ nix但我得到了输出zsh: command not found: nix,同样,nix-shell/nix 卷也未创建,我也尝试了指令在https://docs.plutus-community.com/docs/setup/MacOS.html仍然是同样的问题
我想从github添加一个包,就像下面的例子一样,但是我不知道在哪里可以获得任何给定github源所需的sha256哈希(如下所示).
有人可以解释一下sha256来自哪里,如何获得给定github代码库的sha256值?
ghcjs-jquery = self.callPackage ({ mkDerivation, data-default, ghcjs-base, ghcjs-dom, text }:
mkDerivation {
pname = "ghcjs-jquery";
version = "0.1.0.0";
src = nixpkgs.fetchgit {
url = git://github.com/ghcjs/ghcjs-jquery;
rev = "c5eeeafcf81c0d3237b8b9fcb98c4b3633a1297f";
sha256 = "3b2de54224963ee17857a9737b65d49edc423e06ad7e9c9b85d9f69ca923676a";
};
buildDepends = [
data-default ghcjs-base ghcjs-dom text
];
jailbreak = true;
license = null;
}
) {};
Run Code Online (Sandbox Code Playgroud)
https://github.com/ryantrinkle/try-reflex/blob/ghcjs-improved-base/default.nix#L49
ps,这是我在IRC上得到的答案:
joco42> what does this sha256 attribute mean in this nix expression ? https://github.com/ryantrinkle/try-reflex/blob/ghcjs-improved-base/default.nix#L49
8:24 PM <joco42> where does it come from ?
8:24 PM <pikajude> that's the …Run Code Online (Sandbox Code Playgroud) 我曾经sh <(curl -L https://nixos.org/nix/install) --daemon安装过 Nix。\n安装完成后运行nix-shell -p nix-info --run "nix-info -m"以验证安装。\n它返回以下错误
warning: Nix search path entry \'/nix/var/nix/profiles/per-user/kana/channels\' does not exist, ignoring\nerror: file \'nixpkgs\' was not found in the Nix search path (add it using $NIX_PATH or -I)\n\n at \xc2\xabstring\xc2\xbb:1:25:\n\n 1| {...}@args: with import <nixpkgs> args; (pkgs.runCommandCC or pkgs.runCommand) "shell" { buildInputs = [ (nix-info) ]; } ""\n | ^\n(use \'--show-trace\' to show detailed location information)\nRun Code Online (Sandbox Code Playgroud)\n 在手册中写道:
命令nix-instantiate从(高级)Nix表达式生成存储派生.
但什么是商店派生?
手册中说明了以下关于商店派生的内容:
构建操作的描述.派生的结果是商店对象.通常使用派生原语在Nix表达式中指定派生.这些被转换为低级存储派生(由nix-env和nix-build隐式,或由nix-instantiate显式)
这对于nix-newbee来说有点难以理解,我发现通过谷歌搜索没有更多关于nix-instantiate和store派生的启发.我也问#nixos,我没有回答.
有人可以在一个简单的例子中解释一下商店派生是什么,它用于什么?
为什么要使用nix-instantiate生成商店派生?你能给出一个超级简单易懂的例子吗?
我已经在过去注意到nix,一个./myfile.txt路径类型似乎
/home/myuser/mydir/myfile.txt,和/nix/store/55j24v9qwdarikv7kd3lc0pvxdr9r2y8-myfile.txt.我想知道究竟何时发生这种情况.
这对于包含任何形式的秘密信息的文件尤为重要,因为/nix/store系统中的所有用户都可以读取所有文件.
(使用时nixops,为此目的有一个特殊的"键"功能,请参阅本手册中的管理键部分,但我认为这种路径到存储路径复制nix本身和如何发生的时间和方式仍然很重要.)
假设我需要PostgreSQL 9.6.3和Ruby 2.3.1以及其他各种工具.我找不到解释我需要做什么的教程.
从Nix手册中,我似乎需要编写一个Nix表达式来安装所需的依赖项,但我无法实现这一目标:
{ stdenv, fetchurl, perl }:
stdenv.mkDerivation {
name = "hello-2.1.1";
builder = ./builder.sh;
src = fetchurl {
url = ftp://ftp.nluug.nl/pub/gnu/hello/hello-2.1.1.tar.gz;
md5 = "70c9ccf9fac07f762c24f2df2290784d";
};
inherit perl;
}
Run Code Online (Sandbox Code Playgroud)
到将安装正确的PostgreSQL和Ruby版本的表达式.我绝对不清楚在哪里放置安装PostgreSQL和Ruby的文件,或者如何在给定目录中运行单个文件.
有人可以提供指向这些教程的指针,还是指向正确的方向?