我创建了自己的存储库以获取一些git源。
# packages.nix
with (import <nixpkgs> {});
rec {
rustcSource = fetchgit {
url = https://github.com/rust-lang/rust;
rev = "3191fbae9da539442351f883bdabcad0d72efcb6";
sha256 = "0w1l14kz9kxyj5dw3w9xxk1fzww5xqs3sf8saay0mh7nkmvrdb59";
};
}
Run Code Online (Sandbox Code Playgroud)
然后我建立rustcSource,
sudo nix-env -f package.nix -A rustcSource
Run Code Online (Sandbox Code Playgroud)
揭示了的存储路径/nix/store/096fpy9qjbz5r14aadjnq9d2md9ql9cg-rust-3191fba。问题是,我忘了下载它的子模块,所以我将表达式更改为包括子模块,
with (import <nixpkgs> {});
rec {
rustcSource = fetchgit {
url = https://github.com/rust-lang/rust;
rev = "3191fbae9da539442351f883bdabcad0d72efcb6";
sha256 = "0w1l14kz9kxyj5dw3w9xxk1fzww5xqs3sf8saay0mh7nkmvrdb59";
leaveDotGit = true;
fetchSubmodules = true;
};
}
Run Code Online (Sandbox Code Playgroud)
但是,我发现nix-build它不会重新计算哈希值,并且看到路径已构建。因此,最终不下载子模块。
问:是尼克斯虫吗?如何“重建”或重新下载存储库?
PS实际上,我在其中创建了一个带有fetchgit的派生类,但由于未下载子模块而失败了。因此,以上情况简化了我的问题。
假设我的 NixOSconfiguration.nix设置如下:
{config, pkgs, ...}:
{
services.openssh.enable = true;
}
Run Code Online (Sandbox Code Playgroud)
我现在想要调用第二个文件networking.nix,它根据参数设置我的主机名。
{config, pkgs, hostname, ...}:
{
networking.hostName = hostname
}
Run Code Online (Sandbox Code Playgroud)
这可能吗?我怎样才能包含文件。我已经尝试通过使用来做到这一点,imports = [ ./networking.nix { hostname = "helloworld"; } ];但这没有用。
谢谢。
通过生成一个光秃秃的“ hello world”项目
stack new myproject simple
Run Code Online (Sandbox Code Playgroud)
每当我运行时stack setup,stack init或者stack build一直出现以下错误:
Downloading lts-10.0 build plan Downloaded lts-10.0 build plan.
AesonException "Error in $.packages.cassava.constraints.flags['bytestring--lt-0_10_4']: Invalid flag name: \"bytestring--lt-0_10_4\""
Run Code Online (Sandbox Code Playgroud)
我看到一些人谈论这个问题,并争论是否-在标志名中使用两个连续的标记名称,例如“ bytestring--lt-0 ...”,这是堆栈或木薯的错误,还是阴谋集团等
但是有人建设性地建议解决方法
stack upgrade
Run Code Online (Sandbox Code Playgroud)
但是即使运行stack upgrade命令后,我仍然有问题。而且我无法构建“ hello world”程序。
任何想法如何解决此问题或解决方法?
如果有一些最适合NixO的解决方案,我将使用NixO。
这是输出到stack --version:
Version 1.5.1 x86_64
Compiled with:
- Cabal-1.24.2.0
- Glob-0.8.0
- HUnit-1.5.0.0
- MonadRandom-0.5.1
- QuickCheck-2.9.2
- SHA-1.6.4.2
- StateVar-1.1.0.4
- aeson-1.1.2.0
- aeson-compat-0.3.6
- annotated-wl-pprint-0.7.0
- ansi-terminal-0.6.3.1 …Run Code Online (Sandbox Code Playgroud) 我刚刚开始使用 NixOS,到目前为止已成功/etc/nixos/configuration.nix在我的 NixOS 18.09 VM 中进行编辑以启用 PHP-FPM 和 Caddy Web 服务器。
{ config, pkgs, ... }:
{
imports = [ <nixpkgs/nixos/modules/installer/virtualbox-demo.nix> ];
users = {
mutableUsers = false;
groups = {
caddy = { };
php-project = { };
};
users = {
hello = {
group = "php-project";
};
};
};
environment.systemPackages = [
pkgs.htop
pkgs.httpie
pkgs.php # for PHP CLI
];
services.caddy = {
enable = true;
email = "david@example.com";
agree = true;
config = '' …Run Code Online (Sandbox Code Playgroud) 我有一个基于堆栈的项目,它依赖于几个 C 库。其中一个 C 库 zlib 可从原生 NixOS 包中获得,我可以将其放入 stack.yaml 的 nix 部分:
nix:
enable: true
packages:
- "zlib"
Run Code Online (Sandbox Code Playgroud)
另一个不是nixpkgs 的一部分。堆栈文档建议使用 中的nix部分的替代方法stack.yaml是“编写 shell.nix”而无需详细说明。
于是写了一篇,坚持以zlib为例:
{ pkgs ? import <nixpkgs> { } }:
pkgs.mkShell {
buildInputs = [
pkgs.pkgconfig
pkgs.zlib
pkgs.stack
];
}
Run Code Online (Sandbox Code Playgroud)
这为我提供了 zlib 的工作 pkg-config:
[nix-shell:~/Work/PrivateStorage/PaymentServer]$ pkg-config --modversion zlib
1.2.11
Run Code Online (Sandbox Code Playgroud)
但是,似乎并没有让堆栈能够找到库:
[nix-shell:~/Work/PrivateStorage/PaymentServer]$ stack build
zlib-0.6.2: configure
Progress 1/7
-- While building package zlib-0.6.2 using:
/home/exarkun/.stack/setup-exe-cache/x86_64-linux-nix/Cabal-simple_mPHDZzAJ_2.4.0.1_ghc-8.6.5 --builddir=.stack-work/dist/x86_64-linux-nix/Cabal-2.4.0.1 configure --with-ghc=/nix/store/zfpm9bai9gj8vs09s2i2gkhvgsjkx13z-ghc-8.6.5/bin/ghc --with-ghc-pkg=/nix/store/zfpm9bai9gj8vs09s2i2gkhvgsjkx13z-ghc-8.6.5/bin/ghc-pkg --user --package-db=clear --package-db=global --package-db=/home/exarkun/.stack/snapshots/x86_64-linux-nix/lts-14.1/8.6.5/pkgdb …Run Code Online (Sandbox Code Playgroud) 我想使用stdenv.cc覆盖(即不更改 nixpkgs)全局覆盖特定的 GCC 版本(不一定在 nixpkgs 中)。有没有办法做到这一点?
像这样的覆盖会导致无限递归(因为包gcc49作为stdenv输入):
self: super:
{
stdenv = super.overrideCC super.stdenv super.gcc49;
}
Run Code Online (Sandbox Code Playgroud)
改变stdenv.cc全局的正确方法是什么?
手动设置stdenv = ...是不可行的,因为我不仅import nixpkgs想在构建/使用 nix 表达式时替换,而且还想在例如中替换。ccnix-shell -p package
有人可以帮我弄这个吗?
当尝试恢复旧项目时,有时我必须四处寻找较旧的 Nixpkgs 承诺才能开始工作。
例如,我的大多数shell.nix文件都是这样开始的,
{pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
# ...
}
Run Code Online (Sandbox Code Playgroud)
这将从当前通道指向的提交中导入所有表达式,但一段时间后,发生了太多更改,我的项目将不再构建;然后我必须找到一个仍然有效的提交,然后从那里开始。
$ nix-shell --arg pkgs \
> 'import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/0c0fe6d85b92c4e992e314bd6f9943413af9a309.tar.gz") {}'
Run Code Online (Sandbox Code Playgroud)
如果我当时能够从通道中保存工作提交,并在以后需要时有一些可靠的东西可以回退,那可能是最好的。
通过“安装包”,我的意思是评估 Nix 构建表达式(使用nix-env、nix-shell -p等)从源代码构建,而不是使用替代品。
还交叉发布到 Unix 和 Linux,因为正如Charles Duffy 指出的那样,如果它是关于命令行工具或配置的,那么它更符合主题。仍然将其留在这里,因为我假设仅使用 Nix 语言就可以强制包始终从源代码进行编译,我只是还不知道如何操作。(或者如果实际上不可能,有人会指出,那么这个问题就属于这里。)
因此,在 NixOS 上,我们可以编辑该文件/etc/nixos/configuration.nix来指定我们的“输入”系统配置。然而,当我们运行nixos-rebuild switch构建并激活“输入”配置时,严格来说,激活的实际配置并不完全是我们“输入”中的配置,而是基于该“输入”的“输出”配置。
具体来说,某些杂项配置参数可能会导致 NixOS 逻辑插入“输入”配置中未严格指定的附加服务的配置。例如,这里https://github.com/NixOS/nixpkgs/blob/724ed08df02546fea2ab38613d615dd47461528c/nixos/modules/services/web-apps/wordpress.nix#L279是一些 NixOS 逻辑,用于插入 MySQL / MariaDB 服务的配置进入最终的“输出”系统配置,但并不是因为在“输入”配置中直接请求了MySQL服务,而是因为指定了WordPress配置,并且自动激活了MySQL服务以方便WordPress实例的运行。
我的问题是,有人知道查看此“最终”生成的“输出”配置的命令或过程是什么,该配置将是系统构建、激活和运行的实际配置吗nixos-rebuild switch?
这对于故障排除非常有用,能够评估正在运行的所有内容及其运行时的实际配置。
我试图运行 Nix 命令来构建项目:
nix build -f default.nix plutus.haskell.packages.plutus-core.components.library
我收到了这个错误!
error: attribute 'aarch64-darwin' missing, at /nix/store/cyfj6bd0n0ckvkm67mhjyg1qcvrfgsg9-source/artifact.nix:11:10
Run Code Online (Sandbox Code Playgroud)
“aarch64-darwin”是指 64 位架构吗?