在 nix 派生中覆盖脚本
Override scripts in nix derivations
有没有一种方法可以覆盖现有派生中的脚本 and/or 配置,而无需重新编译整个包?
我想创建一个修改过 $out/share/gnome-session/sessions/gnome.session
的新版本的 gnome-session。使用 overridePackage
我可以更改 preFixup
阶段,但这会导致重新编译整个 gnome-session 包。
解决问题的一个简单方法是创建一个没有任何来源的新推导。诀窍是创建指向基本派生中每个文件和目录的链接,但需要修改的任何文件除外。这些文件是根据需要明确处理的。
下面的代码片段展示了如何使用 xmonad 而不是 gnome-shell 创建一个新的 gnome-session。
{ 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 ];
}
有没有一种方法可以覆盖现有派生中的脚本 and/or 配置,而无需重新编译整个包?
我想创建一个修改过 $out/share/gnome-session/sessions/gnome.session
的新版本的 gnome-session。使用 overridePackage
我可以更改 preFixup
阶段,但这会导致重新编译整个 gnome-session 包。
解决问题的一个简单方法是创建一个没有任何来源的新推导。诀窍是创建指向基本派生中每个文件和目录的链接,但需要修改的任何文件除外。这些文件是根据需要明确处理的。
下面的代码片段展示了如何使用 xmonad 而不是 gnome-shell 创建一个新的 gnome-session。
{ 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 ];
}