Як встановити пакети npm в NixOS?


10

У NixOS я встановив пакет, yarnяк завжди, запустивши $ nix-env -i yarn. Тепер я намагаюся запустити yarnчерез $ yarn start. Але це призводить мене до наступної помилки.

$ yarn start
    yarn start v0.20.3
    $ webpack-dev-server --env dev 
    sh: webpack-dev-server: command not found
    error Command failed with exit code 127.

Коли я намагаюся встановити webpack-dev-serverзвичайним способом NixOS, я отримую помилку "не відповідає виведенням".

$ nix-env -i webpack-dev-server
error: selector ‘webpack-dev-server’ matches no derivations

Я прочитав, що webpack-dev-serverце пакет npm, і я не впевнений у кількох питаннях щодо актуальності цього в даному випадку.

  1. Чи має сенс використовувати npm, інший менеджер пакунків, ніж nix, під Nix?
  2. Якщо відповідь на (1) - так, то як встановити npm на NixOS? Я не бачу npm, доступний під час пошуку через nix-env, оскільки $ nix-env -qa npmтакож відповідає жодним виведенням.

Який правильний спосіб встановити webpack-dev-serverна NixOS?


EDIT

Я спробував встановити webpack-dev-serverза коментованим посиланням і зміг встановити node2nix, але не в змозі перейти до кроку 2, зазначеного в readme.

Я знайшов файл , на який посилається на кроці 2 /nix/storeна

/nix/store/sgk7sxgqxrv2axkxjwc3y15apcqbrv1z-nixos-17.03.1482.1b57bf274a/nixos/pkgs/development/node-packages/node-packages.json

Я можу відкрити цей файл, щоб переглянути перелічені npm пакети, але дозволи доступні лише для читання, навіть із запуском із sudo - тому мені потрібно буде відредагувати його дозволи, щоб змінити його.

Здається, я не повинен редагувати цей /nix/storeфайл безпосередньо, а натомість маніпулювати ним побічно через nix. Чи правильно я не можу редагувати цей файл безпосередньо? Якщо так, то як ще я можу виконати крок 2, використовуючи nix або щось додати webpack-dev-serverдо нього?



@EmmanuelRosa дякую за посилання; Я спробував виконати там інструкції та оновив це питання відповідно до результатів цієї спроби.
mherzl

/nix/storeє лише для читання Вам потрібно клонувати git repo і використовувати -I nixpkgs=/path/to/repoдля nix-*команди
wizzup

Відповіді:


15

Існує кілька способів використання пакетів npm через nix:

Для моїх особистих проектів я використовую nix-shellтоді в оболонці я використовую сценарії npm для запобігання необхідності глобальних пакетів npm (наприклад, з gulp). Процес виглядає приблизно так (і, ймовірно, дуже схожий на пряжу):

$ nix-shell -p nodejs-8_x
[nix-shell:yourproject]$ npm install # installs npm deps to project-local node_modules
[nix-shell:yourproject]$ npm exec (...) # using scripts configured in package.json

Це добре працює для мене, оскільки жоден з моїх пакетів не має бінарних залежностей. У цій публікації описано створення default.nix для вашого проекту, тому вам не доведеться вказувати залежності для кожного виклику nix-shell, але це необов'язково.

Ще один спосіб використання npm2nix:

node2nix -i node-packages.json # creates ./default.nix
nix-shell # nix-shell will look for a default.nix, which above will have generated

Що призведе до того, що Nix керує всіма пакетами npm у проекті.

Можливо, буде добре ознайомитись з nix-shell, оскільки спроба встановити пакети вузлів / будь-яку залежність у вашому nix-профілі (через nix-env або nox) перемагає мету nix, забруднюючи "глобальний" простір імен.


Чи можете ви розширити цю проблему щодо пакетів, що використовують, наприклад: github.com/mateogianolio/nblas
CMCDragonkai

1
Я дізнався, як це зробити для бінарних пакетів. Вам потрібні nodePackages_6_x.node-gypі будь-які інші бібліотеки на кшталт blas, тоді, коли все разом, ви можете використовувати npm install ....пакети, які використовують node-gyp.
CMCDragonkai

1
Щодо першого методу, як альтернативи npm scriptsрішенню, я вважаю додавання глобальних пакетів npm до nix-shellефективних, наприклад nix-shell -p nodejs-8_x nodePackages.grunt-cli. (Попередження: nixos and node noob here.)
Ryne Everett

Я не розумію, що стосується першого методу - це як насправді встановити сам пакет, тобто де binзакінчується двійковий файл для пакета.json проекту ?
Ryne Everett

@ ryne-everett Якщо ви запускаєте npm install, виконувані файли будуть пов’язані node_modules/.bin. Дивіться тут .
Люк Адамс

8

Я чомусь не знаю, що nodePackages не знаходиться в просторі імен кореня, і його неможливо знайти за допомогою nix-env -qa

використовувати nix-env -qaPA 'nixos.nodePackages'для списку доступних пакетів.

$ nix-env -qaPA 'nixos.nodePackages' | grep -i web
nixos.nodePackages.webdrvr                     node-webdrvr-2.43.0-1
nixos.nodePackages.webpack                     node-webpack-2.6.1

Якщо немає потрібних пакунків і ви не можете зробити власні, спробуйте подати запит на NixOS github .


1
Я використовую лише nix-менеджер пакунків і зміг змусити його працювати з:nix-env -f '<nixpkgs>' -qaPA nodePackages | grep tern
zaynetro

Більшість із них не знаходиться в кореневому просторі імен, тому що це зробить нормальний пошук повільним. Так само і з пакетами Haskell. Їх простір імен занадто великий.
user239558

3

Як альтернативу я також знайшов коментар CMCDragonkai щодо питання Nixpkgs № 3393 :

Щойно я з’ясував, що ви можете змінити префіксний каталог NPM. Щось на зразок:

npm config set prefix '~/mutable_node_modules.

Це дозволяє використовувати глобальну установку NPM.

Таким чином, можна обійти суто функціональну модель, перенаправляючи її результати туди, де не керує Nix. Але я здогадуюсь, що це перемагає мету використання Nix. І не кожне програмне забезпечення підтримуватиме ці типи змін конфігурації.

І все-таки я відчуваю, що дуже незграбно потрібно перемикатися між використанням nix-env для звичайних глобальних пакетів Node та npm для пакетів розробки. Я думаю, саме тому є всі ті переносні шари, як "npm2nix".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.