การใช้ npm เพื่อติดตั้งหรืออัปเดตแพ็คเกจที่จำเป็นเช่นเดียวกับบันเดิลเลอร์สำหรับรูบี้


88

ฉันรักBundlerมันยอดเยี่ยมในการจัดการการพึ่งพา ฉันชอบnpm การติดตั้งแพ็คเกจโหนดนั้นง่ายมาก! ฉันมีแอพ nodejs และชอบที่จะระบุการอ้างอิงแอพของฉันและติดตั้ง / อัปเดตได้อย่างง่ายดายทุกที่ที่ฉันปรับใช้แอพของฉัน นี่ไม่ใช่ไลบรารีที่ฉันเปิดตัว แต่เป็นเว็บแอปเต็มรูปแบบ

ฉันรู้npm bundleคำสั่ง แต่ดูเหมือนว่าจะลบล้างไดเร็กทอรีที่ติดตั้งแพ็คเกจ

ฉันคุ้นเคยกับการใช้บันเดิลเลอร์ในลักษณะนี้:

# Gemfile
gem "rails", "3.0.3"

ติดตั้งราง v3.0.3 และอัญมณีอื่น ๆ ที่จำเป็นบนเครื่องโฮสต์เฉพาะในกรณีที่ไม่มีอยู่แล้ว

> bundle install

ฉันจะบรรลุสิ่งที่คล้ายกันกับ npm ได้อย่างไร


คำตอบของฉันไม่ใช่สิ่งที่คุณอยากรู้?
Alfred

คำตอบ:


148

เมื่อถึง npm 1.0 (ซึ่งตอนนี้เป็นสิ่งที่คุณจะได้รับตามค่าเริ่มต้นหากคุณทำตามขั้นตอนในไฟล์ README) "บันเดิล" ไม่ใช่สิ่งที่แยกออกจากกันอีกต่อไป แต่เป็นเพียง "วิธีการทำงาน"

ดังนั้น:

  1. วางpackage.jsonไฟล์ในรูทของโปรเจ็กต์ของคุณ
  2. แสดงรายชื่อทีมของคุณในไฟล์นั้น

    { "name" : "my-project"
    , "version" : "1.0.0"
    , "dependencies" : { "express" : "1.0.0" } }
    
  3. npm install เนื่องจากคุณกำลังเรียกสิ่งนี้โดยไม่มีอาร์กิวเมนต์และไม่ได้อยู่ในโหมดโกลบอลมันจะติดตั้งเดปทั้งหมดของคุณในเครื่อง

  4. require("express") และมีความสุข

2
เมื่ออยู่ในการผลิตฉันขอแนะนำอย่างยิ่งให้เปลี่ยน local your_app/node_modulesdirectory เป็น symlink นอกไดเรกทอรีแอปของคุณ คุณไม่ต้องการดาวน์โหลดสร้างและติดตั้งการอ้างอิงทุกครั้งที่คุณปรับใช้
Daniel Beardsley

ตกลง. จะเกิดอะไรขึ้นหากฉันลืมอัปเดต package.json มีวิธีใดที่จะบังคับให้ NPM ไม่มองหา package.json แต่เป็นแพ็คเกจที่ฉันใช้ในรหัสของฉัน
Pono

4
นี่ไม่ถูกต้องเสียทีเดียว NPM จะติดตั้งการอ้างอิงทั้งหมดสำหรับข้างต้นmy-projectใน./node_modules/my-project/node_modules. ฉันไม่แน่ใจว่ามีวิธีที่สะดวกในการติดตั้งการอ้างอิงทั้งหมดใน./node_modules ทุกคนหรือไม่?
Daniel Beardsley

@DanielBeardsley ฉันไม่คิดว่านั่นเป็นวิธีการทำงานของ npm หากคุณเห็นพฤติกรรมดังกล่าวและสามารถทำซ้ำได้โปรดโพสต์ปัญหาในหน้า npm github
isaacs

2
เห็นด้วยกับ @DanielBeardsley ฉันต้องทนทุกข์ทรมานจากพฤติกรรมนั้นแม้จะมี npm 1.1.70
Graffic

10

แก้ไข: ใช้กับเวอร์ชัน npm เท่านั้น <1.0


มันเป็นเรื่องยากมากที่จะคิดออกนี้ แต่NPM ทำให้เป็นไปได้นี้

คุณต้องมีส่วนประกอบสามอย่าง

  1. ไดเร็กทอรีย่อยในที่เก็บของคุณ (เช่นdeps/)
  2. package.jsonไฟล์ในไดเรกทอรีดังกล่าวข้างต้นที่อ้างอิงรายการ
  3. index.jsไฟล์ในไดเรกทอรีดังกล่าวข้างต้นที่ต้องใช้การอ้างอิงของคุณ

