Wie entscheide ich, ob @ types / * in "Abhängigkeiten" oder "devDependencies" geht?

194

Ich verwende TypeScript 2 in meinem Projekt. Ich möchte einige js-Bibliotheken verwenden, aber auch Eingaben für diese Bibliothek. Ich kann Typen mit einfachen installieren npm install @types/some-library. Ich bin mir nicht sicher, ob ich --saveoder --save-devsie sollte. Es scheint mir, dass sogar DefinetelyTyped GitHub Readme beide Versionen erwähnt, sie aber nie erklärt. Ich würde denken, dass @types in sein sollte devDependencies, da Typen für die Entwicklung benötigt werden und nicht zur Laufzeit verwendet werden, aber ich habe @types oft in just gesehen dependencies. Ich bin verwirrt.

Wie soll ich entscheiden, ob @ types / * in dependenciesoder geht devDependencies? Gibt es tatsächlich mehr oder weniger offizielle Anweisungen?

Kamyl
quelle
Generieren Sie ein Bundle oder ist dies ein Paket, das von anderen verwendet wird? Aus meiner Sicht müssen Sie nur zwischen dependenciesund devDependenciesim letzteren Fall unterscheiden.
Valentin
Ich mache ein Spiel in js / ts von Grund auf neu. Ich bündle alles mit Webpack. Es gibt überhaupt kein Backend, aber es ist möglich, dass ich alles in Electron einpacke, um es eines Tages eigenständig zu machen. Ich glaube nicht, dass irgendjemand es jemals als Abhängigkeit in seiner eigenen App verwenden wird, aber ich denke, es könnte möglich sein (denken Sie an Minispiele in GTA-Spielen; und mein Spiel ist Open Source). Trotzdem möchte ich Best Practices lernen und befolgen und das ist der Hauptgrund, warum ich dieses Spiel mache. Ich hoffe, ich habe meinen Anwendungsfall gut genug geklärt. :)
Kamyl
1
Ja, es macht Sinn, wollte nur sicherstellen, dass meine ursprüngliche Antwort für Ihren Anwendungsfall relevant ist. Ich denke immer noch , dass die Unterscheidung zwischen devDependenciesund dependenciesirrelevant ist , wenn ein Bündel Gebäude, es ist etwas , das create-react-apperzwingt auch , aber letztlich ist es an Sie zu wählen
Valentin

Antworten:

131

Angenommen, Sie entwickeln ein Paket "A" mit dem Paket @ types / some-module in devDependencies. Aus irgendeinem Grund exportieren Sie den Typ aus @ types / some-module

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

     }
}

Derzeit können Typescript-Konsumenten des Pakets "A" nicht erraten, was SomeType ist, da devDependencies des Pakets "A" NICHT installiert sind.

In diesem speziellen Fall MÜSSEN Sie das Paket @ types / * mit regulären "Abhängigkeiten" platzieren. Für andere Fälle sind "devDependencies" gut genug.

wookieb
quelle
6
Sie implizieren also, dass, wenn ich den Typ nur in der Implementierung verwende, seine Typdefinition sein kann devDependencies?
Franklin Yu
6
Ja @FranklinYu. Sobald der Typ in der Deklarationsdatei angezeigt wird, müssen Sie ihn platzieren dependencies. Ansonsten devDependenciesist
alles in
1
Ein Paket funktioniert jedoch sowohl für TS als auch für JS. JS-Entwickler benötigen diese Typen nicht, um ihren Code zu kompilieren. Durch Hinzufügen der Typdefinition zu dependencieswird der Abhängigkeitsbaum aufgebläht.
Tyler Long
1
@ TylerLong Richtig. Es ist nicht perfekt, aber das ist Realität. Optional Sie können auch "optionale Abhängigkeiten" verwenden, aber ich glaube, dass dies im Maßstab sehr ärgerlich sein kann.
Wookieb
55

Wenn Sie nur ein Bundle generieren, müssen Sie möglicherweise nicht zwischen dependenciesund unterscheiden devDependencies. Diese Funktion vonnpm ist im Allgemeinen nützlich, wenn Sie ein Paket veröffentlichen, das von anderen verwendet werden kann, und Sie möchten sie nicht mit redundanten Abhängigkeiten spammen.

Es kann andere Anwendungsfälle geben, in denen das Aufteilen von Abhängigkeiten hilfreich sein kann. Wenn Sie dies jedoch nicht ausdrücklich benötigen, ist es mein Rat, einfach einen auszuwählen und alles dort zu platzieren. Es ist nicht schwierig, sie später aufzuteilen, wenn es nötig sein sollte.

Ein bekanntes Beispiel für diese Vorgehensweise ist create-react-app, dass IRL standardmäßig die nicht ausgeworfene Boilerplate, in der es erstellt wird, alles platziert dependencies, siehe diesen Thread und diese Antwort

Valentin
quelle
7
Wenn Sie veröffentlichen das Paket nicht, das stimmt, aber wenn Sie sind, es hat nichts mit der Entwicklung vs. Laufzeit und alles zu tun , was nötig ist , dieses Paket zu bauen vs. was nötig ist , dieses Paket zu verwenden .
Yogu
1
@ Yogu Deshalb habe ich die Unterscheidung in erster Linie gemacht, also ja, ich stimme Ihnen vollkommen zu
Valentin
12
Ich bin mit diesem Rat nicht einverstanden. devDependencieswerden nicht installiert, wenn Sie dies tun npm install --production(oder npm ci --production), und sind daher beim Ausführen von Produktionscode nicht verfügbar. Dies ist ein sehr bedeutender Unterschied für einen Dienst, nicht nur für eine Bibliothek.
Brad Wilson
2
@BradWilson Sie haben einen Punkt, es gibt viele npm-Workflows unter der Sonne. Wenn Ihr Anwendungsfall erfordert, dass Sie die Unterscheidung treffen, dann tun Sie es auf jeden Fall. Sie können gerne Ihre eigene Antwort auf dieses Dilemma geben.
Valentin
Ich habe meine Antwort aktualisiert, um die Existenz anderer Anwendungsfälle zu erwähnen, in denen die Unterscheidung sinnvoll sein kann, und Beispiele aus der Praxis gegeben. Danke für die Rückmeldung!
Valentin
15

Im speziellen Fall der Bereitstellung einer Node.js-Anwendung für die Produktion möchten nur die Abhängigkeiten installiert werden, die zum Ausführen der Anwendung erforderlich sind.

npm install --production oder

npm ci --production oder

yarn --production

In diesem Fall sollten sich die Typen in der befinden devDependencies, damit sie die Installation nicht aufblähen.

Bemerkung: Mir ist bekannt, dass dies in einem Kommentar von Brad Wilson zu einer anderen Antwort erwähnt wurde. Dieser Punkt scheint jedoch eine Antwort wert zu sein.

Carsten Führmann
quelle