LINUX.ORG.RU

Nixos: установка vot

 


0

1

cat overlay/vot/default.nix

{ buildNpmPackage, fetchurl, lib, nodejs, cacert }:

buildNpmPackage rec {
  pname = "vot-cli";
  version = "1.4.3";

  src = fetchurl {
    url = "https://registry.npmjs.org/${pname}/-/${pname}-${version}.tgz";
    hash = "sha256-eOUfy6l48MD9IcWiFlC142vXvo5XobKTJ2uC6xzDGS4=";
  };

  nativeBuildInputs = [ cacert ];

  postPatch = ''
    export HOME=$TMPDIR
    export SSL_CERT_FILE=${cacert}/etc/ssl/certs/ca-bundle.crt
    ${nodejs}/bin/npm install --package-lock-only --no-audit --no-fund --ignore-scripts
  '';

  npmDepsHash = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";

  meta = {
    description = "Voice Over Translation CLI tool";
    homepage = "https://www.npmjs.com/package/vot-cli";
    license = lib.licenses.mit;
    platforms = lib.platforms.all;
  };
}
cd /pkg/overlay/vot
nix-build -E 'with import <nixpkgs> {}; callPackage ./default.nix { }'

out:
nix-build -E 'with import <nixpkgs> {}; callPackage ./default.nix { }'
these 2 derivations will be built:
  /nix/store/0r4nlif14aid7wbxmkd6i7rvb2jga1z2-vot-cli-1.4.3-npm-deps.drv
  /nix/store/7chl5iwlfgx477711aq3zpn9armmf6yf-vot-cli-1.4.3.drv
building '/nix/store/0r4nlif14aid7wbxmkd6i7rvb2jga1z2-vot-cli-1.4.3-npm-deps.drv'...
Running phase: unpackPhase
unpacking source archive /nix/store/g13fld7r6yx3wadh2can68aa49yz4jca-vot-cli-1.4.3.tgz
source root is package
setting SOURCE_DATE_EPOCH to timestamp 499162500 of file "package/test/test-youtube.ps1"
Running phase: patchPhase <-- зависает тут

Как правильно сделать? Так-то оно в дистрибах ставилось npm install --global vot-cli

★★★★

Внутри nix build не будет доступа к сети, package-lock.json нужно сгенерировать заранее и сделать что-то вроде такого:

postPatch = ''
  ln -s ${./package-lock.json} package-lock.json
''
kneedeep
()
Ответ на: комментарий от kneedeep
{ buildNpmPackage, fetchurl, lib, nodejs, cacert }:

buildNpmPackage rec {
  pname = "vot-cli";
  version = "1.4.3";

  src = fetchurl {
    url = "https://registry.npmjs.org/${pname}/-/${pname}-${version}.tgz";
    hash = "sha256-eOUfy6l48MD9IcWiFlC142vXvo5XobKTJ2uC6xzDGS4=";
  };

  nativeBuildInputs = [ cacert ];

  postPatch = ''
    # export HOME=$TMPDIR
    export HOME=$(mktemp -d)
    export SSL_CERT_FILE=${cacert}/etc/ssl/certs/ca-bundle.crt
    export NODE_EXTRA_CA_CERTS=${cacert}/etc/ssl/certs/ca-bundle.crt
    ${nodejs}/bin/npm config set strict-ssl false
    ${nodejs}/bin/npm install --package-lock-only --no-audit --no-fund --ignore-scripts --verbose
  '';

  # postInstall = ''
  #   mkdir -p $out/bin
  #   ln -s $out/lib/node_modules/vot-cli/bin/vot $out/bin/vot
  # '';

  installPhase = ''
    # npm refuses to run as root unless we give it `--unsafe-perm`.
    npm install \
      --omit=dev \
      --ignore-scripts \
      --unsafe-perm \
      --prefix $out

    # The CLI lives in `bin/vot`; expose it in $out/bin.
    mkdir -p $out/bin
    ln -s $out/lib/node_modules/vot-cli/bin/vot $out/bin/vot
  '';

  # npmDepsHash = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
  npmDepsHash = "sha256-yhQElFPG+WqU4a786oCF5GjQzvfZ1fUKXNvtGhY+LtA=";

  meta = {
    description = "Voice Over Translation CLI tool";
    homepage = "https://www.npmjs.com/package/vot-cli";
    license = lib.licenses.mit;
    platforms = lib.platforms.all;
  };
}

