Le paquet Discourse échoue à être construit via nix-shell

J’ai tenté de télécharger et de compiler le paquet nix de Discourse, mais cela a échoué en raison d’une erreur de dépendance pnpm apparente :

 ERR_PNPM_INVALID_DEPENDENCY_NAME  Refusing to place a dependency under /build/source/frontend/discourse-types/node_modules with the invalid alias "@types/@glimmer__component"

ERROR: pnpm failed to install dependencies

If you see ERR_PNPM_NO_OFFLINE_TARBALL above this, follow these to fix the issue:
1. Set pnpmDeps.hash to "" (empty string)
2. Build the derivation and wait for it to fail with a hash mismatch
3. Copy the 'got: sha256-' value back into the pnpmDeps.hash field

If you see ERR_PNPM_LOCKFILE_CONFIG_MISMATCH above this, try changing the pnpm version
Found 'pnpm' with version '10.34.4'

error: Cannot build '/nix/store/k90f0nxqhlyb1bym9lg5xl6pfjz4vamf-discourse-assets-2026.1.4.drv'.
       Reason: builder failed with exit code 1.
       Output paths:
         /nix/store/biwwabb1xl58v4ywqmmc7d4vm0sl78q3-discourse-assets-2026.1.4-node_modules
         /nix/store/jsbd94c63h63yq5xvrp27m5l1sg6667c-discourse-assets-2026.1.4-generated
         /nix/store/n278iw1v8kzswvwm8f6n6g15gkw6wb0q-discourse-assets-2026.1.4-frontend
         /nix/store/qnxglj6z2n8fn46af9rp7161634brcgk-discourse-assets-2026.1.4
       Last 25 log lines:
       > Progress: resolved 1909, reused 1263, downloaded 0, added 0
       > Progress: resolved 1909, reused 1907, downloaded 0, added 65
       > Progress: resolved 1909, reused 1909, downloaded 0, added 435
       > Progress: resolved 1909, reused 1909, downloaded 0, added 530
       > Progress: resolved 1909, reused 1909, downloaded 0, added 672
       > Progress: resolved 1909, reused 1909, downloaded 0, added 838
       > Progress: resolved 1909, reused 1909, downloaded 0, added 1036
       > Progress: resolved 1909, reused 1909, downloaded 0, added 1175
       > Progress: resolved 1909, reused 1909, downloaded 0, added 1464
       > Progress: resolved 1909, reused 1909, downloaded 0, added 1767
       > Progress: resolved 1909, reused 1909, downloaded 0, added 1907
       > Progress: resolved 1909, reused 1909, downloaded 0, added 1908
       > Progress: resolved 1909, reused 1909, downloaded 0, added 1909, done
       >  ERR_PNPM_INVALID_DEPENDENCY_NAME  Refusing to place a dependency under /build/source/frontend/discourse-types/node_modules with the invalid alias "@types/@glimmer__component"
       >
       > ERROR: pnpm failed to install dependencies
       >
       > If you see ERR_PNPM_NO_OFFLINE_TARBALL above this, follow these to fix the issue:
       > 1. Set pnpmDeps.hash to "" (empty string)
       > 2. Build the derivation and wait for it to fail with a hash mismatch
       > 3. Copy the 'got: sha256-' value back into the pnpmDeps.hash field
       >
       > If you see ERR_PNPM_LOCKFILE_CONFIG_MISMATCH above this, try changing the pnpm version
       > Found 'pnpm' with version '10.34.4'
       >
       For full logs, run:
         nix log /nix/store/k90f0nxqhlyb1bym9lg5xl6pfjz4vamf-discourse-assets-2026.1.4.drv
error: Cannot build '/nix/store/9n8grwvci4gd2c64i9wm5ggw5v4r63xf-discourse-2026.1.4.drv'.
       Reason: 1 dependency failed.
       Output paths:
         /nix/store/l9xhbd5scihfln5jr9vh1c6l4xznaall-discourse-2026.1.4
error: Build failed due to failed dependency

Je n’ai pas vraiment vu ce problème signalé ailleurs et j’ai pensé que vous pourriez aimer en être informés.

