Správa verzí v jazyce C#

V tomto kurzu se dozvíte, co znamená správa verzí v .NET. Dozvíte se také o faktorech, které je potřeba vzít v úvahu při správě verzí knihovny a také při upgradu na novou verzi knihovny.

Knihovny pro vytváření obsahu

Jako vývojář, který vytvořil knihovny .NET pro veřejné použití, jste s největší pravděpodobností v situacích, kdy musíte zavést nové aktualizace. Na tomto procesu záleží hodně, protože potřebujete zajistit bezproblémový přechod existujícího kódu na novou verzi knihovny. Při vytváření nové verze je potřeba vzít v úvahu několik věcí:

Sémantická správa verzí

Sémantická správa verzí (SemVer for short) je konvence pojmenování použitá pro verze vaší knihovny, která označuje konkrétní události milníků. V ideálním případě by informace o verzi, které knihovně poskytnete, měly pomoct vývojářům určit kompatibilitu s jejich projekty, které používají starší verze stejné knihovny.

Nejzásadnější přístup k SemVeru je formát MAJOR.MINOR.PATCH3 komponent , kde:

  • MAJOR se zvýší, když provedete nekompatibilní změny rozhraní API.
  • MINOR se zvýší, když přidáváte funkce zpětně kompatibilním způsobem.
  • PATCH se zvýší, když provedete opravy chyb kompatibilní se zpětnou kompatibilitou.

Existují také způsoby, jak určit jiné scénáře, například předběžné verze, při použití informací o verzi v knihovně .NET.

Zpětná kompatibilita

Při vydávání nových verzí knihovny bude zpětnou kompatibilitou s předchozími verzemi pravděpodobně jedním z hlavních problémů. Nová verze knihovny je zdroj kompatibilní s předchozí verzí, pokud kód, který závisí na předchozí verzi, může při rekompilování pracovat s novou verzí. Nová verze knihovny je binární kompatibilní, pokud aplikace, která závisí na staré verzi, může bez rekompilace pracovat s novou verzí.

Při pokusu o zachování zpětné kompatibility se staršími verzemi knihovny je potřeba vzít v úvahu několik věcí:

  • Virtuální metody: Když v nové verzi vytvoříte virtuální metodu, znamená to, že projekty, které tuto metodu přepíší, budou muset být aktualizovány. Jedná se o obrovskou zásadní změnu a důrazně se nedoporučuje.
  • Podpisy metody: Při aktualizaci chování metody vyžaduje, abyste také změnili jeho podpis, měli byste místo toho vytvořit přetížení, aby volání kódu do této metody stále fungovalo. Se starým podpisem metody můžete vždy manipulovat a volat do nového podpisu metody, aby implementace zůstala konzistentní.
  • Zastaralý atribut: Tento atribut v kódu můžete použít k určení tříd nebo členů třídy, které jsou zastaralé a pravděpodobně budou odebrány v budoucích verzích. Tím zajistíte, že vývojáři, kteří vaši knihovnu využívají, budou lépe připraveni na zásadní změny.
  • Volitelné argumenty metody: Pokud zadáte dříve volitelné argumenty metody povinné nebo změníte jejich výchozí hodnotu, bude nutné aktualizovat veškerý kód, který tyto argumenty nezadá.

Poznámka:

Nepovinné povinné argumenty by měly mít velmi malý účinek, zejména pokud nezmění chování metody.

Čím jednodušší je, že uživatelé upgradují na novou verzi knihovny, tím pravděpodobnější bude, že se budou upgradovat dříve.

Konfigurační soubor aplikace

Jako vývojář .NET existuje velmi vysoká pravděpodobnost, že jste narazili na app.config soubor , který je ve většině typů projektů. Tento jednoduchý konfigurační soubor může trvat dlouhou dobu, než se zlepší zavedení nových aktualizací. Knihovny byste obecně měli navrhnout tak, aby informace, které se pravděpodobně budou pravidelně měnit, byly uloženy v app.config souboru, tímto způsobem při aktualizaci těchto informací, konfigurační soubor starších verzí je potřeba nahradit pouze novým, aniž by bylo nutné překompilace knihovny.

