Сборка пакета Discourse через nix-shell завершается с ошибкой

Я попытался скачать и собрать пакет Discourse для Nix, но это не удалось из-за ошибки, связанной с зависимостями pnpm:

 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

Я нигде не видел этой проблемы и подумал, что вам, возможно, будет полезно об этом знать.

Дело в том, что поддерживаются только Debian/Ubuntu, а Nix — нет. Это для среды разработки или для продакшена?

Это просто загрузка пакета Discourse из nixpkgs с помощью пакетного менеджера Nix. Деривации работают, по сути, клонируя и собирая пакет непосредственно из исходного кода.

Я просто временно устанавливал пакет, как и любой другой в NixOS. Не специально для разработки или продакшена, а просто хотел проверить, можно ли использовать Discourse через командную строку. Мой текстовый браузер не отображал некоторые элементы интерфейса, поэтому я решил протестировать пакет из nixpkgs и посмотреть, будет ли пользовательский опыт более удобным.

Попытался выполнить простую загрузку/сборку через Nix и получил aforementioned ошибку.

Интересно. Я полагаю, что этот пакет не является официальным продуктом Discourse. Быстрый взгляд на список сопровождающих (Maintainers) не показывает ни одного члена команды Discourse, о котором я слышал. Кроме того, насколько мне известно, нет никакой #документации по этому поводу.

Для справки: я думаю, речь об этом плагине

ага, это как раз сопровождающий(ие) nixpkg

сам исходный код находится в блоке `let in`

строка 55:

let
  version = "2026.1.4";

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

так что он берет данные из `discourse/discourse`, а остальная часть деривации — это по сути шаги сборки: куда поместить файлы, как обработать определенные ошибки сборки и т.д.

этот параметр `src` работает как переменная, которая передается дальше по всей деривации

Так что для проверки этого не нужно устанавливать полноценный nixOS.

Пакетный менеджер nix доступен практически на любой машине.

`nix-shell -p discourse`

Здесь `nix-shell` запускает оболочку, в которой указанные пакеты (`-p`) становятся доступными в системе. Как только оболочка закрывается, эти пакеты больше не установлены.

У меня нет аналогии из apt, чтобы описать nix как концепцию, но если вода принимает форму своего сосуда, то nix — это сосуд, который принимает форму своего содержимого. Проблема, которую решает `nix`, — это «работает на моей машине»: если программное обеспечение компилируется и запускается, то через nix оно будет компилироваться и запускаться.

Проверяю, не заблокирована ли эта тема, так как я не вижу одного из своих последних изменений.

Возможно, для отображения в сообщении изменение нужно утвердить.

Тема не закрыта, и мы с удовольствием обсуждаем её и учимся. Спасибо за ваш вклад и добро пожаловать в Meta :+1:

без проблем! спасибо за разъяснение.

Я заподозрил наличие процесса согласования, потому что внёс это изменение, но оно не отобразилось у меня:

Я по-прежнему вижу только текст слева.

P.S.: только что появилось

Спасибо за отчёт! Я посмотрел, и это, похоже, не проблема с хэшем зависимостей, а несовпадение версий pnpm в пакете Nix.

Discourse v2026.1.4 указывает pnpm@10.28.0, в то время как выражение Nix использует пакет pnpm_10, версия которого постоянно меняется и в данный момент соответствует 10.34.4. Эта более новая версия pnpm отклоняет некоторые псевдонимы зависимостей, используемые в этом выпуске Discourse.

Скорее всего, исправление в Nixpkgs будет заключаться в закреплении версии pnpm в деривации на более старую совместимую, возможно, на уже существующем пакете pnpm_10_29_2, или точно на 10.28.0, с последующим обновлением pnpmDeps.hash при необходимости.

Поскольку пакет Nix поддерживается сообществом, это исправление нужно будет внести в Nixpkgs, но, надеюсь, это укажет сопровождающим правильное направление.

Я, возможно, преждевременно пометил это как решённое, так как я ещё не проверил это на практике, хах.

Nixpkgs позволяет использовать оверлеи и переопределения его пакетов локально. Я могу попробовать самостоятельно внести эти изменения в деривацию, когда у меня появится время, и отчитаться о результатах.

Вот на чём я застрял:

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
  ];
}

ошибка:

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

Похоже, логи просто показывают неправильную сборку, как будто я её не переопределял, что очень помогает. Он ругается на то, что какой-то файл package/dist/vendor не был создан.

ну, это, наверное, то, чем лучше заняться мейнтейнерам

В nixpkgs была довольно устаревшая версия Discourse от января, поэтому я открыл PR для её обновления. Я никогда раньше не вносил вклад в nixpkgs, так что посмотрим, как всё пойдёт.

@fuguesoft похоже, они объединили обновлённый nixpkg для Discourse, если хочешь попробовать