web-dev-qa-db-ja.com

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

NixOSでは、$ nix-env -i yarnを実行して、通常どおりパッケージyarnをインストールしました。現在、$ yarn startを介してyarnを実行しようとしています。しかし、これは私に次のエラーを引き起こします。

$ 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をインストールする方法は? nix-envも派生に一致しないため、$ nix-env -qa npmを介して検索するときにnpmが使用可能とは表示されません。

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


編集

コメントリンク に従ってwebpack-dev-serverをインストールしようとしましたが、node2nixをインストールできましたが、Readmeに記載されている手順2を実行できませんでした。

手順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または何かを使用してステップ2を完了できますかwebpack-dev-serverに変更しますか?

10
mherzl

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

私のパッケージにはバイナリ依存関係がないため、これは私にとってはうまくいきます。 This 投稿では、プロジェクトの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に慣れることをお勧めします。

15
Luke Adams

なんらかの理由でわかりません。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 でリクエストしてください。

8
wizzup

別の方法として、Nixpkgsの問題#3393への CMCDragonkaiのコメントも見つかりました

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

npm config set prefix '~/mutable_node_modules.

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

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

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

3
toraritte