ตัวอย่าง

ลองนึกภาพว่าExpressเป็นที่พึ่งเดียวของคุณ

deps / package.json

หมายเหตุ:เพิ่มเวอร์ชัน # ทุกครั้งที่คุณแก้ไขการอ้างอิง

{
  "name": "myapp_dependencies",
  "version": "0.0.1",
  "engines": {
    "node": "0.4.1"
  },
  "dependencies":{
    "express": "2.0.0beta2"
  }
}

deps / index.js

export.modules = {
  express: require('express')
  //add more
}

ตอนนี้คุณควรจะสามารถติดตั้งการอ้างอิงของคุณโดยใช้ npm คุณสามารถทำให้เป็นส่วนหนึ่งของกระบวนการทำให้ใช้งานได้

cd deps
npm install

จากนั้นภายในรหัสแอปของคุณคุณสามารถเข้าถึง Express เวอร์ชันเฉพาะของคุณได้ดังนี้:

var express = require('myapp_dependencies').express;

ขอบคุณนี่เป็นวิธีที่ดีที่สุดที่ฉันเคยเห็นมา อย่างไรก็ตามrequire('express')ใน deps / index.js จะไม่เพียงแค่นำเข้า Express เวอร์ชันล่าสุดและไม่จำเป็นต้องเป็นเวอร์ชันที่เราติดตั้ง ฉันเป็น nodeJS noob ดังนั้นโปรดอดทนกับฉัน
adamJLev

ไม่นั่นคือความมหัศจรรย์ของการnpm installเพิ่ม symlink ภายในไดเร็กทอรีของแพ็คเกจที่คุณติดตั้งไปยังเวอร์ชันที่ถูกต้องของแพ็กเกจที่เกี่ยวข้อง เมื่อต้องการแพ็กเกจการอ้างอิงของคุณให้require('express')ตรวจสอบไดเร็กทอรีโลคัลก่อนและค้นหา symlink ไปยังเวอร์ชันที่ถูกต้องของ express
Daniel Beardsley

5

คุณควรอ่านบทความทั้งสองนี้จากบล็อก Isaacs (ผู้เขียน npm) ฉันคิดว่าพวกเขาดีจริงๆและฉันเชื่อว่าบอกคุณได้ว่าจะบรรลุเป้าหมายได้อย่างไร:

  1. http://blog.izs.me/post/1675072029/10-cool-things-you-pro อาจ-didnt-realize-npm-could-do
  2. http://foohack.com/2010/08/intro-to-npm/

ฉันเชื่อว่าลิงก์ # 1 (จุด # 11) อธิบายสิ่งนี้:

11: รวมการอ้างอิงทั้งหมดของคุณไว้ในแพ็คเกจเอง

เมื่อคุณใช้คำสั่ง npm bundle npm จะใส่การอ้างอิงทั้งหมดของคุณลงในโฟลเดอร์ node_modules ในแพ็คเกจของคุณ แต่มันไม่ได้หยุดเพียงแค่นั้น

หากคุณต้องการพึ่งพาสิ่งที่ไม่ได้อยู่ในรีจิสทรีคุณสามารถทำได้ เพียงทำสิ่งนี้:

npm บันเดิลติดตั้ง http://github.com/whoever/whatever/tarball/master สิ่งนี้จะติดตั้งเนื้อหาของ tarball นั้นลงในบันเดิลจากนั้นคุณสามารถแสดงรายการเป็นการอ้างอิงและจะไม่พยายามติดตั้งเมื่อ แพ็คเกจของคุณได้รับการติดตั้ง

นอกจากนี้ยังมีประโยชน์หากคุณมีส้อมของคุณเองและไม่ต้องการเปลี่ยนชื่อ

ในความเป็นจริงคุณสามารถรันคำสั่ง npm ได้เกือบทุกคำสั่งที่บันเดิล หากต้องการดูว่ามีอะไรอยู่ข้างในคุณสามารถทำ npm bundle ls ในการลบบางสิ่งบางอย่างให้ทำ npm bundle rm thing และแน่นอนคุณสามารถติดตั้งหลายเวอร์ชันและเปิดใช้งานเวอร์ชันที่คุณต้องการได้


