NixOSにnpmパッケージをインストールする方法


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. Nixの下で、nixとは異なるパッケージマネージャーであるnpmを使用することには意味がありますか?
  2. (1)への回答が「はい」の場合、nxOSにnpmをインストールする方法は?を介して検索するときにnpmが表示さnix-env$ nix-env -qa npmない。

webpack-dev-serverNixOS にインストールする正しい方法は何ですか?


編集

コメント付きのリンクwebpack-dev-serverに従ってインストールを試みましたが、をインストールできましたが、Readmeに記載されているステップ2を実行できませんでした。node2nix

手順2で参照されたファイル/nix/store

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

リストされたnpmパッケージを表示するためにそのファイルを開くことができますが、sudoを使用して実行している場合でも、アクセス許可は読み取り専用です。そのため、変更するためにアクセス許可を編集する必要があります。

この/nix/storeファイルを直接編集するのではなく、nixを介して間接的に操作する必要があるようです。このファイルを直接編集するべきではないことは正しいですか?もしそうなら、どのようにnixまたはそれに追加webpack-dev-serverする何かを使用してステップ2を完了することができますか?



@EmmanuelRosaリンクありがとうございます。そこで私はそこでの指示に従い、その結果に応じてこの質問を更新しました。
mherzl 2017

/nix/store読み取り専用です。git repoを複製-I nixpkgs=/path/to/repoしてnix-*コマンドに使用する必要があります
wizzup

回答:


15

nixを介してnpmパッケージを使用するには、いくつかの方法があります。

私の個人プロジェクトでは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プロファイルに依存関係(nix-envまたはnoxを介して)があると、「グローバルな」名前空間を汚染してnixの目的が損なわれるため、nix-shellに慣れることをお勧めします。


binding.gypを使用するパッケージについて、これについて詳しく説明してください。
CMCDragonkai

1
バイナリパッケージでそれを行う方法を見つけました。nodePackages_6_x.node-gyp、およびのような他のライブラリが必要です。blasすべてが揃ったら、npm install ....node-gypを使用するパッケージを使用できます。
CMCDragonkai 2017

1
最初の方法に関しては、npm scriptsソリューションの代替として、グローバルnpmパッケージをnix-shell効果的なものに追加することを見つけましたnix-shell -p nodejs-8_x nodePackages.grunt-cli。(警告:nixosとnode noobはここにあります。)
Ryne Everett

最初の方法について私が理解していないことの1つは、実際にパッケージ自体をインストールする方法です。つまり、プロジェクトのpackage.jsonのバイナリはどこに行き着くのbinでしょうか。
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

別の方法として、私はまた、見つけNixpkgs発行#3393にCMCDragonkaiさんのコメントを

NPMのプレフィックスディレクトリを変更できることがわかりました。何かのようなもの:

npm config set prefix '~/mutable_node_modules.

これにより、NPMのグローバルインストールを使用できます。

したがって、出力をNixで管理されていない場所にリダイレクトすることで、純粋に機能的なモデルを回避することができます。しかし、それはNixを使用する目的に反すると思います。また、すべてのソフトウェアがこれらのタイプの構成変更をサポートするわけではありません。

それでもnix-env 、通常のグローバルNodeパッケージの使用と開発パッケージのnpm を切り替える必要があるのは非常に不格好だと感じています。「npm2nix」のような移植レイヤーがすべてあるのはそのためだと思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.