Làm cách nào để cài đặt các gói npm trong NixOS?


10

Trong NixOS, tôi đã cài đặt gói yarnnhư bình thường bằng cách chạy $ nix-env -i yarn. Bây giờ tôi đang cố gắng chạy yarnqua $ yarn start. Nhưng điều này dẫn tôi đến lỗi sau.

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

Khi tôi cố gắng cài đặt webpack-dev-servertheo cách NixOS thông thường của mình, tôi gặp lỗi 'không khớp với các dẫn xuất'.

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

Tôi đọc rằng đó webpack-dev-serverlà một gói npm và không chắc chắn về một số câu hỏi liên quan đến sự liên quan của điều đó trong trường hợp này.

  1. Liệu nó có ý nghĩa khi sử dụng npm, một trình quản lý gói khác với nix, dưới Nix?
  2. Nếu câu trả lời cho (1) là có, thì làm thế nào để cài đặt npm trên NixOS? Tôi không thấy npm có sẵn khi tìm kiếm thông qua nix-env, $ nix-env -qa npmcũng như không có dẫn xuất.

Cách chính xác để cài đặt webpack-dev-servertrên NixOS là gì?


BIÊN TẬP

Tôi đã cố gắng cài đặt webpack-dev-servertheo liên kết đã nhận xét và có thể cài đặt node2nix, nhưng tôi không thể làm theo bước 2 được liệt kê trong readme đó.

Tôi định vị tệp được tham chiếu ở bước 2 /nix/storetại

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

Tôi có thể mở tệp đó để xem các gói npm được liệt kê, nhưng các quyền chỉ ở chế độ đọc, thậm chí chạy với sudo - vì vậy tôi sẽ cần chỉnh sửa các quyền của nó để thay đổi.

Có vẻ như tôi không nên chỉnh sửa /nix/storetrực tiếp tệp này và thay vào đó nên thao tác gián tiếp qua nix. Tôi có đúng rằng tôi không nên chỉnh sửa tệp này trực tiếp không? Nếu vậy, làm thế nào khác tôi có thể hoàn thành bước 2 bằng cách sử dụng nix hoặc một cái gì đó để thêm webpack-dev-servervào nó?



@EmmanuelRosa cảm ơn bạn đã liên kết; Tôi đã cố gắng làm theo các hướng dẫn ở đó và cập nhật câu hỏi này theo kết quả của nỗ lực đó.
mherzl

/nix/storelà chỉ đọc. Bạn cần sao chép git repo và sử dụng -I nixpkgs=/path/to/repocho nix-*lệnh
wizzup

Câu trả lời:


15

Có nhiều cách để sử dụng các gói npm thông qua nix:

Đối với các dự án cá nhân của tôi, tôi sử dụng nix-shelltrong shell tôi sử dụng các tập lệnh npm để ngăn chặn sự cần thiết của các gói toàn cầu npm (như với gulp). Quá trình này trông giống như thế này (và có lẽ rất giống với sợi):

$ 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

Điều này hoạt động tốt cho tôi vì không có gói nào của tôi có phụ thuộc nhị phân. Bài đăng này mô tả việc tạo default.nix cho dự án của bạn để bạn không phải chỉ định các phụ thuộc cho mỗi lần gọi nix-shell, nhưng đó là tùy chọn.

Một cách khác là sử dụng npm2nix:

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

Điều này sẽ khiến Nix quản lý tất cả các gói npm trong dự án.

Có thể là một ý tưởng tốt để làm quen với nix-shell, vì đã cố gắng cài đặt các gói nút / bất kỳ phụ thuộc nào trong hồ sơ nix của bạn (thông qua nix-env hoặc nox) đánh bại mục đích của nix bằng cách làm ô nhiễm không gian tên "toàn cầu".


Bạn có thể mở rộng về điều này liên quan đến các gói bằng cách sử dụng bind.gyp chẳng hạn: github.com/mateogianolio/nblas
CMCDragonkai

1
Tôi tìm ra cách để làm điều đó cho các gói nhị phân. Bạn cần nodePackages_6_x.node-gyp, và bất kỳ thư viện nào khác blas, sau đó khi tất cả cùng nhau, bạn có thể sử dụng npm install ....các gói sử dụng nút-gyp.
CMCDragonkai

1
Về phương pháp đầu tiên, như là một npm scriptsgiải pháp thay thế , tôi thấy việc thêm các gói npm toàn cầu vào nix-shellhiệu quả, vd nix-shell -p nodejs-8_x nodePackages.grunt-cli. (Cảnh báo: nixos và nút noob tại đây.)
Ryne Everett

Điều duy nhất tôi không hiểu về phương thức đầu tiên là làm thế nào để thực sự tự cài đặt gói, tức là nhị phân cho gói.json của dự án binkết thúc ở đâu?
Ryne Everett

@ ryne-everett Nếu bạn chạy npm install, các tệp thực thi sẽ được liên kết vào node_modules/.bin. Xem ở đây .
Luke Adams

7

Vì một số lý do tôi không biết, nodePackages không nằm trong không gian tên gốc và không thể tìm thấy bằng cách sử dụng nix-env -qa

sử dụng nix-env -qaPA 'nixos.nodePackages'để liệt kê các gói có sẵn.

$ 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

Nếu không có gói nào bạn muốn và bạn không thể tự làm, hãy thử yêu cầu nó trên NixOS github .


1
Tôi chỉ đang sử dụng trình quản lý gói nix và có thể làm cho nó hoạt động với:nix-env -f '<nixpkgs>' -qaPA nodePackages | grep tern
zaynetro

Hầu hết trong số này không nằm trong không gian tên gốc vì nó sẽ làm cho tìm kiếm bình thường chậm. Nó giống với các gói Haskell. Không gian tên của họ quá lớn.
user239558

3

Để thay thế, tôi cũng tìm thấy nhận xét của CMCDragonkai về vấn đề Nixpkgs # 3393 :

Tôi vừa phát hiện ra rằng bạn có thể thay đổi thư mục tiền tố của NPM. Cái gì đó như:

npm config set prefix '~/mutable_node_modules.

Điều này cho phép bạn sử dụng cài đặt toàn cầu của NPM.

Vì vậy, có thể làm việc xung quanh mô hình chức năng thuần túy, bằng cách chuyển hướng đầu ra của nó đến một nơi không do Nix quản lý. Nhưng tôi đoán nó đánh bại mục đích sử dụng Nix. Và không phải mọi phần mềm đều hỗ trợ các loại thay đổi cấu hình này.

Tuy nhiên, tôi cảm thấy rất khó khăn khi phải chuyển đổi giữa việc sử dụng nix-env cho các gói Node toàn cầu thông thường và npm cho các gói phát triển. Tôi đoán đó là lý do tại sao có tất cả các lớp porting như "npm2nix".

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.