Я только начал играть с NixOS, и до сих пор мне удалось отредактировать /etc/nixos/configuration.nix
в моей виртуальной машине NixOS 18.09, чтобы включить PHP-FPM и веб-сервер Caddy.
{ 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 = ''
(common) {
gzip
header / -Server
header / -X-Powered-By
}
:8080 {
root /var/www/hello
fastcgi / /run/phpfpm/hello.sock php
log syslog
import common
}
'';
};
services.phpfpm = {
phpOptions = ''
date.timezone = "Europe/Berlin"
'';
poolConfigs = {
hello = ''
user = hello
listen = /run/phpfpm/hello.sock
; ...
pm.max_requests = 500
'';
};
};
}
PHP-обработанный ответ доступен по адресу localhost: 8080.(Yay!)
To включить плагины Caddy при компиляции из источника , импорт Go добавлен в run.go caddy, например:
_ "github.com/mholt/caddy/caddyhttp" // plug in the HTTP server type
// This is where other plugins get plugged in (imported)
_ "github.com/nicolasazrak/caddy-cache" // added to use another plugin
)
Как я могу настроить вставку такой строки после загрузки исходного кода и до начала сборки?(Если это разумный подход при использовании Nix?)
Пакет caddy NixOS 18.09 .
Служба caddy NixOS 18.09 .
Я полагаю, что при написании пакета может быть назначен скрипт компоновщика (Bash или другой), и я думаю, что в него можно было бы вставить строку.Но я заблудился относительно того, как назначить скрипт для существующего пакета в этой ситуации (переопределить атрибут / использовать оверлей?) И где поместить скрипт на диск.
Обновление статуса
Я немного читал о настройке пакетов в целом, и мне кажется, что overlays может быть тем, что мне нужно.Тем не менее, я не могу оценить мой оверлей.
Я использую переопределение имени пакета в качестве теста, поскольку это проще, чем исправление кода.
Попытка оверлея 1
/etc/nixos/configuration.nix
:
{ config, pkgs, options, ... }:
{
imports = [ <nixpkgs/nixos/modules/installer/virtualbox-demo.nix> ];
nix.nixPath = options.nix.nixPath.default ++ [
"nixpkgs-overlays=/etc/nixos/overlays-compat/"
];
# ...
}
/etc/nixos/overlays-compat/overlays.nix
:
self: super:
with super.lib;
let
# Using the nixos plumbing that's used to evaluate the config...
eval = import <nixpkgs/nixos/lib/eval-config.nix>;
# Evaluate the config,
paths = (eval {modules = [(import <nixos-config>)];})
# then get the `nixpkgs.overlays` option.
.config.nixpkgs.overlays
;
in
foldl' (flip extends) (_: super) paths self
/etc/nixos/overlays-compat/caddy.nix
:
self: super:
{
caddy = super.caddy.override {
name = "caddy-override";
};
}
попытка наложения 2
/etc/nixos/configuration.nix
:
nixpkgs.overlays = [ (self: super: {
caddy = super.caddy.override {
name = "caddy-override";
};
} ) ];
error: anonymous function at /nix/store/mr5sfmz6lm5952ch5q6v49563wzylrkx-nixos-18.09.2327.37694c8cc0e/nixos/pkgs/servers/caddy/default.nix:1:1 called with unexpected argument 'name', at /nix/store/mr5sfmz6lm5952ch5q6v49563wzylrkx-nixos-18.09.2327.37694c8cc0e/nixos/lib/customisation.nix:69:12
overrideAttrs
Ранее мне удалось переопределить имя пакета следующим образом:
{ config, pkgs, options, ... }:
let
caddyOverride = pkgs.caddy.overrideAttrs (oldAttrs: rec {
name = "caddy-override-v${oldAttrs.version}";
});
in {
{
# ...
services.caddy = {
package = caddyOverride;
# ...
}
}
Я видел в htop, что бинарный файл caddy находился в папке с именем /nix/store/...-caddy-override-v0.11.0-bin/
.Но я понимаю, что переопределение таким образом было заменено наложениями.