ฉันจะตัดสินใจได้อย่างไรว่า @ type / * เข้าสู่ "dependencies" หรือ "devDependencies" ได้อย่างไร


200

ฉันใช้ TypeScript 2 ในโครงการของฉัน ฉันต้องการใช้ไลบรารี js บางตัว แต่ก็มีการพิมพ์สำหรับห้องสมุดนั้นด้วย npm install @types/some-libraryฉันสามารถติดตั้งประเภทด้วยง่าย ฉันไม่แน่ใจว่าฉันควร--saveหรือ--save-devพวกเขา สำหรับฉันแล้วดูเหมือนว่า DefinetelyTyped GitHub readme เป็นประเภทที่กล่าวถึงทั้งสองรุ่น แต่ไม่เคยอธิบายเลย ฉันคิดว่า @types ควรจะอยู่ในdevDependenciesเป็นประเภทที่มีความจำเป็นสำหรับการพัฒนาและไม่ได้ใช้ในการรันไทม์ แต่ผมเห็น @types dependenciesหลายครั้งในเวลาเพียง ฉันสับสน

ฉันจะตัดสินใจได้อย่างไรว่า @ type / * เข้าสู่dependenciesหรือdevDependenciesไม่? จริงๆแล้วมีคำแนะนำอย่างเป็นทางการบ้างหรือไม่?


คุณกำลังสร้างกลุ่มหรือเป็นแพ็คเกจที่ผู้อื่นจะใช้หรือไม่ อย่างที่ฉันเห็นคุณจำเป็นต้องสร้างความแตกต่างระหว่างdependenciesและdevDependenciesในกรณีหลัง
Valentin

ฉันทำบางเกมเป็น js / ts ตั้งแต่เริ่มต้น ฉันรวมทุกอย่างเข้ากับ webpack ไม่มีแบ็กเอนด์เลยตู้เอทีเอ็ม แต่เป็นไปได้ที่ฉันจะห่อทุกอย่างไว้ในอิเล็กตรอนเพื่อให้เป็นแบบสแตนด์อโลนในบางวัน ฉันไม่คิดว่าทุกคนจะใช้มันเป็นแอพพลิเคชั่นของตัวเอง แต่ฉันคิดว่ามันเป็นไปได้ (คิดว่ามินิเกมในเกม GTA และเกมของฉันเป็นโอเพ่นซอร์ส) ยังฉันต้องการเรียนรู้และปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดและเป็นเหตุผลหลักที่ทำให้เกมนั้น ฉันหวังว่าฉันจะอธิบายกรณีใช้ของฉันให้ดีพอ :)
kamyl

1
ใช่มันสมเหตุสมผลแล้วต้องการให้แน่ใจว่าคำตอบดั้งเดิมของฉันนั้นเกี่ยวข้องกับกรณีการใช้งานของคุณ ฉันยังคิดว่าความแตกต่างระหว่างdevDependenciesและdependenciesไม่เกี่ยวข้องเมื่อสร้างกลุ่มเป็นสิ่งที่create-react-appบังคับใช้เช่นกันแต่ท้ายที่สุดก็ขึ้นอยู่กับคุณที่จะเลือก
Valentin

คำตอบ:


140

สมมติว่าคุณกำลังพัฒนาแพ็คเกจ "A" ที่มี @ types / แพ็คเกจโมดูลบางส่วนใน devDependencies ด้วยเหตุผลบางประการที่คุณส่งออกประเภทจาก @ types / some-module

import {SomeType} from 'some-module';
export default class APackageClass {
     constructor(private config: SomeType) {

     }
}

ในตอนนี้ผู้ใช้ typescript ของแพ็คเกจ "A" ไม่สามารถเดาได้ว่า SomeType คืออะไรเนื่องจากไม่ได้ติดตั้ง devDependencies ของแพ็คเกจ "A"

ในกรณีดังกล่าวคุณต้องวาง @ types / * แพ็คเกจด้วย "การอ้างอิง" ปกติ สำหรับกรณีอื่น ๆ "การพึ่งพา" ดีพอ


7
คุณหมายความว่าถ้าฉันใช้เฉพาะประเภทในการนำไปใช้งานมันเป็นนิยามประเภทได้devDependenciesหรือไม่
Franklin Yu

7
ใช่ @ FranklinYu dependenciesเร็วที่สุดเท่าที่เป็นชนิดที่ปรากฏในแฟ้มการประกาศคุณจะต้องวางไว้บน ไม่งั้นdevDependenciesก็ดี
wookieb

1
แต่แพ็คเกจนั้นใช้ได้ทั้ง TS และ JS นักพัฒนา JS ไม่ต้องการประเภทเหล่านั้นในการรวบรวมรหัสของพวกเขา การเพิ่มการกำหนดประเภทให้dependenciesจะทำให้ต้นไม้พึ่งพาได้ป่อง
Tyler Long

1
@TylerLong ถูกต้อง มันไม่สมบูรณ์แบบ แต่นั่นคือความเป็นจริง นอกจากนี้คุณยังสามารถใช้ "ตัวเลือกพึ่งพา" แต่ฉันเชื่อว่าในระดับที่อาจน่ารำคาญมาก
wookieb

55

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

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

ตัวอย่างที่รู้จักกันดีของการปฏิบัตินี้ IRL คือcreate-react-appโดยปกติแล้วแผ่นสำเร็จรูปสำเร็จรูปที่ไม่ได้ถูกปล่อยออกมามันจะสร้างสถานที่ทุกอย่างในdependenciesดูหัวข้อนี้และคำตอบนี้


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

1
@Yogu นั่นเป็นเหตุผลที่ฉันสร้างความแตกต่างตั้งแต่แรกดังนั้นใช่ฉันเห็นด้วยกับคุณอย่างสมบูรณ์
Valentin

13
ฉันไม่เห็นด้วยกับคำแนะนำนี้ devDependenciesไม่ได้รับการติดตั้งเมื่อคุณทำnpm install --production(หรือnpm ci --production) และไม่สามารถใช้งานได้เมื่อเรียกใช้รหัสการผลิต นี่คือความแตกต่างที่มีความหมายมากสำหรับบริการไม่ใช่แค่ห้องสมุด
แบรดวิลสัน

2
@BradWilson คุณมีจุดมีเวิร์กโฟลว์ npm จำนวนมากภายใต้ดวงอาทิตย์ถ้ากรณีการใช้งานของคุณต้องการให้คุณสร้างความแตกต่างแล้วโดยวิธีทั้งหมดทำมัน รู้สึกอิสระที่จะให้คำตอบของคุณเองสำหรับปัญหานี้
Valentin

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

15

ในกรณีเฉพาะของการปรับใช้แอปพลิเคชัน Node.js เพื่อการผลิตหนึ่งต้องการติดตั้งเฉพาะการอ้างอิงที่จำเป็นในการเรียกใช้แอปพลิเคชัน

npm install --production หรือ

npm ci --production หรือ

yarn --production

ในกรณีดังกล่าวประเภทควรอยู่ในdevDependenciesเพื่อป้องกันการติดตั้ง

หมายเหตุ: ฉันรู้ว่าสิ่งนี้ถูกกล่าวถึงในความคิดเห็นโดยแบรดวิลสันถึงคำตอบอื่น แม้ว่าจุดนี้น่าจะเป็นคำตอบก็ตาม

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