จะติดตั้งแพ็คเกจ npm ใน NixOS ได้อย่างไร?


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. มันสมเหตุสมผลหรือไม่ที่จะใช้ NPM ซึ่งเป็นตัวจัดการแพ็กเกจที่แตกต่างจากระวังภายใต้ห้าม?
  2. ถ้าคำตอบสำหรับ (1) คือใช่แล้วจะติดตั้ง npm บน NixOS ได้อย่างไร? ฉันไม่เห็น npm พร้อมใช้งานเมื่อค้นหาผ่านnix-envเนื่องจาก$ nix-env -qa npmไม่ตรงกับการพิสูจน์

วิธีที่ถูกต้องในการติดตั้งwebpack-dev-serverบน NixOS คืออะไร?


แก้ไข

ฉันพยายามติดตั้งwebpack-dev-serverตามลิงก์ความคิดเห็นและสามารถติดตั้งnode2nixได้ แต่ไม่สามารถติดตามผ่านในขั้นตอนที่ 2 ที่แสดงใน readme ที่นั่น

ฉันพบไฟล์ที่อ้างอิงในขั้นตอนที่ 2 ใน/nix/storeเวลา

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

ฉันสามารถเปิดไฟล์นั้นเพื่อดูแพ็กเกจ npm ที่แสดงรายการ แต่สิทธิ์อนุญาตเป็นแบบอ่านอย่างเดียวแม้แต่ทำงานด้วย sudo - ดังนั้นฉันจะต้องแก้ไขสิทธิ์เพื่อเปลี่ยนมัน

ดูเหมือนว่าฉันไม่ควรแก้ไข/nix/storeไฟล์นี้โดยตรงและควรจัดการไฟล์ดังกล่าวทางอ้อมผ่านทางห้าม ฉันแก้ไขถูกต้องหรือไม่ว่าไม่ควรแก้ไขไฟล์นี้โดยตรง ถ้าเป็นเช่นนั้นฉันจะทำขั้นตอนที่ 2 ได้อย่างไรโดยใช้ nix หรือบางอย่างเพื่อเพิ่มwebpack-dev-serverเข้าไป



@EmmanuelRosa ขอบคุณสำหรับลิงค์; ฉันพยายามทำตามคำแนะนำที่นั่นและอัปเดตคำถามนี้ตามผลลัพธ์ของความพยายามนั้น
mherzl

/nix/storeเป็นแบบอ่านอย่างเดียว คุณต้องโคลน repo คอมไพล์และใช้-I nixpkgs=/path/to/repoสำหรับnix-*คำสั่ง
wizzup

คำตอบ:


15

มีหลายวิธีในการใช้แพ็กเกจ npm ผ่าน nix:

สำหรับโครงการส่วนบุคคลของฉันฉันใช้nix-shellภายในเชลล์ฉันใช้สคริปต์ npmเพื่อป้องกันความต้องการแพคเกจทั่วโลกของ npm (เช่นเดียวกับอึก) กระบวนการมีลักษณะดังนี้ (และอาจคล้ายกับไหมพรมมาก):

$ 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

ซึ่งจะทำให้ห้ามจัดการแพคเกจ NPM ทั้งหมดในโครงการ

มันอาจเป็นความคิดที่ดีที่จะทำความคุ้นเคยกับ nix-shell เนื่องจากพยายามติดตั้งโหนดแพ็กเกจ / การพึ่งพาใด ๆ ในโปรไฟล์ nix ของคุณ (ผ่าน nix-env หรือ nox) เอาชนะจุดประสงค์ของ nix โดยทำให้เนมสเปซ "global"


คุณช่วยขยายความเกี่ยวกับแพ็คเกจโดยใช้ binding.gyp ตัวอย่างเช่น: github.com/mateogianolio/nblas
CMCDragonkai

1
ฉันพบวิธีทำสำหรับแพ็คเกจไบนารี คุณต้องการnodePackages_6_x.node-gypและไลบรารี่อื่น ๆ เช่นblasกันเมื่อรวมเข้าด้วยกันคุณสามารถใช้npm install ....แพ็คเกจที่ใช้ node-gyp
CMCDragonkai

1
เกี่ยวกับวิธีแรกเป็นทางเลือกที่npm scriptsแก้ปัญหาผมพบว่าการเพิ่มแพคเกจ NPM ทั่วโลกที่จะมีประสิทธิภาพเช่นnix-shell nix-shell -p nodejs-8_x nodePackages.grunt-cli(คำเตือน: nixos และ node noob ที่นี่)
Ryne Everett

สิ่งหนึ่งที่ฉันไม่เข้าใจเกี่ยวกับวิธีแรกคือวิธีการติดตั้งแพคเกจตัวเองจริง ๆ แล้วเช่นนั้นไบนารีสำหรับแพ็กเกจของโครงการจะbinจบลงที่ใด
Ryne Everett

@ Ryne-Everett หากคุณทำงานnpm install, executables node_modules/.binจะถูกเชื่อมโยงเข้า ดูที่นี่
Luke Adams

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-env -f '<nixpkgs>' -qaPA nodePackages | grep tern
zaynetro

ส่วนใหญ่เหล่านี้ไม่ได้อยู่ในเนมสเปซรูทเพราะจะทำให้การค้นหาปกติช้าลง มันเหมือนกับแพ็คเกจ Haskell เนมสเปซของพวกเขาใหญ่เกินไป
user239558

3

เป็นทางเลือกฉันยังพบความคิดเห็นของ CMCDragonkai เกี่ยวกับปัญหา Nixpkgs # 3393 :

ฉันเพิ่งพบว่าคุณสามารถเปลี่ยนไดเรกทอรีคำนำหน้าของ NPM สิ่งที่ต้องการ:

npm config set prefix '~/mutable_node_modules.

สิ่งนี้อนุญาตให้คุณใช้การติดตั้งส่วนกลางของ NPM

ดังนั้นจึงเป็นไปได้ที่จะหลีกเลี่ยงโมเดลที่ใช้งานได้อย่างหมดจดโดยเปลี่ยนเส้นทางเอาต์พุตไปที่อื่นที่ไม่ได้จัดการโดย Nix แต่ฉันคิดว่ามันเอาชนะจุดประสงค์ของการใช้ Nix และไม่ใช่ทุกซอฟต์แวร์เดียวที่จะรองรับการเปลี่ยนแปลงการกำหนดค่าเหล่านี้

ถึงกระนั้นฉันก็รู้สึกว่ามันเป็นเรื่องยุ่งยากมากที่จะต้องสลับไปมาระหว่างการใช้nix-env งานแพ็กเกจโหนดทั่วโลกปกติและเอ็นพีเอ็มสำหรับแพ็คเกจการพัฒนา ฉันเดาว่าเป็นเหตุผลที่มีเลเยอร์การย้ายข้อมูลเหล่านั้นเช่น "npm2nix"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.