Využívání knihoven

Jako vývojář, který využívá knihovny .NET vytvořené jinými vývojáři, s největší pravděpodobností víte, že nová verze knihovny nemusí být plně kompatibilní s vaším projektem a často se může stát, že budete muset aktualizovat kód, aby tyto změny fungovaly.

Pro vás je prostředí C# a ekosystém .NET vybaveny funkcemi a technikami, které nám umožňují snadno aktualizovat naši aplikaci tak, aby fungovala s novými verzemi knihoven, které by mohly zavádět zásadní změny.

Přesměrování vazby sestavení

Pomocí souboru app.config můžete aktualizovat verzi knihovny, kterou vaše aplikace používá. Přidáním toho, co se nazývá přesměrování vazby, můžete použít novou verzi knihovny, aniž byste museli aplikaci znovu zkompilovat. Následující příklad ukazuje, jak byste aktualizovali soubor app.config vaší aplikace tak, aby používal 1.0.1 verzi ReferencedLibrary opravy namísto 1.0.0 verze, se kterou byla původně zkompilována.

<dependentAssembly>
    <assemblyIdentity name="ReferencedLibrary" publicKeyToken="32ab4ba45e0a69a1" culture="en-us" />
    <bindingRedirect oldVersion="1.0.0" newVersion="1.0.1" />
</dependentAssembly>

Poznámka:

Tento přístup bude fungovat jenom v případě, že nová verze ReferencedLibrary je binární kompatibilní s vaší aplikací. Informace o změnách při určování kompatibility najdete v části Zpětná kompatibilita výše.

Nové…

Modifikátor slouží new ke skrytí zděděných členů základní třídy. Toto je jeden ze způsobů, jak odvozené třídy mohou reagovat na aktualizace v základních třídách.

Podívejte se na následující příklad:

public class BaseClass
{
    public void MyMethod()
    {
        Console.WriteLine("A base method");
    }
}

public class DerivedClass : BaseClass
{
    public new void MyMethod()
    {
        Console.WriteLine("A derived method");
    }
}

public static void Main()
{
    BaseClass b = new BaseClass();
    DerivedClass d = new DerivedClass();

    b.MyMethod();
    d.MyMethod();
}

Výstup

A base method
A derived method

Z výše uvedeného příkladu vidíte, jak DerivedClass skryje metodu MyMethod , která je přítomna v BaseClass. To znamená, že když základní třída v nové verzi knihovny přidá člena, který již existuje ve vaší odvozené třídě, můžete jednoduše použít new modifikátor u člena odvozené třídy ke skrytí člena základní třídy.

Pokud není zadán žádný new modifikátor, odvozená třída ve výchozím nastavení skryje konfliktní členy v základní třídě, i když se vygeneruje upozornění kompilátoru, kód bude stále kompilován. To znamená, že pouhé přidání nových členů do existující třídy způsobí, že nová verze knihovny bude zdrojová i binární kompatibilní s kódem, který na něm závisí.

override

override Modifikátor znamená, že odvozená implementace rozšiřuje implementaci člena základní třídy namísto skrytí. Člen základní třídy musí mít virtual použitý modifikátor.

public class MyBaseClass
{
    public virtual string MethodOne()
    {
        return "Method One";
    }
}

public class MyDerivedClass : MyBaseClass
{
    public override string MethodOne()
    {
        return "Derived Method One";
    }
}

public static void Main()
{
    MyBaseClass b = new MyBaseClass();
    MyDerivedClass d = new MyDerivedClass();

    Console.WriteLine("Base Method One: {0}", b.MethodOne());
    Console.WriteLine("Derived Method One: {0}", d.MethodOne());
}

Výstup

Base Method One: Method One
Derived Method One: Derived Method One

override Modifikátor se vyhodnocuje v době kompilace a kompilátor vyvolá chybu, pokud nenajde virtuálního člena, který má přepsat.

Vaše znalosti o probíraných technikách a porozumění situacím, ve kterých je použít, vám pomůžou zmírnit přechod mezi verzemi knihovny.