REST рдХреЗ рдмрдЬрд╛рдп рдЧреНрд░рд╛рдлрдХрд▓рд╛рдЗрди рдХреЗ рд╕рд╛рде рд╕рд░рд▓ рд╕рд░реНрд╡рд░, рдЬрд╛рд╡рд╛ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдореБрдЭреЗ GraphQL рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХреА рдЧрдИ рдереАред рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдХрд╛рдо рдореЗрдВ рдЖрд╡реЗрджрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЬрд╛рдирдХрд╛рд░реА рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рд╣реИ рдФрд░ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдкреБрд░рд╛рдиреА рд╣реИ, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ 3 рд╕рдВрд╕реНрдХрд░рдг рд╣реИрдВ, рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 5 рд╣реИрдВред рдореИрдВ рдЗрд╕ рдЕрдВрддрд░ рдХреЛ рднрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдореЗрдВ рд╕рд░реНрд╡рд▓реЗрдЯреНрд╕ рдкрд░ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реЛрдЧрд╛, рдЕрд░реНрдерд╛рддред рд╡рд╕рдВрдд рдХреЗ рдмрд┐рдирд╛ рдФрд░ рд╡рд╕рдВрдд-рдмреВрдЯ рдХреЗ рдмрд┐рдирд╛ред

рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рднрд╛рдЧ:
GraphQL - рдПрдкреАрдЖрдИ рдкрд░ рдПрдХ рдирдпрд╛ рд░реВрдкред рднрд╛рдЧ 1 рд╡реНрд▓рд╛рджрд┐рдореАрд░рдЬреЗрдЯреНрд╕ рд╕реЗ
REST рдФрд░ рдЧреНрд░рд╛рдлрдХреИрд▓ рдХреА рддреБрд▓рдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рддреБрд▓рдирд╛

рдореИрдВ рдЖрдкрдХреЛ рддреБрд░рдВрдд рдХреЛрдб рджрд┐рдЦрд╛рдКрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЧреНрд░рд╛рдлрдХреЙрд▓ рдПрдХ рдЕрдореВрд░реНрдд рд╣реИред рдФрд░ рдпрджрд┐ рдЖрдк рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЕрдореВрд░реНрддрддрд╛ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЦреЛ рд╕рдХрддреЗ рд╣реИрдВред рдореВрд▓ рдпрд╣рд╛рдБ рд╣реИ ред

рдореИрдВрдиреЗ рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдирдП рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдХреБрдЫ рдХрдХреНрд╖рд╛рдПрдВ рдирд╣реАрдВ рд╣реИрдВред

рдПрдХ рдЦрд╛рд▓реА рдорд╛рд╡реЗрди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВред рдкрд┐рдХрдирд┐рдХ рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдЬреЛрдбрд╝реЗрдВ:

<dependency> <groupId>com.graphql-java</groupId> <artifactId>graphql-java</artifactId> <version>8.0</version> </dependency> <dependency> <groupId>com.graphql-java</groupId> <artifactId>graphql-java-tools</artifactId> <version>5.0.0</version> </dependency> <dependency> <groupId>com.graphql-java</groupId> <artifactId>graphql-java-servlet</artifactId> <version>5.0.0</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency> 

рд╕рд░реНрд╡рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рди рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЬреЗрдЯреНрдЯреА рд▓реЗрдВ:

  <plugin> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>9.4.6.v20170531</version> </plugin> 

рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд╕реЗ рдЕрдВрддрд░:

  1. рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдПрдХ рдХреЙрд▓ рдХреЗ рд╕рд╛рде SimpleGraphQLServlet рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдЕрдм "рдкрджрд╛рд╡рдирдд" рд╣реИ, рдЖрдкрдХреЛ рдмрд┐рд▓реНрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рд╕рд╛рде рдЕрд╕рдВрднрд╡ рд╣реИ, рд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
  2. рд╕рд░реНрд╡рд▓реЗрдЯ рдореЗрдВ, рдЖрдк рдПрдХ SimpleGraphQLServlet рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
  3. GraphQLRootResolver - рдЕрдм рдФрд░ рдирд╣реАрдВ, рдЖрдк рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: GraphQLMutationResolver рдФрд░ GraphQLRootResolver