Если поставить фиктивный хэш - лезет перекачивать все js пакеты. Если поставить реальный хэш, получаю ошибку:

building '/nix/store/kfhcpqvmmahhjvgv441mmpkkpvfj09lr-vot-cli-1.4.3.drv'...
Running phase: unpackPhase
unpacking source archive /nix/store/g13fld7r6yx3wadh2can68aa49yz4jca-vot-cli-1.4.3.tgz
source root is package
setting SOURCE_DATE_EPOCH to timestamp 499162500 of file "package/test/test-youtube.ps1"
Running phase: patchPhase
npm verbose cli /nix/store/6s9qrnf23whlvphz6p5fkczfhpaj0zya-nodejs-22.22.2/bin/node /nix/store/6s9qrnf23whlvphz6p5fkczfhpaj0zya-nodejs-22.22.2/bin/npm
npm info using npm@10.9.7
npm info using node@v22.22.2
npm verbose title npm install
npm verbose argv "install" "--package-lock-only" "--no-audit" "--no-fund" "--ignore-scripts" "--loglevel" "verbose"
npm verbose logfile logs-max:10 dir:/build/tmp.Ul0OYx4GY9/.npm/_logs/2026-04-27T16_01_48_375Z-
npm verbose logfile /build/tmp.Ul0OYx4GY9/.npm/_logs/2026-04-27T16_01_48_375Z-debug-0.log
npm http fetch GET https://registry.npmjs.org/axios attempt 1 failed with EAI_AGAIN
\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\npm http fetch GET https://registry.npmjs.org/axios attempt 2 failed with EAI_AGAIN
bryak ★★★★
() автор топика
Ответ на: комментарий от bryak

Если поставить фиктивный хэш - лезет перекачивать все js пакеты.

Видимо, фиктивный хеш предполагает неявный impure evaluation, не знаю, для чего это.

В общем, вот пример из nixpkgs, как можно сделать:

https://github.com/NixOS/nixpkgs/tree/883113188b9dd4162c5aa3ae4d85eb2e22a78772/pkgs/by-name/ug/uglify-js

kneedeep
()
Ответ на: комментарий от kneedeep
{
  lib,
  buildNpmPackage,
  fetchFromGitHub,
  cacert,
  nodejs,
  runtimeShell,
}:

buildNpmPackage (finalAttrs: {
  pname = "vot-cli";
  version = "1.11.5";

  __structuredAttrs = true;

  src = fetchFromGitHub {
    owner = "ilyhalight";
    repo = "voice-over-translation";
    tag = "v${finalAttrs.version}";
    hash = "sha256-IJ447oJfpF5I2V3jOCHBsfBoRH3CW9MXfV+4r7tDZ6k=";
  };

  # Временный хеш — замените на реальный после первой сборки
  npmDepsHash = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";

  prePatch = ''
    export HOME=$TMPDIR
    export NODE_EXTRA_CA_CERTS="${cacert}/etc/ssl/certs/ca-bundle.crt"
    export SSL_CERT_FILE="${cacert}/etc/ssl/certs/ca-bundle.crt"
    # Генерируем lock-файл внутри основного derivation
    ${nodejs}/bin/npm install --package-lock-only --ignore-scripts --no-audit --no-fund --verbose
  '';

  nativeBuildInputs = [ nodejs cacert ];

  npmFlags = [
    "--no-audit"
    "--no-fund"
  ];

  npmBuildScript = "build";   # или "build:cli" – проверьте package.json

  installPhase = ''
    runHook preInstall

    ${nodejs}/bin/npm prune --omit=dev --no-save --no-audit --no-fund --verbose

    mkdir -p $out/lib/vot-cli $out/bin
    cp -r dist node_modules package.json $out/lib/vot-cli/
    rm -f $out/lib/vot-cli/node_modules/.bin/vot-cli

    cat > $out/bin/vot-cli <<'EOF'
    #!@runtimeShell@
    exec @nodejs@ @out@/lib/vot-cli/dist/cli.js "$@"
    EOF

    substituteInPlace $out/bin/vot-cli \
      --replace-fail @runtimeShell@ ${runtimeShell} \
      --replace-fail @nodejs@ ${lib.getExe nodejs} \
      --replace-fail @out@ $out

    chmod +x $out/bin/vot-cli

    runHook postInstall
  '';

  meta = {
    description = "CLI tool for voice-over-translation";
    homepage = "https://github.com/ilyhalight/voice-over-translation";
    license = lib.licenses.mit;
    mainProgram = "vot-cli";
    maintainers = with lib.maintainers; [ totoroot ];
    platforms = lib.platforms.all;
  };
})

