nix派生中的重写脚本

nix派生中的重写脚本,nix,nixos,Nix,Nixos,有没有一种方法可以覆盖现有派生中的脚本和/或配置,而不必重新编译整个包 我想创建一个新版本的gnome会话,修改了$out/share/gnome session/sessions/gnome.sessionmodified。使用overridePackage我可以更改preFixup阶段,但这会导致重新编译整个gnome会话包。问题的一个简单解决方案是创建一个没有任何源的新派生。诀窍是创建指向基本派生中每个文件和目录的链接,需要修改的文件除外。这些文件是根据需要显式处理的 下面的代码片段展示了

有没有一种方法可以覆盖现有派生中的脚本和/或配置,而不必重新编译整个包


我想创建一个新版本的gnome会话,修改了
$out/share/gnome session/sessions/gnome.session
modified。使用
overridePackage
我可以更改
preFixup
阶段,但这会导致重新编译整个gnome会话包。

问题的一个简单解决方案是创建一个没有任何源的新派生。诀窍是创建指向基本派生中每个文件和目录的链接,需要修改的文件除外。这些文件是根据需要显式处理的

下面的代码片段展示了如何使用xmonad而不是gnomeshell创建新的gnome会话

{ nixpkgs ? import <nixpkgs> {} }:
let
  inherit (nixpkgs) pkgs;  
in
  pkgs.stdenv.mkDerivation {
    name = "gnome-session";
    builder = pkgs.writeText "builder.sh" ''
      # source standard environment
      . $stdenv/setup

      # shorthands
      refpkg=${pkgs.gnome3.gnome_session}
      file=share/gnome-session/sessions/gnome.session

      # create output dirs for new derivation
      mkdir -p $out/share
      mkdir -p $out/share/gnome-session/sessions

      # link unchanged files from the original gnome-session 
      ln -sf $refpkg/bin $out
      ln -sf $refpkg/libexec $out
      find $refpkg/share -maxdepth 1 \
        -not -name gnome-session -exec ln -sf {} $out/share \;

     # change gnome-shell to xmonad
      sed 's/org.gnome.Shell/xmonad/' $refpkg/$file > $out/$file
    '';
     # make sure gnome-session is installed before deriving it!
    buildInputs = [ pkgs.gnome3.gnome_session ];
  }
{nixpkgs?导入{}}
让
继承(nixpkgs)pkgs;
在里面
pkgs.stdenv.mk{
name=“gnome会话”;
builder=pkgs.writeText“builder.sh”
#源标准环境
.$stdenv/设置
#速记
refpkg=${pkgs.gnome3.gnome_session}
file=share/gnome session/sessions/gnome.session
#为新派生创建输出目录
mkdir-p$out/股
mkdir-p$out/share/gnome会话/会话
#链接原始gnome会话中未更改的文件
ln-sf$refpkg/bin$out
ln-sf$refpkg/libexec$out
查找$refpkg/共享-最大深度1\
-not-name gnome session-exec ln-sf{}$out/share\;
#将gnome外壳更改为xmonad
sed's/org.gnome.Shell/xmonad/'$refpkg/$file>$out/$file
'';
#在派生gnome会话之前,请确保已安装gnome会话!
buildInputs=[pkgs.gnome3.gnome_session];
}