Как установить пакеты 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-serverNixOS?


РЕДАКТИРОВАТЬ

Я попытался установить 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к нему?

mherzl
источник
@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, загрязняя «глобальное» пространство имен.

Люк Адамс
источник
Не могли бы вы рассказать об этом в отношении пакетов, использующих binding.gyp, например: 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 и noob узла здесь.)
Райн Эверетт
Одна вещь, которую я не понимаю в первом методе, это как на самом деле установить сам пакет, то есть где binзаканчивается бинарный файл для package.json проекта ?
Райн Эверетт
@ 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 .

wizzup
источник
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".

toraritte
источник