рдиреАрдВрд╡ рддреИрдпрд╛рд░ рд╣реИред рд╣рдо рд╡рд╕рдВрдд рдпрд╛ JAX-RS рдХреЗ рдмрд┐рдирд╛, рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд░реЗрдВрдЧреЗред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдПрдХ рдирд┐рдпрдорд┐рдд рд╕рд░реНрд╡рд▓реЗрдЯ:

 @WebServlet(urlPatterns = "/graphql") public class GraphQLEndpoint extends HttpServlet { private SimpleGraphQLServlet graph; public GraphQLEndpoint() { graph = SimpleGraphQLServlet.builder(buildSchema()).build(); } private static GraphQLSchema buildSchema() { LinkRepository linkRepository = new LinkRepository(); return SchemaParser.newParser() .file("schema.graphqls") .resolvers(new Query(linkRepository), new Mutation(linkRepository)) .build() .makeExecutableSchema(); } @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { graph.service(req, resp); } } 

рдЗрд╕рдореЗрдВ, рд╕рд░реНрд╡рд┐рд╕ рд╡рд┐рдзрд┐ рдбреЗрдЯрд╛ рдХреЛ SimpleGraphQLServlet рд╕реЗ рдкрд╛рд╕ рдХрд░рддреА рд╣реИред рдЗрд╕ рдкрд░ рд╣рдорд╛рд░рд╛ рд╡реНрдпрд╡рд╕рд╛рдп рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдирд┐рдпрдорд┐рдд рдХреЛрдб (рд▓рд┐рдВрдХ рдФрд░ рд▓рд┐рдВрдХрдкреНрд░реЛрд╕реЗрд░реАрдЯрд░реА)
 public class Link { private final String url; private final String description; public Link(String url, String description) { this.url = url; this.description = description; } public String getUrl() { return url; } public String getDescription() { return description; } } 

 public class LinkRepository { private final List<Link> links; public LinkRepository() { links = new ArrayList<>(); //add some links to start off with links.add(new Link("http://howtographql.com", "Your favorite GraphQL page")); links.add(new Link("http://graphql.org/learn/", "The official docks")); } public List<Link> getAllLinks() { return links; } public void saveLink(Link link) { links.add(link); } } 


рдЕрдм рдЕрдиреБрд░реЛрдз рдХреЛрдб (REST рдореЗрдВ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ) рдФрд░ рдореНрдпреВрдЯреЗрд╢рди (рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз)
 import com.coxautodev.graphql.tools.GraphQLQueryResolver; public class Query implements GraphQLQueryResolver { private final LinkRepository linkRepository; public Query(LinkRepository linkRepository) { this.linkRepository = linkRepository; } public List<Link> allLinks() { return linkRepository.getAllLinks(); } } 

 import com.coxautodev.graphql.tools.GraphQLMutationResolver; public class Mutation implements GraphQLMutationResolver { private final LinkRepository linkRepository; public Mutation(LinkRepository linkRepository) { this.linkRepository = linkRepository; } public Link createLink(String url, String description) { Link newLink = new Link(url, description); linkRepository.saveLink(newLink); return newLink; } } 


рд╣рдо рдЬреЗрдЯреНрдЯреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ: рднрд╛рдЧреЛ рдФрд░ рд╣рдо рдЕрдиреБрд░реЛрдз рдХреЛ рдлреЗрдВрдХ рджреЗрддреЗ рд╣реИрдВ:

 http://localhost:8080/graphql?query={allLinks{url}} 

рд╣рдореЗрдВ рдЬрд╡рд╛рдм рдорд┐рд▓рддрд╛ рд╣реИ:

 {"data": {"allLinks": [ {"url":"http://howtographql.com"}, {"url":"http://graphql.org/learn/"} ] } } 

рдФрд░ рдпрд╣рд╛рдВ рдкрд╣рд▓рд╛ рдореБрдЦреНрдп рдмрд┐рдВрджреБ рд╣реИ: рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 2 рдлрд╝реАрд▓реНрдб рд╣реИрдВ, url рдФрд░ рд╡рд┐рд╡рд░рдг, рдФрд░ рд╣рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХреЗрд╡рд▓ url рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖред рдФрд░ рдареАрдХ рд╣реА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рдЖрдЧреНрд░рд╣ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрдиреБрд░реЛрдз рдореЗрдВ {allLinks {url}} рдорд╛рдВрдЧрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдЕрдиреБрд░реЛрдз рдХреЛ рдЗрд╕рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ:

 http://localhost:8080/graphql?query={allLinks{url,description}} 

рдЗрд╕рдХрд╛ рдЙрддреНрддрд░ рд╣реИ:

 {"data": {"allLinks": [ { "url":"http://howtographql.com", "description":"Your favorite GraphQL page" }, { "url":"http://graphql.org/learn/", "description":"The official docks" } ] } } 

рдЕрдм рд╣рдореЗрдВ рдпреВрдЖрд░рдПрд▓ рдФрд░ рд╡рд┐рд╡рд░рдг рдорд┐рд▓ рдЧрдпрд╛ рд╣реИред рдФрд░ рд╕рднреА рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рдЙрдирд╕реЗ рдкреВрдЫрд╛ред

рдбреЗрдЯрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдзред

рдпрд╣ рдпреВрдЖрдИ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдФрд░ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред

1. рд╣рдо рдкрддреЗ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ
2. рдкреВрд░реЗ index.html рдлрд╝рд╛рдЗрд▓ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдПрдБ
3. 2 рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдмрджрд▓реЗрдВ:

рдпреЗ рд╣реИрдВ:

 <link rel="stylesheet" href="./node_modules/graphiql/graphiql.css" /> <script src="./node_modules/graphiql/graphiql.js"></script> 


рдЗрди рдкрд░:

 <link rel="stylesheet" href="//cdn.jsdelivr.net/npm/graphiql@0.11.2/graphiql.css" /> <script src="//cdn.jsdelivr.net/npm/graphiql@0.11.2/graphiql.js"></script> 


4. рдЗрд╕ index.html рдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдмрджрд▓реЗрдВ ... \ src \ main \ webapp \ index.html рдЬрд┐рд╕рдореЗрдВ рдЕрднреА рд▓рд┐рдЦрд╛ рд╣реИред

рд╣рдо рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рдкрд░ рдЬрд╛рдПрдВ: 8080 рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреЗрдЬ рдкрд░ рдЬрд╛рдПрдВ


рдкрд╣рд▓рд╛ рдмреЛрдирд╕: рдмрд╛рдИрдВ рдУрд░ рдбреЙрдХреНрд╕ рдмрдЯрди рд╣реИ, рдЬреЛ рдЖрдкрдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдкреНрд░рд▓реЗрдЦрди рдХреЛ рдЫреБрдкрд╛рддрд╛ рд╣реИред рдЬреНрдпрд╛рджрд╛ рдирд╣реАрдВ, рдРрд╕реЗ рдХреНрд╖реЗрддреНрд░ рдЬрд┐рдиреНрд╣реЗрдВ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╡реЗ рд╡рд┐рдзрд┐рдпрд╛рдВ рдЬрд┐рдиреНрд╣реЗрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрдирдореЗрдВ рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред



рдпрд╣ рдЖрдкрдХреЗ рдкрд╕рдВрджреАрджрд╛ рдХрд╛рд░ рд╕реЗрдЯ рднреА рджреЗрддрд╛ рд╣реИред



рдЕрдм рдЗрд╕рдХреЗ рд╕рд╛рде, рд╣рдо рдПрдХ рдореНрдпреВрдЯреЗрд╢рди рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗрдВрдЧреЗред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рд╣реИ, "рдПрдХ рд▓рд┐рдВрдХ рдЬреЛрдбрд╝реЗрдВ"ред



рдХреНрд╡реЗрд░реА рдкрд╛рда:
 mutation createLink{ createLink(url:"http://test.com", description:"test mutation"){ url description } } 

рдереЛрдбрд╝реЗ рд╕рдордп рдмрд╛рдж рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╢рдмреНрдж рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ (рдЗрд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж рдЬрд╝рд░реВрд░ рд▓рд┐рдЦреЗрдВ)

 mutation { createLink(url:"http://test.com", description:"test mutation"){ url description } } 



рдпрд╛рдиреА рд╣рдо рд╕рд┐рд░реНрдл рдЗрд╕рдХреЗ рдирд╛рдо рд╕реЗ рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдЖрдк рдпрд╣ рднреА рдзреЛрдЦрд╛ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдХреМрди рд╕реА рдЬрд╛рдирдХрд╛рд░реА рд╡рд╛рдкрд╕ рдкрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдореНрдпреВрдЯреЗрд╢рди рдЕрдиреБрд░реЛрдз рдХреИрд╕реЗ рджреЗрдЦреЗрдВ
1. F12 рдбреЗрд╡рд▓рдкрд░ рдЯреИрдм рдЦреЛрд▓реЗрдВ рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рдЦреЛрд▓реЗрдВ, рд╣рдо рдЕрдиреБрд░реЛрдз рднреЗрдЬрддреЗ рд╣реИрдВред



2. рдкреНрд░рд╕реНрддреБрдд рдЕрдиреБрд░реЛрдз рдкрд░, рдЖрд░рдПрдордмреА -> рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ -> рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдХреЗ рд░реВрдк рдореЗрдВ cURL (рдмреИрд╢)



2.1ред рдЬреЛ рд▓реЛрдЧ рдХрд░реНрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдЬреЛ рдкреЛрд╕реНрдЯрдореИрди рдХреЛ рдЖрдЧреЗ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ

3. рдкреЛрд╕реНрдЯрдореИрди рдЦреЛрд▓реЗрдВ рдФрд░ рд╢реАрд░реНрд╖ рдмрд╛рдИрдВ рдУрд░ рдЖрдпрд╛рдд рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред



4. рдЦреБрд▓рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рдВрдбреЛ рдореЗрдВ, рдкреЗрд╕реНрдЯ рд░реЙ рдЯреЗрдХреНрд╕реНрдЯ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ рдФрд░ рд╡рд╣рд╛рдВ рдХреЙрдкреА рдХрд┐рдП рдЧрдП рдХрд░реНрд▓ рдЕрдиреБрд░реЛрдз рдХреЛ рдкреЗрд╕реНрдЯ рдХрд░реЗрдВ



рдФрд░ рд╣рдо рдЕрдиреБрд░реЛрдз рдирд┐рдХрд╛рдп рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:

 {"query":"mutation createLink{\n createLink(url:\"http://test.com\", description:\"test mutation\"){\n\t\turl\n description\n }\n}","variables":null,"operationName":"createLink"}    тАЬ\nтАЭ. 


рдЗрд╕ рд╕реНрддрд░ рдкрд░, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕рд░реНрд╡рд░ рд╣реИ, рд╡рд╣рд╛рдВ рднрдВрдбрд╛рд░рдг рд╣реИ, рдФрд░ рд╣рдо рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдпреВрдЖрд░рдПрд▓ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред

рдореБрдЭреЗ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рдЖрдпрд╛ред рд╕рд╛рдордиреЗ рд╡рд╛рд▓рд╛ рд╕реНрд╡рдпрдВ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЙрд╕реЗ рдХреНрдпрд╛ рдЬрд╛рдирдХрд╛рд░реА рдЪрд╛рд╣рд┐рдП, рдХреИрд╕реЗ рдЯреНрд░реИрдлрд╝рд┐рдХ рдХреЛ рдмрдЪрд╛рдпрд╛ рдЬрд╛рдПред рдирдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рддреЗ рд╕рдордп, рдкреБрд░рд╛рдирд╛ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИ, рд╕рд╛рдордиреЗ рд╡рд╛рд▓реЗ рдХреЛ рдХреЗрд╡рд▓ рдЙрд╕реА рдЪреАрдЬ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рд╣рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХрдо рдирд╣реАрдВ рд╣реИред

Github рдирдореВрдирд╛ рдХреЛрдб
2 рд╢рд╛рдЦрд╛рдПрдБ:

рдорд╛рд╕реНрдЯрд░ - рд╕рд░рдХрд╛рд░реА рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

update_version рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрджреНрдпрддрди рд╕рдВрд╕реНрдХрд░рдг рд╣реИред

рд╕рдВрджрд░реНрдн:

1. рдбреЙрдХреНрд╕
2. рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ (рд╡рд┐рднрд┐рдиреНрди рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП)
3. рд╡рд╣ рд╡реАрдбрд┐рдпреЛ рдЬрд┐рд╕рдиреЗ рдкрд╣рд▓реА рд╕рдордЭ рджреА

Source: https://habr.com/ru/post/hi418083/


All Articles