Jak zainstalować pakiety npm w NixOS?


10

W NixOS zainstalowałem pakiet yarnjak zwykle, uruchamiając $ nix-env -i yarn. Teraz jestem próbujesz uruchomić yarnpoprzez $ yarn start. Ale to prowadzi mnie do następującego błędu.

$ 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.

Kiedy próbuję zainstalować webpack-dev-serverw zwykły sposób NixOS, pojawia się błąd „nie pasuje do pochodnych”.

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

Przeczytałem, że webpack-dev-serverjest to pakiet npm i nie jestem pewien kilku pytań dotyczących znaczenia tego w tym przypadku.

  1. Czy ma sens używanie npm, innego menedżera pakietów niż nix, pod Nix?
  2. Jeśli odpowiedź na (1) brzmi „tak”, to jak zainstalować npm na NixOS? Nie widzę npm dostępnego podczas wyszukiwania nix-env, ponieważ $ nix-env -qa npmrównież nie pasuje do żadnych pochodnych.

Jaki jest prawidłowy sposób instalacji webpack-dev-serverna NixOS?


EDYTOWAĆ

Próbowałem zainstalować webpack-dev-serverpo skomentował linku i był w stanie zainstalować node2nix, ale nie jestem w stanie zrealizują kroku 2 wymienione tam readme.

I znajduje się plik wymieniony w punkcie 2, w /nix/storeco

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

Mogę otworzyć ten plik, aby wyświetlić wymienione pakiety npm, ale uprawnienia są tylko do odczytu, nawet działają z sudo - więc musiałbym edytować jego uprawnienia, aby je zmienić.

Wygląda na to, że nie powinienem edytować tego /nix/storepliku bezpośrednio, a zamiast tego powinienem nim manipulować pośrednio przez nix. Czy mam rację, że nie powinienem bezpośrednio edytować tego pliku? Jeśli tak, to w jaki inny sposób mogę wykonać krok 2, używając nix lub czegoś, co można webpack-dev-serverdo niego dodać ?



@EmmanuelRosa dziękuję za link; Próbowałem postępować zgodnie z instrukcjami tam zawartymi i zaktualizowałem to pytanie zgodnie z wynikami tej próby.
mherzl

/nix/storejest tylko do odczytu. Trzeba clone git repo i wykorzystania -I nixpkgs=/path/to/repodla nix-*polecenia
wizzup

Odpowiedzi:


15

Istnieje wiele sposobów używania pakietów npm przez nix:

Do moich osobistych projektów używam nix-shellnastępnie w powłoce używam skryptów npm, aby uniknąć potrzeby globalnych pakietów npm (jak w przypadku gulp). Proces wygląda mniej więcej tak (i ​​prawdopodobnie jest bardzo podobny w przypadku przędzy):

$ 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

Działa to dla mnie dobrze, ponieważ żaden z moich pakietów nie ma zależności binarnych. Ten post opisuje tworzenie pliku default.nix dla twojego projektu, więc nie będziesz musiał określać zależności dla każdego wywołania powłoki nix, ale jest to opcjonalne.

Innym sposobem jest użycie npm2nix:

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

Co spowoduje, że Nix będzie zarządzał wszystkimi pakietami npm w projekcie.

Dobrym pomysłem może być zapoznanie się z powłoką nix, ponieważ próba zainstalowania pakietów węzłów / dowolnej zależności w twoim profilu nix (poprzez nix-env lub nox) nie pozwala osiągnąć celu nix przez zanieczyszczenie „globalnej” przestrzeni nazw.


Czy możesz rozwinąć tę kwestię w odniesieniu do pakietów korzystających z wiązania.gyp, na przykład: github.com/mateogianolio/nblas
CMCDragonkai

1
Dowiedziałem się, jak to zrobić dla pakietów binarnych. Potrzebujesz nodePackages_6_x.node-gypbibliotek i innych podobnych bibliotek blas, a kiedy wszystko będzie razem, możesz użyć npm install ....pakietów korzystających z węzła gyp.
CMCDragonkai,

1
Jeśli chodzi o pierwszą metodę, jako alternatywę dla npm scriptsrozwiązania, znajduję dodawanie globalnych pakietów npm do nix-shellskutecznego, np nix-shell -p nodejs-8_x nodePackages.grunt-cli. (Ostrzeżenie: tutaj nixos i węzeł noob.)
Ryne Everett

Jedyną rzeczą, której nie rozumiem na temat pierwszej metody, jest to, jak właściwie zainstalować sam pakiet, tj. Gdzie binkończy się plik binarny dla pliku package.json projektu ?
Ryne Everett

@ ryne-everett Jeśli uruchomisz npm install, pliki wykonywalne zostaną połączone node_modules/.bin. Zobacz tutaj .
Luke Adams,

8

Z jakiegoś powodu nie wiem, pakiet nodePackages nie znajduje się w głównej przestrzeni nazw i nie można go znaleźć za pomocą nix-env -qa

służy nix-env -qaPA 'nixos.nodePackages'do wyświetlania listy dostępnych pakietów.

$ 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

Jeśli nie ma pakiety chcesz i nie można zrobić własną prośbę, spróbuj go na NixOS github .


1
Korzystam tylko z menedżera pakietów nix i udało mi się sprawić, aby działał z:nix-env -f '<nixpkgs>' -qaPA nodePackages | grep tern
zaynetro

Większość z nich nie znajduje się w głównej przestrzeni nazw, ponieważ spowolniłoby to normalne wyszukiwanie. Tak samo jest z pakietami Haskell. Ich przestrzeń nazw jest za duża.
user239558,

3

Alternatywnie znalazłem również komentarz CMCDragonkai na temat numeru Nixpkgs # 3393 :

Właśnie dowiedziałem się, że możesz zmienić katalog prefiksów NPM. Coś jak:

npm config set prefix '~/mutable_node_modules.

Pozwala to na użycie globalnej instalacji NPM.

Możliwe jest więc obejście czysto funkcjonalnego modelu poprzez przekierowanie jego wyników do miejsca, które nie jest zarządzane przez Nix. Ale myślę, że to przeczy celowi użycia Nix. I nie każde oprogramowanie obsługuje te zmiany konfiguracji.

Nadal uważam, że to niezręczne przełączanie między używaniem nix-env dla normalnych globalnych pakietów Node, a npm dla pakietów programistycznych. Sądzę, że właśnie dlatego są te wszystkie warstwy przenoszące, takie jak „npm2nix”.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.