Le problème, c’est que seuls Debian/Ubuntu sont pris en charge, pas Nix. Est-ce pour un environnement de développement ou pour la production ?

Il s’agit simplement de télécharger le paquet Discourse depuis nixpkgs en utilisant le gestionnaire de paquets Nix. Les dérivations fonctionnent essentiellement en clonant et en compilant un paquet directement depuis le code source.

J’installais simplement un paquet de manière éphémère, comme je le ferais pour n’importe quel autre paquet NixOS. Ce n’était pas spécifiquement pour du développement ou de la production ; je voulais surtout voir si je pouvais utiliser Discourse en ligne de commande. Mon navigateur TUI n’affichait pas certains éléments de l’interface, alors j’ai pensé tester le paquet Nix pour voir si l’expérience utilisateur serait plus adaptée.

J’ai essayé un téléchargement/compilation simple via Nix et j’ai obtenu l’erreur mentionnée ci-dessus.

Intéressant. Je pense que ce paquet n’est pas officiellement maintenu par Discourse. Un coup d’œil rapide aux Mainteneurs ne liste aucun membre de l’équipe Discourse que je connais. De plus, aucune Documentation à ce sujet, à ma connaissance.

Pour référence : ce plugin, je pense

ah oui, ce sont les mainteneur(s) de nixpkg

la source réelle se trouve dans le bloc `let in`

ligne 55 :

let
  version = "2026.1.4";

  src = fetchFromGitHub {
    owner = "discourse";
    repo = "discourse";
    rev = "v${version}";
    sha256 = "sha256-kQYDKZIMsWByuCZQfUlwhoIew5QykVylRMh6xvrHIBY=";
  };
in
# ...

donc cela provient de `discourse/discourse`, le reste de la dérivation consiste essentiellement en des étapes de compilation, où placer les fichiers, comment gérer certaines erreurs de compilation, etc.

ce paramètre `src` agit un peu comme une variable, car il est propagé tout au long du reste de la dérivation

Donc, il n’est pas nécessaire de s’engager sur une installation complète de NixOS pour tester cela.

Le gestionnaire de paquets Nix est disponible sur pratiquement n’importe quelle machine.

`nix-shell -p discourse`

où `nix-shell` démarre un shell dans lequel les paquets spécifiés via `-p` sont désormais disponibles sur le système. Une fois le shell fermé, ces paquets ne sont plus installés.

Je n’ai pas d’analogie avec apt pour décrire Nix en tant que concept, mais si l’eau prend la forme de son récipient, Nix est un conteneur qui se façonne pour s’adapter à son contenu. Le problème que `nix` cherche à résoudre est le « ça marche sur ma machine » : si le logiciel se compile et fonctionne, il se compilera et fonctionnera via Nix.

Je fais un test pour voir si ce fil a été verrouillé, car je ne vois pas l’une de mes dernières modifications.

Peut-être que la modification doit être approuvée pour s’afficher dans le message.

Le fil n’est pas verrouillé et nous apprécions le sujet tout en apprenant. Merci pour ta contribution et bienvenue sur Meta :+1:

pas de souci ! merci pour la précision.

La raison pour laquelle je soupçonnais un processus de validation, c’est que j’avais effectué cette modification et que je ne la voyais pas apparaître de mon côté :

Je ne vois toujours que le texte sur le côté gauche

E : ça vient de s’afficher

Merci pour le signalement ! J’ai vérifié, et il s’agit apparemment d’un décalage de version de pnpm dans le paquet Nix, plutôt que d’un problème avec l’empreinte de dépendance.

Discourse v2026.1.4 déclare pnpm@10.28.0, tandis que l’expression Nix utilise le paquet pnpm_10 mobile, qui se résout actuellement en 10.34.4. Cette version plus récente de pnpm rejette certains alias de dépendances utilisés par cette version de Discourse.

La correction probable dans Nixpkgs consisterait à épingler la dérivation à une version de pnpm plus ancienne et compatible, possiblement le paquet existant pnpm_10_29_2, ou exactement 10.28.0, et de mettre à jour pnpmDeps.hash si nécessaire.

