nix-shell을 통해 Discourse 패키지가 빌드되지 않음

discourse nixpkg를 다운로드하고 빌드하려고 했지만, 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는 지원되지 않는다는 점입니다. 개발 환경용인가요, 아니면 프로덕션 환경용인가요?

이것은 단순히 nix 패키지 매니저를 사용하여 nixpkgs에서 discourse 패키지를 다운로드하는 것입니다. Derivations는 기본적으로 소스에서 패키지를 직접 복제하고 빌드하는 방식으로 작동합니다.

저는 단순히 다른 nixOS 패키지와 마찬가지로 일시적으로 패키지를 설치한 것뿐입니다. 개발이나 프로덕션을 위한 것이 아니라, 실제로 discourse를 CLI에서 사용할 수 있는지 확인해 보고 싶었습니다. 제 TUI 브라우저가 UI의 일부가 표시되지 않아서, nixpkg를 테스트 드라이브 해 보고 UX가 더 나은지 확인해 보기로 했습니다.

nix로 간단한 다운로드/빌드를 시도했는데 aforementioned 오류가 발생했습니다.

흥미롭네요. 이 패키지는 공식적으로 Discourse에서 나온 것이 아닌 것 같습니다. Maintainers 목록을 빠르게 살펴봤는데, 제가 아는 Discourse 팀 멤버는 하나도 없었습니다. 또한, 제 지대한 범위 내에서 이 패키지에 대한 #documentation도 없습니다.

참고: 이 플러그인을 말하는 것 같습니다

아 네, 그게 nixpkg 유지보수자(들)입니다.

실제 소스는 let in 블록 안에 있습니다.

55번째 줄:

let
  version = "2026.1.4";

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

즉, https://github.com/discourse/discourse에서 소스를 가져와서 버전 2026.1.4를 빌드하는 것입니다. 나머지 derivation은 기본적으로 빌드 단계, 파일을 어디에 둘 것인지, 특정 빌드 오류를 어떻게 처리할 것인지 등입니다 …

src 파라미터는 일종의 변수와 비슷해서, 나머지 derivation 전체로 전파됩니다.

또한 이 기능을 테스트하기 위해 전체 nixOS에 커밋할 필요가 없습니다.

nix 패키지 매니저는 거의 모든 머신에서 사용할 수 있습니다.

nix-shell -p discourse

여기서 nix-shell은 지정된 패키지(-p 옵션으로 지정)가 시스템에서 사용 가능하도록 셸을 시작합니다. 셸을 닫으면 해당 패키지는 더 이상 설치되지 않습니다.

nix의 개념을 apt와 비교하여 설명할 적절한 비유는 없지만, 물이 그릇의 모양에 맞춰지는 것처럼 nix는 그 내용물에 맞춰 스스로 형태를 바꾸는 그릇이라고 할 수 있습니다. nix가 해결하고자 하는 문제는 "내 컴퓨터에서는 동작한다"는 현상입니다. 즉, 소프트웨어가 컴파일되고 실행된다면, nix를 통해서는 항상 컴파일되고 실행됩니다.

이 스레드가 잠겨 있는지 확인하려고 합니다. 최근 수정한 내용 중 하나가 보이지 않아서요.

아마도 게시글에 표시되려면 수정 내용이 승인되어야 하는 것 같습니다.

쓰레드는 잠겨 있지 않으며, 우리는 이 주제를 즐기고 배우고 있습니다. 기여해 주셔서 감사드리며, 메타에 오신 것을 환영합니다. :+1:

걱정 마세요! 설명해 주셔서 감사합니다.

승인 과정이 있다는 것을 의심했던 이유는 제가 이 편집을 했는데 제 화면에는 나타나지 않았기 때문입니다:

여전히 왼쪽에 텍스트만 보입니다

E: 방금 나타났네요

리포트 감사합니다! 확인해 본 결과, 이는 의존성 해시 문제보다는 Nix 패키지에서 pnpm 버전 불일치로 보입니다.

Discourse v2026.1.4pnpm@10.28.0을 선언하고 있지만, 해당 Nix 표현식은 현재 10.34.4로 해석되는 이동하는 pnpm_10 패키지를 사용하고 있습니다. 이 더 새로운 pnpm 버전은 해당 Discourse 릴리스에서 사용되는 일부 의존성 별명을 거부합니다.

Nixpkgs의 가능한 수정 방법은 파생(derivation)을 기존 pnpm_10_29_2 패키지나 정확히 10.28.0과 같은 더 오래된 호환 가능한 pnpm 버전으로 고정하는 것입니다. 필요에 따라 pnpmDeps.hash도 업데이트해야 할 수 있습니다.

Nix 패키지는 커뮤니티에서 관리되므로 이 수정은 Nixpkgs에서 이루어져야 하지만,hopefully 이 정보가 유지보수자들에게 올바른 방향을 제시해 줄 것으로 기대합니다.

아직 실제로 테스트를 해보지 않았는데도 해결로 표시한 건 좀 성급했네요, 하하.

Nixpkgs는 로컬에서 패키지 오버레이와 오버라이드를 지원합니다. 시간이 나면 해당 변경 사항을 내보출(derivation)에 직접 적용해 보고 결과를 공유하겠습니다.

여기까지 진행했습니다:

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에는 1월 기준으로 꽤 오래된 버전의 Discourse가 포함되어 있어서 업데이트를 위한 PR을 열었습니다. nixpkgs에 기여한 적이 없어서 어떻게 될지 지켜봐야겠습니다.

@fuguesoft 업데이트된 Discourse nixpkg가 병합된 것 같습니다. 시도해 보시려면 참고해 주세요.