สิ่งนี้มีประโยชน์แม้ว่าจะไม่ใช่สิ่งที่ฉันกำลังมองหา บางทีฉันอาจต้องเพิ่มคำชี้แจง ฉันกำลังมองหาวิธีติดตั้งหรืออัปเดตโดยอัตโนมัติ (บนเครื่องปลายทาง) แพ็กเกจ NPM ของฉันขึ้นอยู่กับเมื่อใดก็ตามที่ฉันปรับใช้ ดูเหมือนว่าnpm bundleจะใช้เพื่อรวบรวมการอ้างอิงทั้งหมดของคุณลงในไดเร็กทอรีเฉพาะนอกเหนือจากค่าเริ่มต้น ฉันอาจจะคิดวิธีแก้ปัญหาของตัวเองที่ทำงานคล้ายกับbundle install( bundlerสำหรับทับทิม)
Daniel Beardsley

1
มีเพียงหมายเหตุตั้งแต่npmเวอร์ชัน 1.0+ npm bundleถูกลบออกไป เพียงใช้npm installคำสั่งที่ไม่มีชื่อแพ็กเกจมันจะอ่าน package.json และดึงแพ็คเกจที่ต้องการลงมา
Arthur Maltson

2

ตั้งแต่ Npm เวอร์ชัน 1.1.2 มีคำสั่งใหม่npm shrinkwrapที่สร้างnpm-shrinkwrapped.jsonไฟล์คล้ายกับGemfile.lock. สิ่งสำคัญคือต้องทำเพื่อป้องกันซอฟต์แวร์เน่า (ดูเหตุผลของ Bundler ) โดยเฉพาะอย่างยิ่งเนื่องจาก Nodejs มีชุมชนที่เคลื่อนไหวอย่างรวดเร็ว

ในขณะที่bundle installสร้างGemfile.lockโดยอัตโนมัติnpm installจะไม่สร้างnpm-shrinkwrapped.json(แต่จะใช้เมื่อมีอยู่) npm shrinkwrapดังนั้นคุณต้องจำไว้ใช้

อ่านคำแนะนำแบบเต็มได้ที่http://blog.nodejs.org/2012/02/27/managing-node-js-dependencies-with-shrinkwrap/


2

สำหรับฉันแล้วดูเหมือนว่าวิธีแก้ปัญหาที่ง่ายที่สุดคือการใช้package.jsonไฟล์ที่privateตั้งค่าสถานะ (เพิ่มใน npm เมื่อเดือนที่แล้ว) เป็นtrue. ด้วยวิธีนี้คุณสามารถเรียกใช้npm installหรือเรียกใช้npm bundleการอ้างอิงของโปรเจ็กต์ของคุณได้ แต่คุณป้องกันไม่ให้ใครก็ตามเผยแพร่โปรเจ็กต์ที่ไม่ใช่สาธารณะของคุณโดยไม่ได้ตั้งใจ

นี่คือตัวอย่างpackage.json:

{
"name": "yourProject"
,"version": "1.0.0"
,"dependencies": { "express" : ">=2.1.0" }
,"private": true
}

การรันnpm installจะติดตั้งexpressบนระบบโลคัลหากยังไม่มีอยู่ การรันnpm publishทำให้เกิดข้อผิดพลาดเนื่องจากไฟล์"private": true.

คุณและทีมของคุณสามารถใช้แท็กเวอร์ชันภายในเพื่อติดตามการเปลี่ยนแปลงการอ้างอิงเมื่อเวลาผ่านไปทุกครั้งที่คุณเปลี่ยนการอ้างอิง npm ls installedเพื่อดูว่ารุ่นที่คุณได้ติดตั้งการใช้งาน


ฉันคิดว่าคุณไม่ควรพูดtrueและมันใช้งานได้เพราะสตริงเป็นค่าที่แท้จริง (นั่นคือ!!"false" === true)
Camilo Martin

1

เผยแพร่แอปของคุณด้วยnpmและแสดงรายการการอ้างอิงในไฟล์ package.json ของคุณ

เมื่อมีคนใช้ npmเพื่อติดตั้งแพ็คเกจของคุณnpmจะดูแลแก้ไขการอ้างอิง

ข้อมูลจำเพาะของแพ็คเกจ: http://wiki.commonjs.org/wiki/Packages/1.0


ใช่ แต่นี่เป็นเว็บแอปที่ไม่ใช่โอเพนซอร์ซ หากคุณมีความคิดที่ไม่เกี่ยวข้องกับการเผยแพร่แอปโปรดแก้ไขคำตอบของคุณหรือสร้างใหม่
Daniel Beardsley

1
จากนั้นเผยแพร่แพ็คเกจเช่น "myapp-dependencies" ที่ผู้ใช้ของคุณสามารถใช้npmเพื่อติดตั้งก่อนที่จะติดตั้งแอปของคุณ ฉันไม่คิดว่าจะมีgemโหนดอื่นเทียบเท่ากับ node.js
Dan Grossman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.