@ Types / * 'nin' bağımlılıklar 'veya' devDependencies 'konularına girip girmediğine nasıl karar verebilirim?


200

Projemde TypeScript 2 kullanıyorum. Bazı js kütüphanesini kullanmak istiyorum, aynı zamanda bu kütüphane için yazımları da istiyorum. Basit tipler kurabilirim npm install @types/some-library. Dikkat etmem gereken emin değilim --saveya --save-devonlar. Bana öyle geliyor ki DefinetelyTyped GitHub benioku türünün her iki versiyonundan da bahsediyor, ama onları asla açıklamıyor. Türler devDependenciesgeliştirme için gerekli olduğundan ve çalışma zamanında kullanılmadığından @tiplerin olması gerektiğini düşünürdüm , ancak birçok kez @types'i gördüm dependencies. Kafam karıştı.

Nasıl türleri @ / * gider olmadığına karar vermelidir dependenciesya devDependencies? Aslında az çok resmi talimatlar var mı?


Bir paket mi oluşturuyorsunuz yoksa bu başkaları tarafından kullanılacak bir paket mi? Gördüğüm kadarıyla sadece arasındaki ayrım yapmak gerekir dependenciesve devDependenciesikinci durumda.
Valentin

Ben sıfırdan js / ts bazı oyun yapmak. Her şeyi webpack ile paketliyorum. Hiçbir arka uç yok, ama bir gün bağımsız yapmak için hepsini Elektron'a sarmalıyım. Kimsenin bunu kendi uygulamalarında bağımlılık olarak kullanacağını düşünmüyorum, ancak sanırım bu mümkün olabilir (GTA oyunlarındaki mini oyunları düşünün; ve oyunum açık kaynak). Yine de, en iyi uygulamaları öğrenmek ve takip etmek istiyorum ve bu oyunu yapmamın ana nedeni bu. Umarım kullanım durumumu yeterince iyi açıklamışımdır. :)
kamyl

1
Evet, mantıklı, sadece orijinal cevabımın kullanım durumunuzla alakalı olduğundan emin olmak istedim. Hala arasındaki ayrım olduğunu düşünüyorum devDependenciesve dependenciesbir paket oluştururken, 's şey alakasız olduğunu create-react-appgüçlendiği sıra ama sonuçta seçmek size kalmış
Valentin

Yanıtlar:


140

Diyelim ki devDependencies içinde @ types / some-module paketi olan bir "A" paketi geliştiriyorsunuz. Herhangi bir nedenle, türü @ types / some-module'dan dışa aktarıyorsunuz

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

     }
}

Şu anda "A" paketinin daktilo tüketicileri SomeType'ın ne olduğunu tahmin edememektedir, çünkü "A" paketinin dev bağımlılıkları kurulu DEĞİLDİR.

Bu durumda, normal "bağımlılıklar" içeren @ types / * paketini yerleştirmeniz GEREKİR. Diğer durumlar için "devDependencies" yeterince iyidir.


7
Yani, türü yalnızca uygulamada kullanırsam, tür tanımının olabileceğini ima edersiniz devDependencies?
Franklin Yu

7
Evet @FranklinYu. Tür bildirim dosyasında görünür görünmez, yerleştirmeniz gerekir dependencies. Aksi takdirde devDependenciessorun yok
wookieb

1
Ancak bir paket hem TS hem de JS için çalışır. JS geliştiricileri kodlarını derlemek için bu türlere ihtiyaç duymazlar. Tür tanımının eklenmesi, dependenciesbağımlılık ağacının şişirilmesini sağlayacaktır.
Tyler Long

1
@TylerLong Doğru. Mükemmel değil ama gerçek bu. İsteğe bağlı olarak "Opsiyonel Bağımlılıklar" da kullanabilirsiniz, ancak ölçekte çok can sıkıcı olabileceğine inanıyorum.
wookieb

55

Sadece bir paket oluşturuyorsanız dependenciesve ile arasındaki ayrımı yapmaya gerek olmayabilir devDependencies. Bu özelliği npmgenellikle başkaları tarafından kullanılabilen bir paket yayınlarken yararlıdır ve bunları gereksiz bağımlılıklarla spam yapmak istemezsiniz.

Bölme bağımlılıklarının yararlı olabileceği başka kullanım durumları olabilir, ancak buna açık bir ihtiyacınız yoksa, tavsiyem sadece birini seçip her şeyi oraya yerleştirmektir. İhtiyaç ortaya çıkarsa, onları daha sonra bölmek zor değildir.

Bu uygulama IRL'nin iyi bilinen bir örneği, create-react-appvarsayılan olarak oluşturduğu çıkarılmamış ısıtıcı levhadır dependencies, her şeyi yerleştirir , bu konuya ve bu cevaba bakın


8
Doğru, ama eğer, onunla geliştirme vs zamanında ve her şeyi ile ilgisi yoktur paketi, yayın değilseniz bu paket oluşturmak için ne yapılması gerektiği VS. Bu paketi kullanmak için ne yapılması gerektiği .
Yogu

1
@Yogu Bu yüzden ilk etapta ayrım yaptım, bu yüzden evet, sana tamamen katılıyorum
Valentin

13
Bu tavsiyeye katılmıyorum. devDependenciesyaptığınızda npm install --production(veya npm ci --production) kurulmaz ve bu nedenle üretim kodunu çalıştırırken kullanılamaz. Bu sadece bir kütüphane için değil, bir hizmet için çok anlamlı bir farktır.
Brad Wilson

2
@BradWilson Bir noktanız var, güneşin altında birçok npm iş akışı var, eğer kullanım durumunuz ayrım yapmanızı gerektiriyorsa, bunu yapın. Bu ikileme kendi cevabınızı vermekten çekinmeyin.
Valentin

Cevabımın anlamlı olabileceği diğer kullanım örneklerinin varlığından bahsetmek için cevabımı güncelledim ve gerçek dünya örnekleri verdim. Geri dönüşünüz için teşekkür ederiz!
Valentin

15

Bir Node.js uygulamasını üretime dağıtma durumunda, yalnızca uygulamayı çalıştırmak için gereken bağımlılıklar yüklenmek ister.

npm install --production veya

npm ci --production veya

yarn --production

Bu durumda, devDependencieskurulumun şişmesini önlemek için türler, içinde olmalıdır .

Not: Bunun Brad Wilson tarafından yapılan bir yorumda başka bir yanıta değindiğinin farkındayım. Bu nokta bir cevap olmaya değer görünüyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.