1
0
Fork 1
mirror of https://github.com/NixOS/nixpkgs.git synced 2025-06-10 18:12:34 +09:00

devmode: make reusable

the `devmode` helper made for the Nixpkgs/NixOS manual was exposed wrapped
in `mkShell`, which made it impossible to reuse.

this change strips that wrapper and reproduces it at the call site.

now one can use `devmode` from anywhere Nixpkgs is available:

    devmode = pkgs.callPackage "${pkgs.path}/pkgs/tools/nix/web-devmode.nix" {
      buildArgs = toString ./.;
      open = "/index.html";
    };
This commit is contained in:
Valentin Gagarin 2024-11-08 18:40:27 +01:00
parent 9d48107bcc
commit b94f54b7a0
3 changed files with 55 additions and 51 deletions

View file

@ -5,6 +5,7 @@
lib, lib,
stdenvNoCC, stdenvNoCC,
callPackage, callPackage,
mkShellNoCC,
documentation-highlighter, documentation-highlighter,
nixos-render-docs, nixos-render-docs,
nixpkgs ? { }, nixpkgs ? { },
@ -95,10 +96,14 @@ stdenvNoCC.mkDerivation (
pythonInterpreterTable = callPackage ./python-interpreter-table.nix { }; pythonInterpreterTable = callPackage ./python-interpreter-table.nix { };
shell = callPackage ../../pkgs/tools/nix/web-devmode.nix { shell =
buildArgs = "./."; let
open = "/share/doc/nixpkgs/manual.html"; devmode = callPackage ../../pkgs/tools/nix/web-devmode.nix {
}; buildArgs = "./.";
open = "/share/doc/nixpkgs/manual.html";
};
in
mkShellNoCC { packages = [ devmode ]; };
tests.manpage-urls = callPackage ../tests/manpage-urls.nix { }; tests.manpage-urls = callPackage ../tests/manpage-urls.nix { };
}; };

View file

@ -6,8 +6,11 @@ let
common = import ./common.nix; common = import ./common.nix;
inherit (common) outputPath indexPath; inherit (common) outputPath indexPath;
devmode = pkgs.callPackage ../../../pkgs/tools/nix/web-devmode.nix {
buildArgs = "../../release.nix -A manualHTML.${builtins.currentSystem}";
open = "/${outputPath}/${indexPath}";
};
in in
pkgs.callPackage ../../../pkgs/tools/nix/web-devmode.nix { pkgs.mkShellNoCC {
buildArgs = "../../release.nix -A manualHTML.${builtins.currentSystem}"; packages = [ devmode ];
open = "/${outputPath}/${indexPath}";
} }

View file

