Як вирішити, чи @ типи / * переходять у "залежності" чи "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.