nodejs безголовый-gl null в nixos

#node.js #webgl #nixos

Вопрос:

У меня есть эта оболочка.никс:

 with import <nixpkgs> {};
stdenv.mkDerivation {
  name = "env";
  nativeBuildInputs = [ pkg-config ];
  buildInputs = [
    xorg.libX11
    xorg.libX11.dev
    xorg.libXi
    xorg.libXext
    libGL
  ];
}
 

Затем я вхожу в оболочку с nix-shell shell.nix и

 $ npm install gl
 

Я думаю, он строится правильно.

Я создал index.js с примером из домашней страницы проекта README

 // Create context
var width   = 64
var height  = 64
var gl = require('gl')(width, height, { preserveDrawingBuffer: true })

//Clear screen to red
gl.clearColor(1, 0, 0, 1)
gl.clear(gl.COLOR_BUFFER_BIT)

//Write output as a PPM formatted image
var pixels = new Uint8Array(width * height * 4)
gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels)
process.stdout.write(['P3n# gl.ppmn', width, " ", height, 'n255n'].join(''))

for(var i = 0; i < pixels.length; i  = 4) {
  for(var j = 0; j < 3;   j) {
    process.stdout.write(pixels[i   j]   ' ')
  }
}
 

когда я запускаю это:

 $ node index.js
 

Я получил ошибку:

 /home/roman/personal_projects/nixos/nixos-headless-gl-error-no-webgl/index.js:20
gl.clearColor(1, 0, 0, 1)
   ^

TypeError: Cannot read property 'clearColor' of null
    at Object.<anonymous> (/home/roman/personal_projects/nixos/nixos-headless-gl-error-no-webgl/index.js:20:4)
    at Module._compile (internal/modules/cjs/loader.js:1085:14)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)
    at Module.load (internal/modules/cjs/loader.js:950:32)
    at Function.Module._load (internal/modules/cjs/loader.js:790:12)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:76:12)
    at internal/main/run_main_module.js:17:47
 

Ответ №1:

Работает. Теперь я сбежал.никс:

 with import <nixpkgs> {};
stdenv.mkDerivation {
  name = "env";
  APPEND_LIBRARY_PATH = "${lib.makeLibraryPath [ libGL libuuid ]}";
  shellHook = ''
    export LD_LIBRARY_PATH="$APPEND_LIBRARY_PATH:$LD_LIBRARY_PATH"
  '';
}
 

и nix-shell run.nix и

 $ nix-shell run.nix
$ echo $LD_LIBRARY_PATH | tr ':' 'n'
/nix/store/hwnjiqml5vvlngdj9nrnwg0qzglhgk2r-util-linux-2.36.2/lib
/nix/store/c35w5n0prvq4v4priyi8fiiq361pmyvp-libGL-1.3.3/lib
/nix/store/a1xkyw98lgj38kymim78a7xjk50wqg6k-telepathy-glib-0.24.2/lib
/nix/store/nzp3cc7bsj83dn23b4vvrvsp9psgg50m-telepathy-logger-0.8.2/lib
$ node index.js
P3
# gl.ppm
64 64
255
255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 
...
 

Комментарии:

1. Атрибуты не интерполируются оболочкой, поэтому $LD_LIBRARY_PATH дословно описываются в вашей среде. Вы можете удалить его (если это не нужно пользователям этого expr) или преобразовать в export инструкцию shellHook , которая выполняется как обычная bash, включая интерполяцию.