Wersjonowanie oparte na polach/dyrektywach
Pola i dyrektywy mogą być wersjonowane niezależnie, a wersja do użycia może być określona w query poprzez argument pola/dyrektywy versionConstraint.
Aby wybrać wersję pola/dyrektywy, Gato GraphQL używa tych samych ograniczeń wersji semver stosowanych przez Composer.
Dlaczego
Strategia ewolucji przyjęta przez GraphQL ma pewien problem: przy deprecjonowaniu pola (w celu zastąpienia go nową implementacją), nowe pole będzie musiało mieć nową nazwę. Jeśli deprecjonowanego pola nie można usunąć (na przykład dlatego, że niektórzy klienci nadal z niego korzystają, korzystając z queries, które nigdy nie zostały zaktualizowane), wszystkie te pola dla tej samej funkcjonalności mają tendencję do gromadzenia się w schemacie, a nowa implementacja pola nie będzie miała optymalnej nazwy (w rzeczywistości będzie gorsza niż nazwa deprecjonowanego pola).
Sama ewolucja, z biegiem czasu, ma tendencję do zaśmiecania schematu niepożądanymi definicjami. Wersjonowanie schematu na poziomie pól/dyrektyw może rozwiązać ten problem.
Ukierunkowane wersjonowanie poprzez query
Przekaż ograniczenie do pola lub dyrektywy poprzez argument versionConstraint:
# Selecting version for fields
query {
#This will produce version 0.1.0
firstVersion: userServiceURLs(versionConstraint: "^0.1")
# This will produce version 0.2.0
secondVersion: userServiceURLs(versionConstraint: ">0.1")
# This will produce version 0.2.0
thirdVersion: userServiceURLs(versionConstraint: "^0.2")
}
# Selecting version for directives
query {
post(by: { id:1 }) {
titleCase: title @makeTitle(versionConstraint: "^0.1")
upperCase: title @makeTitle(versionConstraint: "^0.2")
}
}