Виснет на этом:

/npm http fetch GET 200 https://registry.npmjs.org/@emnapi%2fcore 73ms (cache miss)
-npm http fetch GET 200 https://registry.npmjs.org/@emnapi%2fruntime 75ms (cache miss)
-npm http fetch GET 200 https://registry.npmjs.org/@napi-rs%2fwasm-runtime 76ms (cache miss)
-npm http fetch GET 200 https://registry.npmjs.org/tslib 63ms (cache miss)
-npm http fetch GET 200 https://registry.npmjs.org/tslib 68ms (cache miss)
-npm http fetch GET 200 https://registry.npmjs.org/@emnapi%2fwasi-threads 72ms (cache miss)
-\|/npm http fetch GET 200 https://registry.npmjs.org/@tybys%2fwasm-util 580ms (cache miss)
/
up to date in 22s
-npm verbose cwd /build/source
-npm verbose os Linux 6.19.11-xanmod1
-npm verbose node v22.22.2
-npm verbose npm  v10.9.7
-npm notice
npm notice New major version of npm available! 10.9.7 -> 11.14.0
npm notice Changelog: https://github.com/npm/cli/releases/tag/v11.14.0
npm notice To update run: npm install -g npm@11.14.0
npm notice
-npm verbose exit 0
-npm info ok
-Running phase: updateAutotoolsGnuConfigScriptsPhase
Running phase: configurePhase
no configure script, doing nothing
Running phase: buildPhase

Честно говоря, я уже готов сдаться. Но так-то хотелось бы видеть рабочую деривацию, чтобы собирать другие пакеты

bryak ★★★★
() автор топика
Ответ на: комментарий от bryak

Я же сразу сказал, что этого не добиться. Стоит только прописать npmDepsHash, сеть в сборочном окружении пропадёт, из-за чего генерация package-lock отвалится.

Вроде как сеть можно оставить, если выключить sandbox для сборки.

kneedeep
()
Последнее исправление: kneedeep (всего исправлений: 1)
Ответ на: комментарий от bryak

npm2nix

Оно какое-то мёртвое, последний коммит 9 лет назад.

Тебе точно нужна вся эта возня вместо просто рабочего пакета? Да и раз на то пошло,

Хочу, чтобы деривация была самодостаточной.

при обновлении всё равно придётся руками версию и хеши прописывать.

kneedeep
()
Ответ на: комментарий от kneedeep

Я же сразу сказал, что этого не добиться. Стоит только прописать npmDepsHash, сеть в сборочном окружении пропадёт, из-за чего генерация package-lock отвалится. Вроде как сеть можно оставить, если выключить sandbox для сборки.

Да уж…потратил столько времени на преодоление непреодолимого. Только мне не ясно, после генерации package-lock мы же пакеты ставим из сети. Получается сеть всё же есть в деривации? Или это на этапе installPhase? И вообще не понятно, где сеть есть, а где ее нет

bryak ★★★★
() автор топика
Последнее исправление: bryak (всего исправлений: 1)
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария