คุณจะป้องกันการติดตั้งโมดูล "devDependencies" NPM สำหรับ Node.js (package.json) ได้อย่างไร


587

ฉันมีสิ่งนี้ในไฟล์ package.json ของฉัน (เวอร์ชั่นย่อ):

{
  "name": "a-module",
  "version": "0.0.1",
  "dependencies": {
    "coffee-script":      ">= 1.1.3"
  },
  "devDependencies": {
    "stylus":             ">= 0.17.0"
  }
}

ฉันใช้ NPM เวอร์ชั่น 1.1.1 บน Mac 10.6.8

เมื่อฉันรันคำสั่งต่อไปนี้จากรูทโปรเจ็กต์มันจะติดตั้งทั้งสองdependencies และ devDependencies :

npm install

ฉันรู้สึกว่าคำสั่งนี้ติดตั้งdevDependencies:

npm install --dev

ฉันจะทำให้มันดังนั้นnpm installเฉพาะการติดตั้งdependencies(เพื่อให้สภาพแวดล้อมการผลิตเพียงได้รับโมดูลเหล่านั้น) ในขณะที่บางอย่างเช่นnpm install --devการติดตั้งทั้งในdependenciesและdevDependencies?


1
ตามเอกสารคุณถูกต้อง --dev ติดตั้ง devdeps มิฉะนั้นเฉพาะ deps npmjs.org/doc/json.html ฉันรู้ว่ามันใช้งานได้กับแพ็คเกจที่มีชื่ออย่างน้อย
mna

1
ถ้าคุณเจอคำถามนี้ในปี 2558 สวิตช์ - เซฟเวอร์จะทำตามที่ถามไว้ในคำถามนี้
Anand

1
stackoverflow.com/a/22004559/3718119คำตอบนี้ให้คำอธิบายที่ดีเกี่ยวกับความแตกต่างระหว่างdependenciesและdevDependenciesและเมื่อใช้แต่ละข้อ
quasoft

คำตอบ:


844

npm installคำสั่งจะติดตั้งdevDependenciesพร้อมอื่น ๆdependenciesเมื่อเรียกใช้ภายในไดเรกทอรีแพคเกจในการพัฒนาสภาพแวดล้อม (ค่าดีฟอลต์)

ใช้npm install --only=prod(หรือ--only=production) เพื่อติดตั้งเท่านั้น dependenciesและไม่devDependencies,คำนึงถึงค่าของNODE_ENVตัวแปรสภาพแวดล้อม

ที่มา: เอกสาร npm

หมายเหตุ:ก่อนเวอร์ชัน 3.3.0 ของ NPM (2015/08/13) ตัวเลือกที่ถูกเรียกว่าคือ--productionnpm install --production


2
เหตุผลของอาเกตนั้นอาจจะเป็นการลบ devDependencies เพื่อให้ผู้บริโภคที่ติดตั้งแพ็คเกจของคุณnpm install yourpackage.tgzไม่ได้รับ devDependencies อย่างไรก็ตามนั่นเป็นกรณีที่เกิดขึ้นแล้ว ดูคำตอบของ Kevin Cox ด้านล่าง ( stackoverflow.com/a/15826602/825588 )
โยฮัน

5
npmjs.org/doc/cli/npm-install.html "โดยค่าเริ่มต้นการติดตั้ง npm จะติดตั้งโมดูลทั้งหมดที่แสดงรายการเป็นการพึ่งพาด้วย - แฟล็กการผลิต npm จะไม่ติดตั้งโมดูลที่ระบุไว้ใน devDependencies"
tomByrer

14
โอ้พระเจ้า. ฉันมีทั้งหมดNODE_ENV=productionจากสิ่งอื่นที่ฉันทำและไม่สามารถคิดออกมาเพื่อชีวิตของฉันทำไมnpm installจะไม่ติดตั้งการอ้างอิง ขอบคุณสำหรับคำตอบอย่างละเอียด
aendrew

1
npm install --dev จะติดตั้งการขึ้นต่อกันของ dev เท่านั้น
Rustem K

10
สำหรับ npm 3.3 ขึ้นไป: npm WARN ติดตั้งการใช้งาน--devตัวเลือกจะถูกคัดค้าน ใช้--only=devแทน
srcspider

232

ฉันพบปัญหาเช่นกัน! การติดตั้ง npm ค่อนข้างสับสนและเว็บโพสต์ยังคงนำมาซึ่งแฟล็ก -d / - dev ราวกับว่ามีโหมดการติดตั้ง 'การพัฒนา' ที่ชัดเจน

  • npm installจะติดตั้งทั้ง "การอ้างอิง " และ " devDependencies "

  • npm install --productionจะติดตั้ง "การอ้างอิง " เท่านั้น

  • npm install --devจะติดตั้ง " devDependencies " เท่านั้น


29
คำเตือน: ถ้าNODE_ENVถูกตั้งค่าเป็นproductionและคุณเรียกใช้npm installมันจะไม่ติดตั้งการพึ่งพา dev ฉันพบปัญหานี้ใน Dockerfile ของฉัน
vaughan

1
@vaughan ฉันเคยพบเจอสิ่งนี้ด้วยเช่นกันสามารถแก้ไขได้ด้วยการวิ่งnpm --production=false install(แม้ว่าจะไม่แน่ใจว่าสิ่งนี้จะใช้ได้กับธง --dev)
Bavell

138

ตัวเลือกใหม่คือ:

npm install --only=prod

ถ้าคุณต้องการติดตั้ง devDependencies เท่านั้น:

npm install --only=dev

1
คำตอบนี้ตรงข้ามกับคำถาม OP จะถามว่าจะไม่ติดตั้ง devDependencies ได้อย่างไร
musicin3d

2
คุณถูกต้องบางส่วน @ musicin3d นั่นคือเหตุผลในส่วนแรกที่ฉันตอบวิธีการติดตั้ง prod เท่านั้นและในส่วนที่สองวิธีการติดตั้ง dev พึ่งพาเท่านั้นในกรณีที่
Cloxure

5
สวัสดี. ผมออกจากความคิดเห็นที่ก่อน @ user1614572 --only=prodเพิ่มส่วนที่เกี่ยวกับ คุณครับถูกต้องบางส่วน ; P
musicin3d

เราสามารถรวมการพึ่งพาแยกต่างหากสำหรับการปรับใช้?
Jeeva Jsb

1
มันเป็นความคิดเห็นไม่ใช่คำตอบ ฉันไม่ไปตรวจสอบความคิดเห็นทั้งหมดของฉันเป็นระยะ ฉันไม่เคยเห็นผู้คนไปอัปเดตความคิดเห็นเมื่อหลายปีก่อน โดยทั่วไปคุณมาที่นี่เพื่อวิจารณ์ว่าฉันแสดงความคิดเห็นเป็นปี ฉันจะไม่ตอบสนองต่อไป ขอให้สนุกหลอกหลอนผู้อื่น
Jacques ジャック

47

หากคุณอ่าน POST นี้ในปี 2559 โปรดบรรลุสิ่งที่คุณต้องการโดยใช้

--only={prod[uction]|dev[elopment]} 

อาร์กิวเมนต์จะทำให้มีเฉพาะ devDependencies หรือเฉพาะการติดตั้งที่ไม่ใช่ devDependencies โดยไม่คำนึงถึง NODE_ENV

จาก: https://docs.npmjs.com/cli/install


ทำไมต้องใช้ประโยชน์จาก "POST" docs.npmjs.com/cli/installอย่างชัดเจนทั้งเอกสารและ--production --only={prod[uction]|dev[elopment]}
Dan Dascalescu

33

หากคุณติดตั้งการอ้างอิงทั้งหมดแล้วและคุณต้องการหลีกเลี่ยงการดาวน์โหลดแพคเกจการผลิตจาก NPM อีกครั้งคุณสามารถพิมพ์:

npm prune --production

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

  1. Webpack โครงการของฉันโดยใช้การอ้างอิง dev
  2. สร้างอิมเมจ Docker โดยใช้โมดูลการผลิตเท่านั้น

ทำงานnpm pruneในระหว่างจะช่วยให้คุณไม่ต้องติดตั้งทุกอย่าง!


19

เมื่อใช้ "npm install" โมดูลจะถูกโหลดและพร้อมใช้งานตลอดทั้งแอปพลิเคชันของคุณโดยไม่คำนึงว่าเป็น "devDependencies" หรือ "dependencies" ผลรวมของความคิดนี้: ทุกสิ่งที่ package.json ของคุณกำหนดว่าเป็นการพึ่งพา (ชนิดใดก็ได้) จะถูกติดตั้งใน node_modules

จุดประสงค์สำหรับความแตกต่างระหว่างการพึ่งพา / devDependencies / optionalDependencies คือสิ่งที่ผู้บริโภคของโค้ดของคุณสามารถทำได้ด้วย / npm เพื่อติดตั้งทรัพยากรเหล่านี้

ตามเอกสาร: https://npmjs.org/doc/json.html ...

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

ในกรณีนี้เป็นการดีที่สุดที่จะแสดงรายการเพิ่มเติมเหล่านี้ในแฮชการอ้างอิง

สิ่งเหล่านี้จะถูกติดตั้งทุกครั้งที่มีการตั้งค่าแฟล็ก --dev แฟล็กนี้ถูกตั้งค่าโดยอัตโนมัติเมื่อทำการลิงก์ npm หรือเมื่อทำการติดตั้ง npm จากรูทของแพ็กเกจและสามารถจัดการได้เหมือนกับพารามิเตอร์การกำหนดคอนฟิก npm อื่น ๆ ดู config (1) สำหรับข้อมูลเพิ่มเติมในหัวข้อ

อย่างไรก็ตามหากต้องการแก้ไขคำถามนี้หากคุณต้องการติดตั้งเฉพาะ "การอ้างอิง" โดยใช้ npm คำสั่งต่อไปนี้คือ:

npm install --production

สิ่งนี้สามารถยืนยันได้โดยดูที่การคอมมิท Git ซึ่งเพิ่มตัวกรองนี้ (พร้อมกับตัวกรองอื่น ๆ [รายการด้านล่าง] เพื่อมอบฟังก์ชันการทำงานนี้)

ตัวกรองสำรองที่สามารถใช้งานได้โดย npm:

--save          => updates dependencies entries in the {{{json}}} file
--force         => force fetching remote entries if they exist on disk 
--force-latest  => force latest version on conflict
--production    => do NOT install project devDependencies
--no-color      => do not print colors

@dmarr ลองใช้การติดตั้ง npm --production


16

NPM จะติดตั้งการพึ่งพา dev เมื่อติดตั้งจากภายในแพคเกจ (ถ้ามีpackage.jsonในไดเรกทอรีปัจจุบัน) ถ้ามาจากตำแหน่งอื่น (รีจิสทรี npm, git repo, ตำแหน่งอื่นในระบบไฟล์) จะติดตั้งการอ้างอิงเท่านั้น


คุณกรุณาปรับโครงสร้างใหม่ได้ไหม ฉันคิดว่าคุณทำผิดพลาดในวงเล็บฉันคิดว่าคุณลืมปิดก่อนหน้านี้และ frase ของคุณไม่สมเหตุสมผลกับฉัน (ผู้พูดที่ไม่ใช่เจ้าของภาษา) ความคิดเห็นของโยฮันภายใต้คำตอบของโรฮันซิงห์ชี้ให้ฉันดูคำตอบของคุณ (เพราะความสงสัยของฉันเหมือนกันกับความสงสัยของโมรา) และไม่ประสบความสำเร็จ ผมก็ยังไม่ได้รับมันว่าจะไม่ติดตั้งการอ้างอิงของnpm install some-module dev some-module
Rafael Eyng

ขอบคุณคง อย่างไรก็ตามฉันไม่เข้าใจคำถามที่เหลือของคุณ
Kevin Cox

3

ฉันได้พบว่าเมื่อพยายามติดตั้ง dev dependencies สำหรับแพ็คเกจที่มีโหนด addon คุณไม่สามารถหลีกเลี่ยงการสร้าง addon เมื่อรัน npm install --dev แม้ว่าคุณต้องการติดตั้ง devDependencies ดังนั้นฉันต้องไปรอบหลังของ NPM:

node -e 'console.log( Object.keys( require( "./package.json" ).devDependencies ) );' | \
sed  -e "s/^[^']*'//" -e "s/'.*$//" | \
xargs npm install

หรือดีกว่า (และชัดถ้อยชัดคำ) ยัง

node -e 'Object.keys( require( "./package.json" ).devDependencies )
.map( function( item ){ console.log( item ) } );' | xargs npm install

3

ใช้npm install packageName --saveนี้จะเพิ่มแพคเกจในการอ้างอิงถ้าคุณใช้npm install packageName --save-devแล้วมันdevDependencies

npm install packageName --save-devควรใช้สำหรับเพิ่มแพ็คเกจเพื่อการพัฒนา เหมือนกับการเพิ่มแพ็คเกจ TDD (Chai, mocha, etc) ซึ่งใช้ในการพัฒนาไม่ใช่ในการผลิต


OP ไม่มีการอ้างอิงการบันทึกปัญหาpackage.jsonแต่เมื่อการอ้างอิงเหล่านี้ได้รับการบันทึกแล้ววิธีการบีบบังคับnpmให้ติดตั้งการพึ่งพาประเภทหนึ่งที่เฉพาะเจาะจงเท่านั้น เมื่อฉันอ่านคำตอบของคุณที่นี่ฉันไม่ได้เรียนรู้อะไรที่จะช่วยแก้ปัญหาที่เกิดจาก OP
หลุยส์

3

เป็นมูลค่าการกล่าวขวัญว่าคุณสามารถใช้NODE_ENVตัวแปรสภาพแวดล้อมเพื่อให้ได้ผลลัพธ์เดียวกัน มีประโยชน์อย่างยิ่งหากคุณกำลังใส่แอปพลิเคชั่นโหนดของคุณ (เช่น Docker)

NODE_ENV=production npm install

รหัสข้างต้นจะติดตั้งการอ้างอิงทั้งหมดของคุณ แต่คน dev (เช่นdevDependencies)

หากคุณจำเป็นต้องใช้ตัวแปรสภาพแวดล้อมของคุณDockerfileข้อมูลเพิ่มเติมสามารถพบได้ที่นี่

ตัวแปรสภาพแวดล้อมนั้นง่ายต่อการเขียนทับเมื่อใดก็ตามที่ต้องการ (เช่นถ้าคุณต้องการเรียกใช้ชุดทดสอบของคุณพูดกับ Travis CI) หากเป็นกรณีนี้คุณสามารถทำสิ่งนี้:

docker run -v $(pwd):/usr/src/app --rm -it -e NODE_ENV=production node:8 npm install

เอกสาร NPM ที่นี่

การผลิต

  • เริ่มต้น: เท็จ
  • ประเภท: บูลีนตั้งค่าเป็นจริงเพื่อให้ทำงานในโหมด "การผลิต"

    1. devDependencies ไม่ได้ติดตั้งที่ระดับสูงสุดเมื่อรันการติดตั้ง NPM ท้องถิ่นโดยไม่มีข้อโต้แย้งใด ๆ
    2. ตั้งค่า NODE_ENV = "การผลิต" สำหรับสคริปต์วงจรชีวิต

การบรรจุอย่างมีความสุข=)


3

npm ciฉันขอแนะนำให้ใช้ หากคุณต้องการติดตั้งเฉพาะแพ็คเกจที่จำเป็นต้องใช้งานจริง (ตามที่คุณเขียน - ไม่ใช้devDependencies) จากนั้น:

npm ci --only=production

หรือ

NODE_ENV=production npm ci

ถ้าคุณชอบโรงเรียนเก่าnpm installแล้ว:

npm install --production

หรือ

NODE_ENV=production npm install

นี่คือคำตอบที่ดีnpm ciทำไมคุณควรใช้


เจ๋งมันใช้ได้npm ciดีเหมือนกันไม่ใช่แค่npm install!
Klesun

2

จำเป็นต้องเพิ่มคำตอบที่เลือก: ณ ตอนนี้npm installในไดเรกทอรีแพ็คเกจ (บรรจุpackage.json) จะติดตั้ง devDependencies ในขณะที่npm install -gจะไม่ติดตั้ง


7
ใช่-gจะไม่ติดตั้งdevDependenciesแต่ติดตั้งแพคเกจทั่วโลกซึ่งมักจะไม่ได้ผลลัพธ์ที่ต้องการ
Bardi Harborow

0

npm install --productionเป็นวิธีที่ถูกต้องในการติดตั้งโมดูลโหนดที่จำเป็นสำหรับการผลิต ตรวจสอบเอกสารประกอบสำหรับรายละเอียดเพิ่มเติม


-1

ขณะนี้มีปัญหาหากคุณมี package-lock.json ด้วย npm 5+ npm install --productionคุณต้องเอามันออกไปก่อนที่จะใช้


-1
npm install --dev will install dev dependencies

และตามคำถามที่ต้องติดตั้งการอ้างอิงเท่านั้นคำสั่งต่อไปนี้จะช่วย

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