Bagaimana cara menginstal paket npm di NixOS?

10

Di NixOS, saya menginstal paket yarnseperti biasa dengan menjalankan $ nix-env -i yarn. Sekarang saya mencoba untuk menjalankan yarnvia $ yarn start. Tapi ini membawa saya ke kesalahan berikut.

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

Ketika saya mencoba menginstal webpack-dev-serverdengan cara NixOS seperti biasa, saya mendapatkan kesalahan 'cocok tanpa derivasi'.

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

Saya membaca bahwa itu webpack-dev-serveradalah paket npm, dan tidak yakin beberapa pertanyaan mengenai relevansi paket tersebut dalam kasus ini.

  1. Apakah masuk akal untuk menggunakan npm, manajer paket berbeda dari nix, di bawah Nix?
  2. Jika jawaban (1) adalah ya, lalu bagaimana cara menginstal npm di NixOS? Saya tidak melihat npm tersedia saat mencari melalui nix-env, $ nix-env -qa npmjuga tidak cocok dengan derivasi.

Apa cara yang benar untuk menginstal webpack-dev-serverdi NixOS?


EDIT

Saya mencoba untuk menginstal webpack-dev-servermengikuti tautan yang dikomentari dan dapat menginstal node2nix, tetapi saya tidak dapat melanjutkan pada langkah 2 yang tercantum dalam readme di sana.

Saya menemukan file yang dirujuk pada langkah 2 di /nix/storepada

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

Saya dapat membuka file itu untuk melihat paket-paket npm yang terdaftar, tetapi izinnya hanya-baca, bahkan berjalan dengan sudo - jadi saya perlu mengedit izinnya untuk mengubahnya.

Tampaknya saya tidak boleh mengedit /nix/storefile ini secara langsung dan sebagai gantinya harus memanipulasi secara tidak langsung melalui nix. Apakah saya benar bahwa saya tidak boleh mengedit file ini secara langsung? Jika demikian, bagaimana lagi saya bisa menyelesaikan langkah 2 dengan menggunakan nix atau sesuatu untuk ditambahkan webpack-dev-server?

mherzl
sumber
@EmmanuelRosa terima kasih atas tautannya; Saya berusaha mengikuti instruksi di sana dan memperbarui pertanyaan ini sesuai dengan hasil dari upaya itu.
mherzl
/nix/storehanya baca. Anda perlu clone git repo dan penggunaan -I nixpkgs=/path/to/repountuk nix-*perintah
wizzup

Jawaban:

15

Ada beberapa cara untuk menggunakan paket npm melalui nix:

Untuk proyek pribadi saya, saya gunakan nix-shellkemudian di dalam shell saya menggunakan skrip npm untuk mencegah perlunya paket global npm (seperti dengan tegukan). Prosesnya terlihat seperti ini (dan mungkin sangat mirip untuk benang):

$ 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

Ini berfungsi baik untuk saya karena tidak ada paket saya yang memiliki dependensi biner. Posting ini menjelaskan pembuatan default.nix untuk proyek Anda sehingga Anda tidak perlu menentukan dependensi untuk setiap doa nix-shell, tetapi bersifat opsional.

Cara lain menggunakan npm2nix:

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

Yang akan menyebabkan Nix mengelola semua paket npm di proyek.

Mungkin menjadi ide yang baik untuk mengenal nix-shell, karena mencoba menginstal paket node / ketergantungan pada profil nix Anda (melalui nix-env atau nox) mengalahkan tujuan nix dengan mengotori namespace "global".

Luke Adams
sumber
Bisakah Anda memperluas ini berkaitan dengan paket menggunakan binding.gyp
CMCDragonkai
1
Saya menemukan cara melakukannya untuk paket biner. Anda memerlukan nodePackages_6_x.node-gyp, dan pustaka lain seperti blas, maka ketika itu semua bersama-sama, Anda dapat menggunakan npm install ....paket yang menggunakan node-gyp.
CMCDragonkai
1
Mengenai metode pertama, sebagai alternatif npm scriptssolusi, saya menemukan menambahkan paket global npm ke yang nix-shellefektif, misalnya nix-shell -p nodejs-8_x nodePackages.grunt-cli. (Peringatan: nixos dan simpul noob di sini.)
Ryne Everett
Satu hal yang saya tidak mengerti tentang metode pertama adalah bagaimana sebenarnya menginstal paket itu sendiri, yaitu di mana biner untuk paket project.json binberakhir?
Ryne Everett
@ ryne-everett Jika Anda menjalankan npm install, executable akan ditautkan ke node_modules/.bin. Lihat di sini .
Luke Adams
8

Untuk beberapa alasan saya tidak tahu, nodePackages tidak ada di root namespace dan tidak dapat ditemukan dengan menggunakan nix-env -qa

gunakan nix-env -qaPA 'nixos.nodePackages'untuk mendaftar untuk paket yang tersedia.

$ 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

Jika tidak ada paket yang Anda inginkan dan Anda tidak bisa membuatnya, coba minta di NixOS github .

wizzup
sumber
1
Saya hanya menggunakan manajer paket nix dan dapat membuatnya bekerja dengan:nix-env -f '<nixpkgs>' -qaPA nodePackages | grep tern
zaynetro
Sebagian besar tidak ada di root namespace karena itu akan membuat pencarian normal lambat. Itu sama dengan paket Haskell. Namespace mereka terlalu besar.
user239558
3

Sebagai alternatif, saya juga menemukan komentar CMCDragonkai tentang masalah Nixpkgs # 3393 :

Saya baru tahu bahwa Anda dapat mengubah direktori awalan NPM. Sesuatu seperti:

npm config set prefix '~/mutable_node_modules.

Ini memungkinkan Anda untuk menggunakan instalasi global NPM.

Jadi dimungkinkan untuk bekerja di sekitar model murni fungsional, dengan mengarahkan outputnya ke suatu tempat yang tidak dikelola oleh Nix. Tapi saya kira itu mengalahkan tujuan menggunakan Nix. Dan tidak setiap perangkat lunak akan mendukung jenis perubahan konfigurasi ini.

Masih saya merasa sangat kikuk harus beralih antara menggunakan nix-env untuk paket Node global normal, dan npm untuk paket pengembangan. Saya kira itu sebabnya ada semua lapisan porting seperti "npm2nix".

Toraritte
sumber