Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: tacoberu 14. 01. 2022, 17:47:51

Název: Tranzitivní závislost na různých verzích knihoven (C#)
Přispěvatel: tacoberu 14. 01. 2022, 17:47:51
Ahoj.

Mám knihovnu LibA, která využívá jednu knihovnu LibThirdA (pro zajímavost se jedná o RestSharpSign). Pak mám aplikaci AppA, která využívá LibA ale také LibThirdA. Pak mám aplikaci AppB, která využívá LibThirdB (konkrétně RestSharp (bez Sign)), a teď bych rád aby používal taky tu LibA, což ale nejde, protože LibThirdA a LibThirdB konfliktí. Případně dokonce LibThirdA nechci v aplikaci vysloveně používat. LibThirdB je jen další generace LibThirdA, takže to prostě můžu přepsat, jenže:

Dotaz:

Obecně, jak takovýto problém řešit?

Momentálně to mám vyřešené tím, že mám knihovnu LibA ve verzi 1.0.x a 1.1.x. Což sice funguje, ale začíná se to jevit jako ne úplně šťastný nápad, protože to při závislostech zlobí, nainstaluje to správný balíček, ale řve to, že tam není požadovaný objekt. [1] To by mohlo řešit, že bych vytvořil separe pojmenovaný balíček, kdy by nominálně neměli nic společného. Ale stejně mi to přijde divný.

Napadá vás jiný způsob?

Nejvíc by se mi líbilo, když bych mohl vydat jeden balíček, v jedné verzi, který by ale byl tolerantní a umožnil by závislost na LibThirdA nebo LibThirdB podle toho, co by chtěl nadřazený.

Díky za nápady.



[1] Mám tam totiž ještě jednu úroveň:

    AppA závisí na LibA, LibX a LibThirdA.
    LibX závisí na LibA.
    LibA závisí na LibThirdA.
    AppB závisí na LibThirdB.

Potřebuju změnit:

    AppB závisí na LibA, LibX a LibThirdB.

Název: Re:Tranzitivní závislost na různých verzích knihoven (C#)
Přispěvatel: Ondrej Nemecek 14. 01. 2022, 19:09:39
Neznám C#, znám hlavně javu. Nicméně obecně bude asi záviset na tom, zda nové verze knihovny jsou drop-in replacement starších verzí, zda jsou binárně kompatibilní (pak můžete dle možností build systému sjednotit verzi na nějakou ručně stanovenou verzi).

Nebo zda naopak - opačná verianta - jde o nové generace knihovny, které lze importovat zcela nezávisle (jednotlivé verze jsou např. v  jiném package) - pak máte závislost na verzi danou již ve zdrojovém kódu a s verzemi pracujete úplně nezávisle (můžete např. současně instancovat objekty z jedné i druhé knihovny).

Do toho pak ještě zasahují možnosti balíčkovacího systému (build nástroje) a pojmenování artefaktu s knihovnou (podle toho pak lze anebo nelze současně deklarovat závislost na více verzích téže knihovny - pokud má artefakt verzi ve jméně artefaktu, pak opět používáte verze nezávisle).
Název: Re:Tranzitivní závislost na různých verzích knihoven (C#)
Přispěvatel: tacoberu 14. 01. 2022, 22:44:22
Neznám C#, znám hlavně javu.

V tomto případě se mi jedná skutečně o C#. Jsem někde v dokumentaci zahlédl, že se dají nějak ifovat různé věci, architektura a tak. A tak si představuji, jestli nejde ifvnout, že pokud bude k dispozici tato knihovna, tak jeď tento kód, pokud bude tato, tak tamten...
Ale v C# jsem zelenáč, a tak netuším kde a jak hledat.
Název: Re:Tranzitivní závislost na různých verzích knihoven (C#)
Přispěvatel: kanoe22 14. 01. 2022, 23:16:34
Nikdy som to nepotreboval pouzit tak to nemam prakticky odskusane, ale co tak toto: https://stackoverflow.com/questions/47520281/unity-c-sharp-how-to-check-if-library-is-existing-in-the-project

Podla odkazu na msdn dokumentaciu to vyzera ze to vie vratit aj verziu dllky, cize by sa na zaklade mena+verzie asi dali napisat potrebne if-y.