Wie installiere ich npm-Pakete in NixOS?

10

In NixOS habe ich das Paket yarnwie gewohnt durch Ausführen installiert $ nix-env -i yarn. Jetzt versuche ich yarnüber zu rennen $ yarn start. Dies führt mich jedoch zu folgendem Fehler.

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

Wenn ich versuche, webpack-dev-serverauf meine übliche NixOS-Weise zu installieren , wird der Fehler "Übereinstimmungen ohne Ableitungen" angezeigt.

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

Ich habe gelesen, dass webpack-dev-serveres sich um ein npm-Paket handelt, und bin mir nicht sicher, ob dies in diesem Fall relevant ist.

  1. Ist es sinnvoll, npm, einen anderen Paketmanager als nix, unter Nix zu verwenden?
  2. Wenn die Antwort auf (1) Ja lautet, wie kann man dann npm unter NixOS installieren? Ich sehe npm nicht verfügbar bei der Suche über nix-env, da $ nix-env -qa npmauch keine Ableitungen übereinstimmen.

Was ist der richtige Weg, um webpack-dev-serverunter NixOS zu installieren ?


BEARBEITEN

Ich habe versucht, über webpack-dev-serverden kommentierten Link zu installieren und konnte installieren node2nix, kann jedoch Schritt 2, der in der dortigen Readme-Datei aufgeführt ist, nicht ausführen.

Ich habe die Datei, auf die in Schritt 2 verwiesen wird, /nix/storeunter gefunden

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

Ich kann diese Datei öffnen, um die aufgelisteten npm-Pakete anzuzeigen, aber die Berechtigungen sind schreibgeschützt und können sogar mit sudo ausgeführt werden. Daher müsste ich die Berechtigungen bearbeiten, um sie zu ändern.

Es scheint, dass ich diese /nix/storeDatei nicht direkt bearbeiten und stattdessen indirekt über nix bearbeiten sollte. Stimmt es, dass ich diese Datei nicht direkt bearbeiten sollte? Wenn ja, wie kann ich Schritt 2 sonst mit nix oder etwas anderem abschließen webpack-dev-server?

mherzl
quelle
@ EmmanuelRosa danke für den Link; Ich habe versucht, den Anweisungen dort zu folgen, und diese Frage entsprechend den Ergebnissen dieses Versuchs aktualisiert.
Mherzl
/nix/storeist schreibgeschützt. Sie müssen Git Repo klonen und -I nixpkgs=/path/to/repofür nix-*Befehl verwenden
wizzup

Antworten:

15

Es gibt mehrere Möglichkeiten, npm-Pakete über nix zu verwenden:

Für meine persönlichen Projekte verwende ich nix-shelldann innerhalb der Shell npm-Skripte , um die Notwendigkeit globaler npm-Pakete (wie bei gulp) zu vermeiden. Der Prozess sieht ungefähr so ​​aus (und ist für Garn wahrscheinlich sehr ähnlich):

$ 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

Dies funktioniert gut für mich, da keines meiner Pakete binäre Abhängigkeiten aufweist. Dieser Beitrag beschreibt die Erstellung einer default.nix für Ihr Projekt, sodass Sie nicht bei jedem Aufruf von nix-shell Abhängigkeiten angeben müssen, dies ist jedoch optional.

Eine andere Möglichkeit ist die Verwendung von npm2nix:

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

Dadurch verwaltet Nix alle npm-Pakete im Projekt.

Es kann eine gute Idee sein, sich mit nix-shell vertraut zu machen, da der Versuch, Knotenpakete / Abhängigkeiten in Ihrem nix-Profil (über nix-env oder nox) zu installieren, den Zweck von nix zunichte macht, indem der "globale" Namespace verschmutzt wird.

Luke Adams
quelle
Könnten Sie dies in Bezug auf Pakete mit Binding.gyp erweitern, zum Beispiel: github.com/mateogianolio/nblas
CMCDragonkai
1
Ich fand heraus, wie es für Binärpakete geht. Sie benötigen die nodePackages_6_x.node-gypund alle anderen Bibliotheken wie blas. Wenn alles zusammen ist, können Sie npm install ....Pakete verwenden, die Node-Gyp verwenden.
CMCDragonkai
1
In Bezug auf die erste Methode npm scriptsfinde ich als Alternative zur Lösung das Hinzufügen globaler npm-Pakete zum nix-shelleffektiven, z nix-shell -p nodejs-8_x nodePackages.grunt-cli. (Warnung: Nixos und Node Noob hier.)
Ryne Everett
Das einzige, was ich über die erste Methode nicht verstehe, ist, wie das Paket selbst installiert wird, dh wo landet die Binärdatei für die package.json des Projekts bin?
Ryne Everett
@ ryne-everett Wenn Sie ausführen npm install, werden ausführbare Dateien mit verknüpft node_modules/.bin. Siehe hier .
Luke Adams
7

Aus irgendeinem Grund weiß ich nicht, dass sich nodePackages nicht im Root-Namespace befindet und nicht mit using gefunden werden kann nix-env -qa

Verwenden Sie nix-env -qaPA 'nixos.nodePackages'diese Option, um verfügbare Pakete aufzulisten.

$ 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

Wenn Sie keine gewünschten Pakete wünschen und keine eigenen erstellen können , fordern Sie diese unter NixOS github an .

wizzup
quelle
1
Ich benutze nur Nix Package Manager und konnte es zum nix-env -f '<nixpkgs>' -qaPA nodePackages | grep tern
Laufen bringen
Die meisten davon befinden sich nicht im Root-Namespace, da dies die normale Suche verlangsamen würde. Ähnlich verhält es sich mit Haskell-Paketen. Ihr Namespace ist zu groß.
user239558
3

Als Alternative fand ich auch CMCDragonkais Kommentar zum Nixpkgs-Problem Nr. 3393 :

Ich habe gerade herausgefunden, dass Sie das Präfixverzeichnis von NPM ändern können. Etwas wie:

npm config set prefix '~/mutable_node_modules.

Auf diese Weise können Sie die globale Installation von NPM verwenden.

Es ist also möglich, das rein funktionale Modell zu umgehen, indem seine Ausgaben an einen Ort umgeleitet werden, der nicht von Nix verwaltet wird. Aber ich denke, es macht den Zweck der Verwendung von Nix zunichte. Und nicht jede einzelne Software unterstützt diese Art von Konfigurationsänderungen.

Trotzdem finde ich es sehr umständlich, zwischen der Verwendung nix-env für normale globale Node-Pakete und npm für Entwicklungspakete wechseln zu müssen. Ich denke, deshalb gibt es all diese Portierungsebenen wie "npm2nix".

toraritte
quelle