Étant donné que le paquet Nix est maintenu par la communauté, cette correction devra être apportée dans Nixpkgs, mais cela devrait aider les mainteneurs à identifier la bonne direction.

J’ai peut-être été un peu trop pressé de marquer ce sujet comme résolu, car je n’ai pas réellement testé, lol.

Nixpkgs permet d’utiliser des overlays et des overrides sur ses paquets localement. Je peux essayer d’implémenter moi-même ces modifications dans la dérivation quand j’aurai un peu de temps, et je vous ferai un retour sur mes résultats.

Voici où j’en suis :

let
  nixpkgs = fetchTarball "https://github.com/NixOS/nixpkgs/tarball/nixos-26.05";
  pkgs = import nixpkgs {
    config = { };
    overlays = with pkgs; [
      (final: prev: {
        discourse = prev.discourse.override (oa: {
          pnpm_10 = oa.pnpm_10.overrideAttrs (_: {
            src = fetchFromGitHub {
              owner = "pnpm";
              repo = "pnpm";
              rev = "ea870c786fc74c99bf9de644c78453b4d25a7d59";
              hash = "sha256-g+TjAW1SGuEXh04RnGZOQTLkJTHs/3zyCp/P+MzBn4c=";
            };
          });
        });

      })
    ];
  };
in

pkgs.mkShellNoCC {
  packages = with pkgs; [
    # for debug
    discourse
  ];
}

erreur :

Running phase: unpackPhase
unpacking source archive /nix/store/ci631zzm890b2dzsrxxxrg15qpbac6jy-source
source root is source
rm: cannot remove 'package/dist/vendor': No such file or directory
error: Cannot build '/nix/store/lq23pl8ycyf8myl9mynwzx9a2f2miywv-pnpm-10.34.0.drv'.
       Reason: builder failed with exit code 1.
       Output paths:
         /nix/store/kf62vww5jdfpr32qgxhz4qv9dkfdb0pf-pnpm-10.34.0
       Last 5 log lines:
       > structuredAttrs is enabled
       > Running phase: unpackPhase
       > unpacking source archive /nix/store/ci631zzm890b2dzsrxxxrg15qpbac6jy-source
       > source root is source
       > rm: cannot remove 'package/dist/vendor': No such file or directory
       For full logs, run:
         nix log /nix/store/lq23pl8ycyf8myl9mynwzx9a2f2miywv-pnpm-10.34.0.drv
error: Cannot build '/nix/store/1hi18g4r0gmmlnj059irx91grry7ymv7-discourse-assets-2026.1.4.drv'.
       Reason: 1 dependency failed.
       Output paths:
         /nix/store/bw2pzh74fbp0wkn9f4b2bf2p6lwcva3d-discourse-assets-2026.1.4
         /nix/store/kqnrdh18f4pn87rpzk2af0d18xcvbj7k-discourse-assets-2026.1.4-generated
         /nix/store/mcbvqw0y8r3as9zrjmrq7pc32n64bj2r-discourse-assets-2026.1.4-frontend
         /nix/store/my9x48zhzzqi2w8rriww6qm4v9iaxxhx-discourse-assets-2026.1.4-node_modules
error: Cannot build '/nix/store/05ffysx25hfzw34km225d2krpnifwj75-discourse-2026.1.4.drv'.
       Reason: 1 dependency failed.
       Output paths:
         /nix/store/2b1pvnvln95dx7rxr88kc5b9g24x45dr-discourse-2026.1.4

Apparemment, les journaux affichent simplement le mauvais build, comme si je ne l’avais pas surchargé, ce qui est d’une aide précieuse. Il se plaint qu’un fichier package/dist/vendor ne soit pas créé.

Oui, c’est probablement une affaire à laisser aux mainteneurs.

nixpkgs proposait une version de Discourse plutôt obsolète, datant de janvier, j’ai donc ouvert une PR pour la mettre à jour. Je n’ai jamais contribué à nixpkgs, on verra bien comment ça se passe.

@fuguesoft il semble qu’ils aient intégré le nixpkg de Discourse mis à jour, si tu veux essayer.