Autor Zpráva
Kcko
Profil
Ahoj,

1)

přes víkend jsem udělal 2 menší balíčky, hodil je na NPM-ko a nejsem si jist závislostmi. devDependencies: {}

Balíček A
- má závislost na jQuery (je jedno na jaké verzi)
- dále má závislost na Balíčku B

Balíček B
- má závislost na jQuery (je jedno na jaké verzi)


Když si nainstaluji Balíček B, tak se mi stáhne a k tomu ještě jQuery.
Když si nainstaluji Balíček A, tak se mi stáhne B a díky balíčku B ještě jQuery.

A moje otázka zní, když má Balíček A závislost na jQuery a má závislost na Balíčku B (které má také závislost na jQuery), měla by se i u balíčku A nastavit závislost na jQuery?
Ono ji dostane tak jako tak, ale skrze B a přijde mi to jako taková skrytá závislost.

Nevím jak s tím naložit.


2) Další otázka je na peerDependency, je to něco jako sousedská / jemná závislost, i když jsem si o tom četl stejně to moc nechápu. Je to něco jako povinná závislost s tím, že se dá uživatelem zvolit jakou verzi nainstalovat (většinou se jedná o rozmezí), ale toho docílím v klasické závislosti dependency taky.
Keeehi
Profil
Kcko:
1) Ano A by měla taky mít nastavenou závislost na jQuery. Balíček B se může v budoucnu změnit a přestat být závislý na jQuery. Pak by přestal fungovat i balíček A.
Jelikož jsi autor obou balíčků tak kdyby se něco takového stalo, tak by sis to mohl sám ohlídat ale zdá se mi lepší k tomu přistupovat jako kdyby balíček B byl od jiného autora a ty nevěděl a neměl vliv na to, kdy on si změní své závislosti.

2) Dependency je zavislost do hloubky. Tudíž říká že pro svůj běh potřebuje nějaký jiný balíček, který je "nainstalován" pod něj. Peer dependency je zavislost do šířky. Udává jakou verzi má mít balíček, který není nainstalován pod ním, ale vedle něj. Používá se hlavně u pluginů. Plugin si neinstaluje svoji mateřskou knihovnu jako závislost, on ji jen rozšiřuje. Jsou na stejné úrovni. On ale potřebuje nějak vyjádřit, že dokáže rozšířit chování jen určité verze té mateřské knihovny. A k tomu právě slouží peer dependency.
Já jsem to pochopil hlavně z tohoto článku.
nodejs.org/uk/blog/npm/peer-dependencies
Kcko
Profil
Keeehi:
díky za vysvětlení.

1) Dává to smysl, upravím to.
2) Stále tomu ne zcela rozumím. Resp. peerDependency tedy mohu chápat jako rozšiřující závislost, která je ovšem povinná (stejně jako dependency).

> Plugin si neinstaluje svoji mateřskou knihovnu jako závislost, on ji jen rozšiřuje
Ano, ale je pořád na ní zavislý, bez ní by nemohl fungovat, takže je to jen jiný úhel pohledu na povinnou závislost, dává tomu ten pohled, že je povinná, ale rozšiřuje ji o něco.


Bootstrap má např. jako PD nastavenou jQuery ve rozmezí 1.x - 3.x.
Radek9
Profil
Kcko:
2) peerDependency se standardně používá jako závislosti pro pluginy. Typický příklad jsou právě pluginy pro jQuery. Pokud instaluješ do projektu plugin, tak nechceš, aby si tahal svoji vlastní kopii jQuery. Dělalo by ti to bordel, protože by si mohl nainstalovat trochu jinou verzi než ty (případně duplicitní kopii tvojí verze). Prakticky chceš, aby plugin rozšiřoval přesně tu verzi (a přesně tu kopii), kterou budeš používat v projektu. Je to takhle jasné?
Kcko
Profil
Radek9:
Ahoj,

jakou jinou verzi když vyspecifikuji rozmezí nebo nebo konkrétní verzi (a tu už třeba budu mít nainstalovanou)? V tom případě, (a tak by se zachovalo závislost "dependency) by se přeskočila a nestahovala znovu.
Potřeboval bych asi velmi primitivní případ, abych viděl rozdíl, pořád si nejsem jistý ...
Radek9
Profil
Kcko:
V případě, že jsi schopen tohle zaručit, tak ano. Pokud to nejsi schopen zaručit, tak strom závislostí může vypadat nepředvídatelně a může ti to pak tiše failnout v aplikaci.

Příklad: Může se ti stát, že nějaký plugin (třeba verze 1.0.0) pracuje jen se starší verzí knihovny (1.0.0). Ty si v projektu aktualizuješ knihovnu (třeba na verzi 2.0.0), ale zapomeneš aktualizovat plugin. Pokud použiješ dependency, tak může strom vypadat takhle:
├── knihovna@2.0.0
└─┬ plugin@1.0.0
  └── knihovna@1.0.0

V tomhle případě nemusí plugin fungovat správně, pokud se ho pokusíš použít v kombinaci s novou verzí knihovny. Při instalaci packagů se o tom ale absolutně nic nedozvíš.

Pokud použiješ peerDependency, tak bude strom vypadat takhle:
├── knihovna@2.0.0
└── plugin@1.0.0

Zároveň tě npm upozorní, že plugin vyžaduje jinou verzi:
npm ERR! peerinvalid The package knihovna does not satisfy its siblings' peerDependencies requirements!
npm ERR! peerinvalid Peer plugin@1.0.0 wants knihovna@^1.0.0

Pokud potom aktualizuješ i knihovnu, tak bude strom vypadat následovně a všechno bude fungovat, jak má:
├── knihovna@2.0.0
└── plugin@2.0.0
Kcko
Profil
Radek9:
Zajímavé, hlídám si to, ale ono až se to stane, tak mi to bude asi úplně jasné. Díky!

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0