Як вирішити, чи @ типи / * переходять у "залежності" чи "devDependpendations"?


200

Я використовую TypeScript 2 у своєму проекті. Я хотів би використати деяку бібліотеку js, але і типізації для цієї бібліотеки. Я можу встановлювати типи з простими npm install @types/some-library. Я не впевнений, чи варто їм, --saveчи --save-devїм. Мені здається, що навіть DefinetelyTyped GitHub readme згадує обидві версії, але ніколи їх не пояснює. Я думаю, що @types має бути devDependencies, оскільки типи потрібні для розробки і не використовуються під час виконання, але я багато разів бачив @types dependencies. Я збентежений.

Як я повинен вирішити, чи входить @ type / * dependenciesабо devDependencies? Чи є насправді якісь більш-менш офіційні інструкції?


Ви генеруєте пакет чи це пакет, який будуть використовувати інші? Як я бачу, вам потрібно лише зробити відмінність між dependenciesі devDependenciesв останньому випадку.
Валентин

Я роблю якусь гру в js / t з нуля. Я в'яжу все з webpack. Атману немає взагалі, але можливо, я все це перекладу в Electron, щоб зробити його самостійним. Я не думаю, що хтось коли-небудь використовуватиме це як залежність у власному додатку, але я думаю, що це могло бути можливим (подумайте про міні-ігри в іграх GTA; і моя гра з відкритим кодом). Все ж я хочу вчитися та дотримуватися кращих практик, і це головна причина, коли я роблю цю гру. Я сподіваюся, що я досить добре прояснив свій приклад використання. :)
kamyl

1
Так, це має сенс, просто хотілося переконатися, що моя оригінальна відповідь відповідала вашому випадку використання. Я все ще вважаю, що різниця між devDependenciesі dependenciesне має значення при складанні пакету, це те, що також create-react-appзастосовується , але в кінцевому підсумку вирішувати саме вам
Валентин,

Відповіді:


140

Скажімо, ви розробляєте пакет "A", який містить @ type / some-module пакет у devDependitions. Ви чомусь експортуєте тип із @ types / some-module

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

     }
}

Зараз споживачі Typescript пакету "A" не в змозі здогадатися, що таке SomeType, оскільки devDependments пакета "A" НЕ встановлено.

У цьому конкретному випадку вам НЕОБХІДНО розміщувати пакет @ types / * з регулярними "залежностями". Для інших випадків "devDependitions" досить хороші.


7
Отже, ви маєте на увазі, що якщо я використовую лише тип у реалізації, це може бути визначення типу devDependencies?
Франклін Ю

7
Так @FranklinYu. Як тільки тип з’явиться у файлі декларації, вам потрібно розмістити його dependencies. Інакше devDependenciesдобре
wookieb

1
Але пакет працює як для TS, так і для JS. Розробникам JS не потрібні ці типи для складання коду. Додавання визначення типу dependenciesзробить дерево залежності роздутим.
Тайлер Лонг

1
@TylerLong Правильно. Це не ідеально, але це реальність. За бажанням ви також можете використовувати "необов'язкові залежності", але я вважаю, що в масштабі це може бути дуже дратує.
wookieb

55

Якщо ви просто генеруєте пакет, можливо, не потрібно буде розрізняти dependenciesі devDependencies. Ця функція, npmяк правило, корисна при публікації пакету, який можуть використовувати інші, і ви не хочете спамувати їх із зайвими залежностями.

Можуть бути й інші випадки використання, коли розщеплення залежностей може бути корисним, але якщо у вас немає явної потреби в цьому, то моя порада - просто вибрати одну і розмістити там все. Розділити їх згодом не складно, якщо виникне потреба.

Загальновідомим прикладом цієї практики IRL є create-react-app, за замовчуванням, не викинута плита котла, в якій створюється все dependencies, див. Цю тему і цю відповідь


8
Якщо ви не публікуєте пакунок, це правильно, але якщо ви є, це не має нічого спільного з розвитком проти часу виконання та всім необхідним для створення цього пакета проти того, що потрібно для його використання .
Йогу

1
@Yogu Саме тому я зробив цю відзнаку в першу чергу, так так, я повністю згоден з вами
Валентин

13
Я не згоден з цією порадою. devDependenciesне встановлюються під час npm install --production(або npm ci --production) і, таким чином, недоступні під час запуску виробничого коду. Це дуже змістовна різниця для служби, а не лише бібліотеки.
Бред Вілсон

2
@BradWilson У вас є крапка, під сонцем працює багато npm-робочих процесів, якщо ваш випадок використання вимагає від вас розрізнення, то будь-ласка, зробіть це. Не соромтеся дати власну відповідь на цю дилему.
Валентин

Я оновив свою відповідь, щоб згадати про існування інших випадків використання, коли розрізнення може бути змістовним, і наводив приклади реального світу. Дякуємо за відгук!
Валентин

15

У конкретному випадку розгортання програми Node.js у виробництві потрібно встановити лише залежності, необхідні для запуску програми.

npm install --production або

npm ci --production або

yarn --production

У такому випадку типи повинні бути в devDependencies, щоб запобігти здуття установки.

Зауваження: Я знаю, що це було сказано у коментарі Бреда Вілсона до іншої відповіді. Але ця точка здається гідною відповіді.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.