@ -1,22 +1,22 @@
{ {
lib, lib,
findutils, findutils,
mkShell,
nodejs_latest, nodejs_latest,
parallel, parallel,
rsync, rsync,
watchexec, watchexec,
writeShellScriptBin, writeShellScriptBin,
# arguments to `nix-build`, e.g. `"foo.nix -A bar"` # arguments to `nix-build`, e.g. `"foo.nix -A bar"`
buildArgs, buildArgs ? "",
# what path to open a browser at # what path to open a browser at
open, open ? "/index.html",
}: }:
let let
inherit (nodejs_latest.pkgs) live-server; inherit (nodejs_latest.pkgs) live-server;
error_page = writeShellScriptBin "error_page" '' error-page = writeShellScriptBin "error-page" ''
echo "<!DOCTYPE html> cat << EOF
<!DOCTYPE html>
<html> <html>
<head> <head>
<style> <style>
@ -26,7 +26,8 @@ let
</style> </style>
</head> </head>
<body><pre>$1</pre></body> <body><pre>$1</pre></body>
</html>" </html>
EOF
''; '';
# The following would have been simpler: # The following would have been simpler:
@ -38,7 +39,7 @@ let
# Using rsync here, instead of `cp`, to get as close to an atomic # Using rsync here, instead of `cp`, to get as close to an atomic
# directory copy operation as possible. `--delay-updates` should # directory copy operation as possible. `--delay-updates` should
# also go towards that. # also go towards that.
build_and_copy = writeShellScriptBin "build_and_copy" '' build-and-copy = writeShellScriptBin "build-and-copy" ''
set -euxo pipefail set -euxo pipefail
set +e set +e
@ -49,7 +50,7 @@ let
if [ $exit_status -eq 0 ]; if [ $exit_status -eq 0 ];
then then
# setting permissions to be able to clean up # setting permissions to be able to clean up
${lib.getBin rsync}/bin/rsync \ ${lib.getExe rsync} \
--recursive \ --recursive \
--chmod=u=rwX \ --chmod=u=rwX \
--delete-before \ --delete-before \
@ -58,10 +59,10 @@ let
$serve/ $serve/
else else
set +x set +x
${lib.getBin error_page}/bin/error_page "$stderr" > $error_page_absolute ${lib.getExe error-page} "$stderr" > $error_page_absolute
set -x set -x
${lib.getBin findutils}/bin/find $serve \ ${lib.getExe findutils} $serve \
-type f \ -type f \
! -name $error_page_relative \ ! -name $error_page_relative \
-delete -delete
@ -72,20 +73,20 @@ let
watcher = writeShellScriptBin "watcher" '' watcher = writeShellScriptBin "watcher" ''
set -euxo pipefail set -euxo pipefail
${lib.getBin watchexec}/bin/watchexec \ ${lib.getExe watchexec} \
--shell=none \ --shell=none \
--restart \ --restart \
--print-events \ --print-events \
${lib.getBin build_and_copy}/bin/build_and_copy ${lib.getExe build-and-copy}
''; '';
# A Rust alternative to live-server exists, but it was not in nixpkgs. # A Rust alternative to live-server exists, but it fails to open the temporary directory.
# `--no-css-inject`: without this it seems that only CSS is auto-reloaded. # `--no-css-inject`: without this it seems that only CSS is auto-reloaded.
# https://www.npmjs.com/package/live-server # https://www.npmjs.com/package/live-server
server = writeShellScriptBin "server" '' server = writeShellScriptBin "server" ''
set -euxo pipefail set -euxo pipefail
${lib.getBin live-server}/bin/live-server \ ${lib.getExe' live-server "live-server"} \
--host=127.0.0.1 \ --host=127.0.0.1 \
--verbose \ --verbose \
--no-css-inject \ --no-css-inject \
@ -93,34 +94,29 @@ let
--open=${open} \ --open=${open} \
$serve $serve
''; '';
devmode = writeShellScriptBin "devmode" ''
set -euxo pipefail
function handle_exit {
rm -rf "$tmpdir"
}
tmpdir=$(mktemp -d)
trap handle_exit EXIT
export out_link="$tmpdir/result"
export serve="$tmpdir/serve"
mkdir $serve
export error_page_relative=error.html
export error_page_absolute=$serve/$error_page_relative
${lib.getBin error_page}/bin/error_page "building " > $error_page_absolute
${lib.getBin parallel}/bin/parallel \
--will-cite \
--line-buffer \
--tagstr '{/}' \
::: \
"${lib.getBin watcher}/bin/watcher" \
"${lib.getBin server}/bin/server"
'';
in in
mkShell { writeShellScriptBin "devmode" ''
name = "web-devmode"; set -euxo pipefail
packages = [ devmode ];
} function handle_exit {
rm -rf "$tmpdir"
}
tmpdir=$(mktemp -d)
trap handle_exit EXIT
export out_link="$tmpdir/result"
export serve="$tmpdir/serve"
mkdir $serve
export error_page_relative=error.html
export error_page_absolute=$serve/$error_page_relative
${lib.getExe error-page} "building " > $error_page_absolute
${lib.getExe parallel} \
--will-cite \
--line-buffer \
--tagstr '{/}' \
::: \
"${lib.getExe watcher}" \
"${lib.getExe server}"
''