{"id":390560,"date":"2024-06-29T09:19:04","date_gmt":"2024-06-29T09:19:04","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=390560"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=390560","title":{"rendered":"<span>\u0411\u0438\u0442\u044c \u0438\u043b\u0438 \u043d\u0435 \u0431\u0438\u0442\u044c? \u041c\u043e\u0434\u0443\u043b\u0438 \u0432 Xcode: \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c XcodeGen \u0438 Tuist<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041a\u043e\u0433\u0434\u0430 \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u0435\u0448\u044c\u0441\u044f \u043e \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0438 \u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u0438, \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043a\u0443\u0447\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432: \u043a\u0430\u043a \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u043c\u043e\u0434\u0443\u043b\u044f\u043c\u0438? \u041a \u0447\u0435\u043c\u0443 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u0438? \u041a\u0430\u043a \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435?\u00a0<\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u043f\u0443\u0442\u0438\u00a0\u043d\u0435\u043c\u0443\u0434\u0440\u0435\u043d\u043e \u0437\u0430\u0431\u043b\u0443\u0434\u0438\u0442\u044c\u0441\u044f: \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u0438 \u2014 \u044d\u0442\u043e \u0441\u043b\u043e\u0436\u043d\u043e. \u041a\u0430\u043a \u0438 \u043b\u044e\u0431\u043e\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u0438 \u0440\u0443\u0442\u0438\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0435\u0433\u043e \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0423\u0442\u0438\u043b\u0438\u0442\u044b \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u0438 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u0438.<\/p>\n<p>\u042f \u2014 <a href=\"http:\/\/go.surf.ru\/hr\/ios\/habr\/modularizationXcode8\">\u041d\u0438\u043a\u0438\u0442\u0430 \u041a\u043e\u0440\u043e\u0431\u0435\u0439\u043d\u0438\u043a\u043e\u0432<\/a>, iOS Team Lead <a href=\"https:\/\/surf.ru\/?utm_source=habr&amp;utm_medium=organic&amp;utm_campaign=bit_ili_ne_bit_moduli_v_xcode_sravnivaem_xcodegen_i_tuist\">\u0432 Surf<\/a>. \u041f\u0440\u043e\u0432\u0435\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"http:\/\/go.surf.ru\/hr\/ios\/habr\/modularizationXcode1\">XcodeGen<\/a> \u0438 <a href=\"http:\/\/go.surf.ru\/hr\/ios\/habr\/modularizationXcode2\">Tuist<\/a>. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e\u0431 \u044d\u0442\u043e\u043c \u043e\u043f\u044b\u0442\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0434\u0435\u043b\u044e\u0441\u044c \u043d\u0430\u0448\u0438\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043e\u0431 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0433\u0440\u0430\u0444\u0435 \u043c\u043e\u0434\u0443\u043b\u0435\u0439.<\/p>\n<blockquote>\n<p>\u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f Surf \u0432 iOS, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432 \u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435, \u2014\u00a0<a href=\"http:\/\/go.surf.ru\/hr\/ios\/habr\/modularizationXcode7\">\u0432 \u043d\u0430\u0448\u0435\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/a>. \u0421\u043e\u0431\u0440\u0430\u043b\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0443\u0442\u0438\u043b\u0438\u0442\u044b, \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0438 \u043b\u0443\u0447\u0448\u0438\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438. \u041d\u0430\u043c \u043e\u043d\u0438 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443, \u043f\u0438\u0441\u0430\u0442\u044c \u0447\u0438\u0441\u0442\u044b\u0439 \u043a\u043e\u0434. \u041c\u043e\u0433\u0443\u0442 \u043f\u043e\u043c\u043e\u0447\u044c \u0438 \u0432\u0430\u043c \ud83d\ude42<\/p>\n<\/blockquote>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/03b\/186\/00a\/03b18600a8fa5d75fddd98c236323b6b.JPG\" width=\"1300\" height=\"733\"\/><\/figure>\n<h2>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043c\u043e\u0434\u0443\u043b\u044c<\/h2>\n<p><strong>\u041c\u043e\u0434\u0443\u043b\u044c<\/strong> \u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u043a\u043e\u043d\u0447\u0435\u043d\u043d\u044b\u0439 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u043a\u043e\u0434\u0430, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0439 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443: \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u043c\u0443 \u0441\u043b\u043e\u044e, \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0444\u0438\u0447\u0438 \u0438\u043b\u0438 \u044e\u0437\u043a\u0435\u0439\u0441\u0430.\u00a0<\/p>\n<p>\u0422\u0443\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u044e \u0441 \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u0432 \u041e\u041e\u041f \u2014 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u043c \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438: \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u043c\u043e\u0434\u0443\u043b\u044c, \u043a\u0430\u043a \u0438 \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u043a\u043b\u0430\u0441\u0441, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043e\u0434\u043d\u0443 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/790\/f91\/252\/790f91252e2092cc52a8cc7ca54cfa83.png\" width=\"1920\" height=\"1080\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/790\/f91\/252\/790f91252e2092cc52a8cc7ca54cfa83.png\"\/><\/figure>\n<ul>\n<li>\n<p>\u041c\u043e\u0434\u0443\u043b\u044c <em>Models<\/em><strong> <\/strong>\u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0438. <\/p>\n<\/li>\n<li>\n<p><em>Resources<\/em> \u2014 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0438 \u043a\u043b\u044e\u0447\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043d\u0438\u043c.<\/p>\n<\/li>\n<li>\n<p><em>Network<\/em> \u2014 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0441\u043b\u043e\u044f. <\/p>\n<\/li>\n<li>\n<p><em>Library<\/em> \u2014 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 UI-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0438\u043b\u0438 \u044d\u043a\u0440\u0430\u043d\u044b (<em>\u043a \u043d\u0430\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 Library \u043f\u0440\u0438\u0448\u043b\u043e \u0438\u0437 \u0431\u043e\u0435\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043d\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0435\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u043e\u0434\u0443\u043b\u044c UI Kit<\/em>).<\/p>\n<\/li>\n<li>\n<p><em>AuthFlow<\/em><strong> <\/strong>\u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0444\u043b\u043e\u0443 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0441\u043b\u043e\u044f \u0438 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432. \u0417\u0434\u0435\u0441\u044c \u0444\u043b\u043e\u0443 \u2014 \u044d\u0442\u043e \u043b\u044e\u0431\u043e\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439.<\/p>\n<\/li>\n<li>\n<p><em>Application<\/em> \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0432\u0441\u0451 \u0444\u043b\u043e\u0443 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u043e\u0434\u0443\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u0438, \u043d\u043e <strong>\u0441\u0432\u044f\u0437\u044c<\/strong> \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430 <strong>\u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0430\u044f <\/strong>\u2014<strong> <\/strong>\u0442\u0430\u043a<strong> <\/strong>\u0440\u0435\u0448\u0438\u043b \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u043e\u0440 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. <em>Network<\/em> \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c \u0438\u043b\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c \u0438\u0437 \u0441\u043e\u0441\u0435\u0434\u043d\u0435\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f Library. <em>AuthFlow<\/em> \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a <em>MonitorFlow<\/em> \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.\u00a0<\/p>\n<p>\u042d\u0442\u0443 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0438 \u043a \u0434\u0440\u0443\u0433\u0438\u043c \u043c\u043e\u0434\u0435\u043b\u044f\u043c \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u0438:\u00a0 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0432\u044f\u0437\u044c \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043b\u044e\u0434\u0430\u0442\u044c \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0435\u0434\u0438\u043d\u043e\u0439 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0432 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0438 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0443\u043b\u0435\u0439. \u042d\u0442\u043e \u0434\u0430\u0451\u0442 \u0447\u0438\u0441\u0442\u043e\u0442\u0443 \u043a\u043e\u0434\u0430 \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0430.\u00a0<\/p>\n<h3>\u0417\u0430\u0447\u0435\u043c \u0431\u0438\u0442\u044c \u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u0438<\/h3>\n<p><strong>\u0423\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0431\u043e\u0440\u043e\u043a<\/strong>. \u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u0431\u043e\u0440\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b \u043c\u043e\u0434\u0443\u043b\u0435\u0439 (\u0443 \u043d\u0430\u0441 \u044d\u0442\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438) \u0438 \u043f\u0435\u0440\u0435\u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435 \u043c\u043e\u0434\u0443\u043b\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0434\u0435\u043b\u0430\u043d\u044b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u043b\u0441\u044f 40 \u0441\u0435\u043a\u0443\u043d\u0434. \u041f\u043e\u0441\u043b\u0435 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u043d\u0430 20 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u043e\u043d \u0441\u0442\u0430\u043b \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0437\u0430 5 \u0441\u0435\u043a\u0443\u043d\u0434: \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u0432 8 \u0440\u0430\u0437.<\/p>\n<p><strong>\u0412 \u043c\u043d\u043e\u0433\u043e\u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043f\u0440\u043e\u0449\u0435 \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f<\/strong>. \u0425\u043e\u0440\u043e\u0448\u043e \u0440\u0430\u0437\u0431\u0438\u0442\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u043f\u0430\u043f\u043e\u043a \u0438 \u0444\u0430\u0439\u043b\u043e\u0432. \u0421\u0440\u0430\u0437\u0443 \u0432\u0438\u0434\u043d\u043e, \u0438\u0437 \u043a\u0430\u043a\u0438\u0445 \u00ab\u043a\u0438\u0440\u043f\u0438\u0447\u0438\u043a\u043e\u0432\u00bb \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u043a\u0443\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u0432\u043d\u0435\u0441\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f.\u00a0<\/p>\n<p><strong>\u0413\u0438\u0431\u043a\u043e\u0441\u0442\u044c \u0438 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u044c<\/strong>: \u043c\u043e\u0434\u0443\u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u044f\u0442\u044c \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0438\u043b\u0438 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e. \u041d\u0430\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u0435\u0437 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0433\u0440\u0443\u043f\u043f\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u0413\u043b\u0430\u0432\u043d\u043e\u0435, \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0435 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u043b\u0438, \u043f\u043e \u043a\u0430\u043a\u043e\u043c\u0443 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u0438. \u0427\u0442\u043e\u0431\u044b \u0443\u043d\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0438 \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e.<\/p>\n<h3>\u0417\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u043d\u044b \u0443\u0442\u0438\u043b\u0438\u0442\u044b<\/h3>\n<p>\u0427\u0442\u043e\u0431\u044b \u0434\u0435\u043b\u0430\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044f\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u0430 \u0433\u043e\u043b\u043e\u043c Xcode, \u043d\u0443\u0436\u043d\u043e:<\/p>\n<ul>\n<li>\n<p>\u041f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u0438\u0446\u0443 \u043c\u0435\u0436\u0434\u0443 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438, \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430\u043c\u0438 \u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u0442\u0430\u0440\u0433\u0435\u0442\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u0423\u043c\u0435\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0441 \u043d\u0443\u043b\u044f.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043b\u0438\u043d\u043a\u043e\u0432\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0423\u043c\u0435\u0442\u044c \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u043e\u0442\u043b\u0430\u0434\u043a\u0443 \u043c\u043e\u0434\u0443\u043b\u0435\u0439.<\/p>\n<\/li>\n<\/ul>\n<p>\u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0432\u0441\u0451 \u0441\u043b\u043e\u0436\u043d\u043e. \u0418 \u044d\u0442\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043c\u0438\u043d\u0443\u0441 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u0438. \u0427\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u043d\u0438\u0432\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u0430\u043c\u0438 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432. \u041e\u043d\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438. \u0413\u043e\u0440\u0430\u0437\u0434\u043e \u043f\u0440\u043e\u0449\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u043d\u0438\u0445, \u0447\u0435\u043c \u0432 \u0442\u043e\u043c, \u0433\u0434\u0435 \u0436\u0435 \u044d\u0442\u043e \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 Xcode.<\/p>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043c\u043e\u0436\u0435\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b, \u043a\u043e\u0433\u0434\u0430 <em>Network<\/em>, <em>Library<\/em> \u0438 \u043f\u0440\u043e\u0447\u0438\u0435 \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0443\u0442\u0438\u043b\u0438\u0442\u0430\u043c\u0438. <\/p>\n<p>\u041c\u044b \u0432 Surf \u0441\u0442\u0440\u0435\u043c\u0438\u043c\u0441\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0443\u0442\u0438\u043b\u0438\u0442:<\/p>\n<ul>\n<li>\n<p>\u0421\u0435\u0442\u0435\u0432\u043e\u0439 \u0441\u043b\u043e\u0439 \u0438 \u043c\u043e\u0434\u0435\u043b\u044c\u043a\u0438 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c <a href=\"http:\/\/go.surf.ru\/hr\/ios\/habr\/modularizationXcode3\"><em>SurfGen<\/em><\/a>.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0435\u0441\u0443\u0440\u0441\u044b \u0438 \u043a\u043b\u044e\u0447\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043d\u0438\u043c \u2014 <a href=\"http:\/\/go.surf.ru\/hr\/ios\/habr\/modularizationXcode4\"><em>FigmaGen<\/em><\/a> \u0438 <a href=\"http:\/\/go.surf.ru\/hr\/ios\/habr\/modularizationXcode5\"><em>SwiftGen<\/em><\/a>.<\/p>\n<\/li>\n<li>\n<p>\u0427\u0430\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 UI-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0438\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044d\u043a\u0440\u0430\u043d\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u0444\u043b\u043e\u0443-\u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u043e\u0441\u043d\u043e\u0432\u0443 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0438\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 <a href=\"http:\/\/go.surf.ru\/hr\/ios\/habr\/modularizationXcode6\"><em>Generamba<\/em><\/a>.<\/p>\n<\/li>\n<\/ul>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f3c\/602\/fa8\/f3c602fa8e7592220a23a97704dc5297.png\" width=\"1920\" height=\"1080\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f3c\/602\/fa8\/f3c602fa8e7592220a23a97704dc5297.png\"\/><\/figure>\n<p>\u041d\u0430 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0435 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430\u043c\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0430 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f: \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043e <em>Flow <\/em>\u043c\u043e\u0434\u0443\u043b\u044f\u0445 \u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 <em>Application<\/em>. <\/p>\n<p>\u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043a \u044d\u0442\u0438\u043c \u043c\u043e\u0434\u0443\u043b\u044f\u043c \u0434\u043e\u0431\u0430\u0432\u044f\u0442\u0441\u044f \u0435\u0449\u0451 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041d\u0430\u0437\u043e\u0432\u0435\u043c \u0438\u0445 \u00ab\u043c\u043e\u0434\u0443\u043b\u044f\u043c\u0438 \u0441\u0432\u044f\u0437\u0438\u00bb: \u0432 \u043d\u0438\u0445 \u043f\u043e\u043f\u0430\u0434\u0443\u0442 \u043e\u0431\u0449\u0438\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b \u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u0432\u044b\u0448\u0435\u0441\u0442\u043e\u044f\u0449\u0438\u0445 \u043c\u043e\u0434\u0443\u043b\u044f\u0445 \u0438 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u044e\u0442 \u0438\u0445 \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/499\/997\/5f5\/4999975f52ef5eed1bb2e20436bba635.png\" width=\"1920\" height=\"1080\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/499\/997\/5f5\/4999975f52ef5eed1bb2e20436bba635.png\"\/><\/figure>\n<p>Utils \u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043c\u043e\u0434\u0443\u043b\u0435\u0439 Features \u2014 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0441\u0432\u044f\u0437\u0438.<\/p>\n<p><strong>Utils<\/strong> \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u0432\u044f\u0437\u0438 \u043c\u0435\u0436\u0434\u0443 \u0431\u0438\u0437\u043d\u0435\u0441-\u043c\u043e\u0434\u0443\u043b\u044f\u043c\u0438 \u0438 UI-\u043c\u043e\u0434\u0443\u043b\u044f\u043c\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <em>DateFormatter<\/em> \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 <em>Models<\/em> \u0434\u043b\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u0434\u0430\u0442 \u0438 \u0432 <em>Library \u2014<\/em> \u0434\u043b\u044f \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0435\u0445 \u0436\u0435 \u0434\u0430\u0442 \u0432 \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0439 \u0432\u0438\u0434. <\/p>\n<p><strong>Features<\/strong> (\u0444\u0438\u0447\u0430-\u043c\u043e\u0434\u0443\u043b\u0438) \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043c\u044b \u0432\u044b\u043d\u0435\u0441\u043b\u0438 \u0432 \u043d\u0438\u0445 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u043a\u043e\u043d\u043a\u0438 \u043e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u0439 \u0432 <em>Navigation Bar<\/em>. \u0424\u0438\u0447\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u043b\u0430\u0441\u044c \u0432 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 <em>UIBarButtonItem<\/em> \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u043e\u0439. \u0415\u0451 \u043d\u0435\u043b\u044c\u0437\u044f \u0431\u044b\u043b\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0432 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0441\u043b\u043e\u0439 \u0438 \u0441\u043b\u043e\u0439 c UI-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438. \u042d\u0442\u043e\u0442 \u043c\u043e\u0434\u0443\u043b\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u043d\u0430 \u0434\u0435\u0441\u044f\u0442\u0438 \u044d\u043a\u0440\u0430\u043d\u0430\u0445 \u0438\u0437 \u0440\u0430\u0437\u043d\u044b\u0445 \u0444\u043b\u043e\u0443.\u00a0<\/p>\n<p><strong>\u0412\u044b\u0432\u043e\u0434:<\/strong> <strong>\u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0431\u044b\u0432\u0430\u0435\u0442 \u043c\u043d\u043e\u0433\u043e<\/strong>, \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u043c\u0438 \u0431\u0435\u0437 \u0443\u0442\u0438\u043b\u0438\u0442 \u0441\u043b\u043e\u0436\u043d\u043e. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u043c\u043e\u0434\u0443\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 \u0433\u043e\u043b\u043e\u043c Xcode. \u041e\u0447\u0430\u0433 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432 \u2014 xcworkspace \u0441\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u043f\u043e\u0434\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0438\u043b\u0438 \u043f\u0443\u0445\u043b\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u0442\u0430\u0440\u0433\u0435\u0442\u043e\u0432.\u00a0\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0430\u0440\u0433\u0435\u0442\u0430 \u0432\u0440\u0443\u0447\u043d\u0443\u044e <strong>\u043f\u043e\u0432\u044b\u0448\u0430\u0435\u0442 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438<\/strong>. <\/p>\n<p>\u0411\u0430\u0437\u043e\u0432\u044b\u0439\u00a0\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043c\u043e\u0434\u0443\u043b\u044f:<\/p>\n<ul>\n<li>\n<p>\u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0442\u0438\u043f \u0442\u0430\u0440\u0433\u0435\u0442\u0430,\u00a0<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0444\u043b\u0430\u0433\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438,<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438,<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u043e\u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0437\u0430 \u0442\u0435\u043c, \u0447\u0442\u043e \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b \u043c\u043e\u0434\u0443\u043b\u044f \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0432 \u043d\u043e\u0432\u044b\u0439 \u0442\u0430\u0440\u0433\u0435\u0442, \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.<\/p>\n<\/li>\n<\/ul>\n<p>\u0413\u043e\u0440\u0430\u0437\u0434\u043e \u043f\u0440\u043e\u0449\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u0438\u043b\u0438 \u0442\u0430\u0440\u0433\u0435\u0442\u044b \u043f\u043e\u0434 \u043c\u043e\u0434\u0443\u043b\u0438\u00a0\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0443\u0442\u0438\u043b\u0438\u0442 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0443\u043b\u044f\u043c\u0438. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 XcodeGen \u0438 Tuist.<\/p>\n<h3>XcodeGen<\/h3>\n<p>\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 <a href=\"http:\/\/go.surf.ru\/hr\/ios\/habr\/modularizationXcode1\">XcodeGen<\/a>:<\/p>\n<ul>\n<li>\n<p>\u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u0438\u043b\u0438 \u0442\u0430\u0440\u0433\u0435\u0442\u044b \u0438\u0437 <strong>yml<\/strong> \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432. \u041a\u0430\u043a \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435 \u2014 \u0432\u0441\u0435 xcworkspace \u0438 pbxproj \u0444\u0430\u0439\u043b\u044b \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0435\u0437\u0434\u0430 \u043d\u0430 XcodeGen \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u0441\u043b\u0430\u043d\u044b \u0432 gitignore. \u042d\u0442\u043e \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u0435\u0440\u0435 \u0437\u0430\u0449\u0438\u0449\u0430\u0435\u0442 \u043d\u0430\u0441 \u043e\u0442 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432 \u2014 \u043d\u043e \u0435\u0441\u043b\u0438 \u0432\u0441\u0435 \u0442\u0430\u0440\u0433\u0435\u0442\u044b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043d\u043e\u043c yml, \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u044b \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0431\u0443\u0434\u0443\u0442.\u00a0 <\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043b\u044e\u0431\u043e\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u041f\u043e\u0434\u044b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0438 \u043b\u0438\u043d\u043a\u0443\u044e\u0442\u0441\u044f \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u0447\u0435\u0440\u0435\u0437 Podfile. \u0414\u043b\u044f carthage \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0438 packages \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0440\u0435\u0444\u0435\u0440\u0435\u043d\u0441 \u0432 yml.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u0431\u043e\u043b\u044c\u0448\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u0435\u0439. \u0427\u0442\u043e\u0431\u044b yml \u043d\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043b\u0441\u044f \u0432 \u043f\u043e\u043a\u0440\u044b\u0442\u044b\u0439 \u043c\u0445\u043e\u043c \u043c\u043e\u043d\u043e\u043b\u0438\u0442 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u044b\u0441\u044f\u0447 \u0441\u0442\u0440\u043e\u043a, \u0432 XcodeGen \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0448\u0430\u0431\u043b\u043e\u043d\u044b.<\/p>\n<pre><code class=\"yaml\">ServicesFramework:     platform: iOS     deploymentTarget: 12.0     type: framework     sources:       - TestProject\/Services\/${source_folder}     info:       path: TestProject\/Services\/${source_folder}\/Info.plist     settings:       base:         PRODUCT_BUNDLE_IDENTIFIER: ru.surfstudio.testproject.service.${target_name}       configs:         Debug:           EXCLUDED_ARCHS[sdk=iphonesimulator*]: \"arm64\" <\/code><\/pre>\n<p>\u0428\u0430\u0431\u043b\u043e\u043d\u0443 \u0442\u0430\u0440\u0433\u0435\u0442\u0430 \u0434\u0430\u0451\u0442\u0441\u044f \u0438\u043c\u044f, \u0430 \u0437\u0430\u0442\u0435\u043c \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f <strong>\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0431\u0430\u0437\u044b<\/strong> \u0442\u0430\u0440\u0433\u0435\u0442\u0430. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441 \u0444\u0438\u0433\u0443\u0440\u043d\u044b\u043c\u0438 \u0441\u043a\u043e\u0431\u043a\u0430\u043c\u0438: <em>source_folder<\/em> \u0438 <em>target_name<\/em>. \u042d\u0442\u043e <strong>\u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u0430: <\/strong>\u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.<\/p>\n<p>\u0410\u0442\u0440\u0438\u0431\u0443\u0442 <em>target_name<\/em> \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u043d \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0442\u0430\u0440\u0433\u0435\u0442\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0435\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d (\u0437\u0434\u0435\u0441\u044c \u2014 <em>NetworkServices<\/em>). \u0410\u0442\u0440\u0438\u0431\u0443\u0442 <em>source_folder<\/em>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043f\u043e\u0434\u043f\u0430\u043f\u043a\u0443 \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u043c\u0438 \u0442\u0430\u0440\u0433\u0435\u0442\u0430, \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u0442\u0430\u043a.<\/p>\n<pre><code class=\"yaml\"># \u0428\u0430\u0431\u043b\u043e\u043d\u044b include:   - path: ..\/templates.yml     relativePaths: false # \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 name: NetworkServices targets:     NetworkServices:       templates:         - ServicesFramework       templateAttributes:         source_folder: Network       dependencies:         - target: Models           embed: false         - target: SecurityServices           embed: false<\/code><\/pre>\n<p>\u041a\u0430\u043a\u043e\u0439 \u0438\u043c\u0435\u043d\u043d\u043e \u0448\u0430\u0431\u043b\u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043a\u043b\u044e\u0447\u0435\u0432\u0438\u043a <em>templates<\/em>. \u041e\u0434\u0438\u043d \u0442\u0430\u0440\u0433\u0435\u0442 <strong>\u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432<\/strong>. \u0415\u0441\u043b\u0438 \u0448\u0430\u0431\u043b\u043e\u043d \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c yml \u043a\u043e\u043d\u0444\u0438\u0433\u0435, \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0443\u0442\u044c \u043a \u043d\u0435\u043c\u0443, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <strong>include<\/strong>.<\/p>\n<p>\u041b\u044e\u0431\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0438\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0432 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u0442\u0430\u0440\u0433\u0435\u0442\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0435 \u0434\u043b\u044f \u0442\u0430\u0440\u0433\u0435\u0442\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0441\u0435 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438, \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0447\u0435\u0440\u0435\u0437 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b.<\/p>\n<pre><code class=\"yaml\">App:     type: application     platform: iOS     deploymentTarget: 12.0     dependencies:       - target: Utils       - target: Resources       - target: Models       - target: SecurityServices       - target: NetworkServices       - target: AnalyticsServices       - target: PushServices       - target: NotificationsFeature       - target: Library       - target: AuthFlow       - target: NotificationsFlow       - target: MonitoringFlow       - target: ProfileFlow  attributes:       SystemCapabilities:         com.apple.Push:           enabled: 1     info:       path: TestProject\/Application\/Info\/Info.plist       properties:         CFBundleName: ${bundle_name}         CFBundleDisplayName: ${bundle_display_name}         CFBundleShortVersionString: $(MARKETING_VERSION)         CFBundleVersion: $(CURRENT_PROJECT_VERSION)         CFBundleDevelopmentRegion: ru         UILaunchStoryboardName: Launch Screen         UIUserInterfaceStyle: Light         UIBackgroundModes: [remote-notification]         UISupportedInterfaceOrientations:           - UIInterfaceOrientationPortrait           - UIInterfaceOrientationLandscapeLeft           - UIInterfaceOrientationLandscapeRight         NSAppTransportSecurity:             NSAllowsArbitraryLoads: true             NSExceptionDomains:               testproject.co.ru:                 NSExceptionAllowsInsecureHTTPLoads: true                 NSIncludesSubdomains: true     settings:       base:         PRODUCT_BUNDLE_IDENTIFIER: com.testproject.${bundle_suffix}         ASSETCATALOG_COMPILER_APPICON_NAME: ${icon_name}         TARGETED_DEVICE_FAMILY: 1       configs:         Debug:           EXCLUDED_ARCHS[sdk=iphonesimulator*]: \"arm64\"<\/code><\/pre>\n<p>\u0410 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0435 \u0442\u0430\u0440\u0433\u0435\u0442\u0430 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0438\u0445.<\/p>\n<pre><code class=\"yaml\">TestProject:       templates:         - App       templateAttributes:         bundle_name: TestProjectDebug         bundle_display_name: \u041c\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442         bundle_suffix: kissmp.debug         icon_name: AppIcon-Debug       scheme:         configVariants: all         testTargets:           - UnitTests       sources:         - path: TestProject\/Application           excludes:             - \"**\/.gitkeep\"             - \"Info\/*\/*\"         - path: TestProject\/Application\/Info\/GoogleService-Info.plist           buildPhase: resources       dependencies:         - target: DebugScreen       info:         path: TestProject\/Application\/Info\/Info.plist       settings:         base:           MARKETING_VERSION: \"0.1.6\"           CURRENT_PROJECT_VERSION: 78           DEVELOPMENT_TEAM: EFAAG9GXN4           CODE_SIGN_ENTITLEMENTS: TestProject\/TestProject.entitlements           CODE_SIGN_IDENTITY: \"iPhone Developer\"           CODE_SIGN_STYLE: Manual           PROVISIONING_PROFILE_SPECIFIER: \"com.testproject.kissmp.debug-Development\"       preBuildScripts:         - script: ${PODS_ROOT}\/SwiftLint\/swiftlint <\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043a \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u043e\u0434\u0443\u043b\u044c <em>DebugScreen<\/em>. \u0412\u0441\u0435 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f. <strong>\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u0432\u0441\u0435\u0433\u0434\u0430 \u0443 \u043a\u043e\u043d\u0444\u0438\u0433\u0430 \u0442\u0430\u0440\u0433\u0435\u0442\u0430, \u0430 \u043d\u0435 \u0443 \u0448\u0430\u0431\u043b\u043e\u043d\u0430<\/strong>.<\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u0435\u0440\u0435\u0432\u043e yml \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c:<\/p>\n<ul>\n<li>\n<p>\u0420\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u043e\u0449\u0435, \u0447\u0435\u043c \u0432 \u0434\u0435\u0440\u0435\u0432\u0435 \u0442\u0430\u0440\u0433\u0435\u0442\u043e\u0432 \u0438\u043b\u0438 Xcode-\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043f\u0430\u0441\u0430\u0435\u043c\u0441\u044f \u043e\u0442 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432.<\/p>\n<\/li>\n<\/ul>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/693\/3f5\/38d\/6933f538da3b1a848c163110a3c970b0.png\" alt=\"\u0414\u0435\u0440\u0435\u0432\u043e yml \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432\" title=\"\u0414\u0435\u0440\u0435\u0432\u043e yml \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432\" width=\"272\" height=\"673\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/693\/3f5\/38d\/6933f538da3b1a848c163110a3c970b0.png\"\/><\/p>\n<div><figcaption>\u0414\u0435\u0440\u0435\u0432\u043e yml \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432<\/figcaption><\/div>\n<\/figure>\n<p>\u041c\u0438\u043d\u0443\u0441\u044b \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u0438 \u0441 XcodeGen: \u00a0<\/p>\n<ul>\n<li>\n<p>\u041d\u0443\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043c\u0438\u0434\u0434\u043b\u043e\u043c \u043f\u043e \u0443\u0440\u043e\u0432\u043d\u044e \u043a\u043e\u043c\u043f\u0435\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u0432 \u0433\u043e\u0442\u043e\u0432\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0443\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u044f\u0437\u044b\u043a \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0438 YAML: \u043d\u0430 \u043d\u0451\u043c \u043f\u0438\u0448\u0443\u0442\u0441\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0438.<\/p>\n<\/li>\n<li>\n<p>XcodeGen \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u044b\u0434\u0430\u0441\u0442 \u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u043c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435, \u0430 \u043d\u0435 \u0432 IDE.<\/p>\n<\/li>\n<\/ul>\n<h3>Tuist<\/h3>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 <a href=\"http:\/\/go.surf.ru\/hr\/ios\/habr\/modularizationXcode2\">Tuist<\/a> \u0437\u0432\u0443\u0447\u0430\u0442 \u043c\u043d\u043e\u0433\u043e\u043e\u0431\u0435\u0449\u0430\u044e\u0449\u0435<a href=\"https:\/\/github.com\/tuist\/tuist\"><strong>:<\/strong><\/a><\/p>\n<ul>\n<li>\n<p>\u041f\u0440\u043e\u0435\u043a\u0442\u044b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430 Swift, \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 Xcode.\u00a0<\/p>\n<\/li>\n<li>\n<p>\u041c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b, \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u044f\u044e\u0449\u0438\u0435 \u0442\u0443\u043b\u0438\u043d\u0433 \u043d\u0430 \u0432\u0438\u043d\u0435\u0433\u0440\u0435\u0442\u0435 \u0438\u0437 fastlane, ruby \u0438 shell.<\/p>\n<\/li>\n<li>\n<p>\u0421\u0430\u043c \u043a\u0430\u0447\u0430\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u0437 SPM \u0438\u043b\u0438 Carthage.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u043e\u0441\u043d\u043e\u0432\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0443 Tuist \u2014 Swift Package Manager.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/fcb\/8d6\/39c\/fcb8d639cb8e8a4d7f4925416245e848.png\" alt=\"\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0434\u043b\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0412 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 \u2014 \u0441\u0445\u0435\u043c\u0430-\u0448\u043f\u0430\u0440\u0433\u0430\u043b\u043a\u0430 \u0434\u043b\u044f \u0441\u0442\u0430\u0440\u0442\u0430 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u0438\" title=\"\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0434\u043b\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0412 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 \u2014 \u0441\u0445\u0435\u043c\u0430-\u0448\u043f\u0430\u0440\u0433\u0430\u043b\u043a\u0430 \u0434\u043b\u044f \u0441\u0442\u0430\u0440\u0442\u0430 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u0438\" width=\"1048\" height=\"551\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/fcb\/8d6\/39c\/fcb8d639cb8e8a4d7f4925416245e848.png\"\/><\/p>\n<div><figcaption>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0434\u043b\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0412 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 \u2014 \u0441\u0445\u0435\u043c\u0430-\u0448\u043f\u0430\u0440\u0433\u0430\u043b\u043a\u0430 \u0434\u043b\u044f \u0441\u0442\u0430\u0440\u0442\u0430 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u0438<\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0431\u0435\u0440\u0451\u043c\u0441\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443<strong> <\/strong><code>tuist edit<\/code>, \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u0432\u043e\u0440\u043a\u0441\u043f\u0435\u0439\u0441. \u042d\u0442\u043e \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u0437\u0430\u043c\u0443\u0441\u043e\u0440\u0438\u0442 recents \u043f\u0440\u043e\u0435\u043a\u0442\u044b Xcode.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cb6\/e24\/cd4\/cb6e24cd4042546f7845c7c650bc3698.png\" alt=\"\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0434\u0443\u0431\u043b\u0435\u0439 \u0432 \u043d\u0435\u0434\u0430\u0432\u043d\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445\" title=\"\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0434\u0443\u0431\u043b\u0435\u0439 \u0432 \u043d\u0435\u0434\u0430\u0432\u043d\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445\" width=\"306\" height=\"207\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/cb6\/e24\/cd4\/cb6e24cd4042546f7845c7c650bc3698.png\"\/><\/p>\n<div><figcaption>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0434\u0443\u0431\u043b\u0435\u0439 \u0432 \u043d\u0435\u0434\u0430\u0432\u043d\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445<\/figcaption><\/div>\n<\/figure>\n<p>\u0427\u0442\u043e\u0431\u044b \u0442\u0430\u043a\u043e\u0433\u043e \u043d\u0435 \u0431\u044b\u043b\u043e, \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0441 \u0444\u043b\u0430\u0433\u043e\u043c <code>-P<\/code><strong>.<\/strong><\/p>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0438\u043b\u0438 \u0442\u0430\u0440\u0433\u0435\u0442\u043e\u0432 \u0434\u043b\u044f \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u0438 \u0432 Tuist \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u044b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u044f\u0437\u044b\u043a\u0430 Swift. <\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b.<\/p>\n<pre><code class=\"swift\">import ProjectDescription  public enum Constants {      public static let organization = \"mycompany\"     public static let j2objcHome = \"J2OBJC_2_5_HOME\"  }<\/code><\/pre>\n<p>\u041f\u0438\u0441\u0430\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u043a \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u043c.<\/p>\n<p>\u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u2014 \u0441\u043e\u0431\u043b\u044e\u0434\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u043e: \u0432\u0441\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0441\u043e\u0431\u0440\u0430\u043d\u044b \u0432 \u043f\u0430\u043f\u043a\u0435\u00a0 <em>tuist\/ProjectDescriptionHelpers<\/em>. \u0422\u043e\u0433\u0434\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442 \u0438\u0445 \u0432 \u043e\u0434\u043d\u043e\u0438\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c.<\/p>\n<pre><code class=\"swift\">import ProjectDescription  public extension TargetScript {      \/\/\/ Running SwiftGen to generate resource accessors     \/\/\/  - Parameters:     \/\/\/     - binaryPath: path to folder `SwiftGen\/bin\/swiftgen` relative to `$(SRCROOT)`     \/\/\/     - Example: `..`     \/\/\/  - Warning: SwiftGen.yml should placed in root of target with Resources     static func swiftgen(binaryPath: String) -> TargetScript {          let name = \"Generate resource files\"          let script: String = \"${SRCROOT}\/\\(binaryPath)\/SwiftGen\/bin\/swiftgen\"          return .pre(script: script,                     name: name)     }    }<\/code><\/pre>\n<p>Tuist \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u0430\u0436\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 Xcode \u0438 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043e\u0442\u0441\u0442\u0443\u043f\u043e\u0432 \u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 \u0441\u0442\u0440\u043e\u043a.\u00a0<\/p>\n<pre><code class=\"swift\">import ProjectDescription  public extension ProjectOption {      static let `default`: ProjectOption = .textSettings(usesTabs: true,                                                         indentWidth: 4,                                                         tabWidth: 4,                                                         wrapsLines: true)  }<\/code><\/pre>\n<p>\u0412\u043d\u0435\u0448\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u0441\u0435\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0432 \u043e\u0434\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435. \u041f\u0440\u0438\u0447\u0435\u043c \u0442\u0443\u0442 \u0441\u043e\u0441\u0435\u0434\u0441\u0442\u0432\u0443\u044e\u0442 SPM \u0438 carthage \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438.<\/p>\n<pre><code class=\"swift\">import ProjectDescription  let dependencies = Dependencies(     carthage: [         .github(path: \"tonyarnold\/Differ\",                 requirement: .exact(\"1.4.5\")),         .github(path: \"airbnb\/lottie-ios\",                 requirement: .exact(\"3.2.3\"))     ],     swiftPackageManager: .init([         .remote(url: \"https:\/\/github.com\/surfstudio\/ReactiveDataDisplayManager\",                 requirement: .exact(\"8.0.5-beta\")),         .remote(url: \"https:\/\/github.com\/kishikawakatsumi\/KeychainAccess.git\",                 requirement: .exact(\"4.2.2\")),         .remote(url: \"https:\/\/github.com\/ReactiveX\/RxSwift.git\",                 requirement: .exact(\"6.2.0\")),         .remote(url: \"https:\/\/github.com\/CombineCommunity\/RxCombine.git\",                 requirement: .exact(\"2.0.1\")),         .remote(url: \"https:\/\/github.com\/ra1028\/DifferenceKit.git\",                 requirement: .exact(\"1.2.0\")),         .remote(url: \"https:\/\/github.com\/pointfreeco\/swift-snapshot-testing.git\",                 requirement: .exact(\"1.8.2\"))     ], deploymentTargets: [.iOS(targetVersion: \"9.0\", devices: [.iphone])]),     platforms: [.iOS] ) <\/code><\/pre>\n<p>\u0414\u043b\u044f \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0435\u0441\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430<code>tuist dependencies fetch<\/code>. \u041b\u0438\u043d\u043a\u043e\u0432\u043a\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432.<\/p>\n<p>\u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e Cocoapods \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f. \u042d\u0442\u0438 \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0443\u044e\u0442 \u0432 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438. \u0418 Cocoapods, \u0438 Tuist \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442 xcworkspace.\u00a0<\/p>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043c\u043e\u0434\u0443\u043b\u044f. \u0424\u0430\u0439\u043b Project.swift.<\/p>\n<p>\u0412\u0441\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c. \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 XcodeGen, \u0442\u0443\u0442 \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043e\u0442 IDE, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043b\u0435\u0433\u0447\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u0432 \u043a\u0430\u043a\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0430 \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u0443 \u0438\u043b\u0438 \u0438\u043d\u0443\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443.<\/p>\n<pre><code class=\"swift\">import ProjectDescription import ProjectDescriptionHelpers  let project = Project(     name: \"legacy\",     options: [.default],     settings: .settings(base: [         \"HEADER_SEARCH_PATHS\": [\"..\/model\/j2objc_dist\/frameworks\/JRE.framework\/Headers\"]     ]),     targets: [         Target(name: \"Legacy\",                platform: .iOS,                product: .staticFramework,                bundleId: \"com.mycompany.mobile.stocks.legacy\",                deploymentTarget: .default,                infoPlist: \"legacy\/Info.plist\",                sources: [\"legacy\/**\"],                headers: .init(                 public: [                     \"legacy\/Chaos\/**\",                     \"legacy\/UI\/Screens\/OrderEntry\/OEModel\/**\",                     \"legacy\/UI\/Screens\/OrderEntry\/DXOrderEditorListener.h\",                     \"legacy\/legacy.h\"                 ],                 private: nil,                 project: [\"legacy\/UI\/Screens\/OrderEntry\/Listener\/**\"]),                dependencies: [                 .project(target: \"SharedModel\", path: \"..\/model\"),                ])     ] ) <\/code><\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u044b, \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0445\u0435\u043c\u044b \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0432 \u043c\u043d\u043e\u0433\u043e\u043c\u043e\u0434\u0443\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f Workspace.swift.\u00a0<\/p>\n<pre><code class=\"swift\">import ProjectDescription  let workspace = Workspace(     name: \"Stocks\",     projects: [         \"legacy\",         \"model\",         \"stocks\",         \"stocks-ui-kit\"     ],     schemes: [         Scheme(name: \"Stocks\",                shared: true,                buildAction: .buildAction(targets: [                 .project(path: \"legacy\", target: \"legacy\"),                 .project(path: \"model\", target: \"SharedModel\"),                 .project(path: \"stocks-ui-kit\", target: \"StocksUI\"),                 .project(path: \"stocks\", target: \"Stocks\")                ]),                testAction: .targets([                 TestableTarget(target: .project(path: \"stocks\", target: \"UnitTests\"))                ]),                runAction: .runAction(configuration: \"Debug\",                                      executable: TargetReference(projectPath: \"stocks\",                                                                  target: \"Stocks\")),                archiveAction: .archiveAction(configuration: \"Debug\")),         Scheme(name: \"StocksUI\",                shared: true,                buildAction: .buildAction(targets: [                 .project(path: \"stocks-ui-kit\", target: \"StocksUI\"),                 .project(path: \"stocks-ui-kit\", target: \"StocksUI-App\")                ]),                testAction: .targets([                 TestableTarget(target: .project(path: \"stocks-ui-kit\", target: \"SnapshotTests\"))                ]),                runAction: .runAction(configuration: \"Debug\",                                      executable: TargetReference(projectPath: \"stocks-ui-kit\",                                                                  target: \"StocksUI-App\")),                archiveAction: .archiveAction(configuration: \"Debug\"))     ] ) <\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u043e\u0439 \u0432\u044b\u0434\u0435\u043b\u0435\u043d \u043c\u043e\u0434\u0443\u043b\u044c \u0441 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u043c\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0438 \u0441\u043d\u0430\u043f\u0448\u043e\u0442-\u0442\u0435\u0441\u0442\u044b \u0438 Example-app.<\/p>\n<p>\u041f\u043b\u044e\u0441\u044b Tuist \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043c\u043d\u043e\u0433\u043e\u043c\u043e\u0434\u0443\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432:<\/p>\n<ul>\n<li>\n<p>\u041c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u044b.\u00a0<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0449\u0435 \u043d\u0435\u043a\u0443\u0434\u0430. \u0417\u043d\u0430\u0435\u0448\u044c Swift \u2014 \u0441\u043f\u0440\u0430\u0432\u0438\u0448\u044c\u0441\u044f \u0438 \u0442\u0443\u0442.<\/p>\n<\/li>\n<li>\n<p>\u0428\u0438\u0440\u043e\u043a\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438 \u043f\u043b\u0430\u043d\u044b \u043f\u043e \u0437\u0430\u043c\u0435\u043d\u0435 \u0442\u0443\u043b\u043e\u0432 fastlane, ruby-gems \u0438 \u0434\u0440\u0443\u0433\u0438\u0445.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u0440\u0438\u0441\u0443\u044e\u0442 \u0440\u0430\u0434\u0443\u0436\u043d\u044b\u0435 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u044b.<\/p>\n<\/li>\n<\/ul>\n<p>\u041c\u0438\u043d\u0443\u0441\u044b:<\/p>\n<ul>\n<li>\n<p>\u041f\u0440\u043e\u0435\u043a\u0442 \u043c\u043e\u043b\u043e\u0434\u043e\u0439, \u0431\u0430\u0433\u043e\u0432 \u043c\u043d\u043e\u0433\u043e. \u0427\u0430\u0441\u0442\u044c \u0438\u0437 \u043d\u0438\u0445 \u2014 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0445\u043e\u0442\u0435\u043b\u0438 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0436\u0438\u0437\u043d\u044c.<strong> \u0423\u043f\u0440\u043e\u0441\u0442\u0438\u043b\u0438 \u0436\u0438\u0437\u043d\u044c \u043e\u0434\u043d\u0438\u043c \u2014 \u0443\u0441\u043b\u043e\u0436\u043d\u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u043c<\/strong>.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043b\u043e\u0436\u043d\u0430\u044f \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 Tuist \u0432\u0441\u0442\u0440\u043e\u0435\u043d \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043a\u043b\u044e\u0447\u0435\u0439 \u0434\u043b\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 <em>SwiftGen<\/em>. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u044b stencil, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u043d\u0430 SwiftGen, \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0432\u043d\u0443\u0442\u0440\u0438 Tuist. <\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u043a\u0430 \u044f \u0431\u044b \u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Tuist \u043a\u0430\u043a \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442, \u043d\u043e \u043f\u043e\u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u043d\u0438\u043c \u043d\u0430 \u043d\u043e\u0432\u044b\u0445 \u2014 \u043d\u0435\u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 \u0438\u043b\u0438 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u2014 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u043c\u043e\u0436\u043d\u043e.<\/p>\n<hr\/>\n<p>\u041c\u043e\u0434\u0443\u043b\u0438 \u0443\u0441\u043a\u043e\u0440\u044f\u044e\u0442 \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u043d\u0430 100%. \u0412 \u0441\u0432\u044f\u0437\u043a\u0435 \u0441 \u0443\u0442\u0438\u043b\u0438\u0442\u0430\u043c\u0438 \u0434\u043b\u044f \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0433\u0440\u0430\u0444 \u043c\u043e\u0434\u0443\u043b\u0435\u0439, \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0433\u043e\u0442\u043e\u0432\u044b \u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e.\u00a0<\/p>\n<p>\u041c\u044b \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u0438, \u0447\u0442\u043e XcodeGen \u0441\u0442\u0430\u0431\u0438\u043b\u0435\u043d, \u0430 Tuist \u0441\u044b\u0440\u043e\u0432\u0430\u0442, \u043d\u043e \u0438\u043c\u0435\u0435\u0442 \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0439 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b. \u0412\u0430\u043c \u0440\u0435\u0448\u0430\u0442\u044c, \u043a\u0430\u043a\u0443\u044e \u0443\u0442\u0438\u043b\u0438\u0442\u0443 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0438 \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u044d\u0442\u043e \u0432\u0430\u0448\u0435\u043c\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0443: \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c \u0438\u0437 \u043f\u0430\u0440\u044b \u044d\u043a\u0440\u0430\u043d\u043e\u0432 \u043c\u043d\u043e\u0433\u043e\u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0435 \u043d\u0443\u0436\u043d\u0430.<\/p>\n<blockquote>\n<p>\u0411\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0433\u043e \u043f\u0440\u043e iOS \u2014 \u0432 \u043d\u0430\u0448\u0435\u043c \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c-\u043a\u0430\u043d\u0430\u043b\u0435 Surf iOS Team. \u041f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c \u043a\u0435\u0439\u0441\u044b, \u043b\u0443\u0447\u0448\u0438\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438, \u043d\u043e\u0432\u043e\u0441\u0442\u0438 \u0438 \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0438 Surf. <a href=\"https:\/\/t.me\/+4DoZ6JwzcB4xYmFi\"><strong>\u041f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0439\u0442\u0435\u0441\u044c >><\/strong><\/a><\/p>\n<\/blockquote>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/590263\/\"> https:\/\/habr.com\/ru\/articles\/590263\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041a\u043e\u0433\u0434\u0430 \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u0435\u0448\u044c\u0441\u044f \u043e \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0438 \u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u0438, \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043a\u0443\u0447\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432: \u043a\u0430\u043a \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u043c\u043e\u0434\u0443\u043b\u044f\u043c\u0438? \u041a \u0447\u0435\u043c\u0443 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u0438? \u041a\u0430\u043a \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435?\u00a0<\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u043f\u0443\u0442\u0438\u00a0\u043d\u0435\u043c\u0443\u0434\u0440\u0435\u043d\u043e \u0437\u0430\u0431\u043b\u0443\u0434\u0438\u0442\u044c\u0441\u044f: \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u0438 \u2014 \u044d\u0442\u043e \u0441\u043b\u043e\u0436\u043d\u043e. \u041a\u0430\u043a \u0438 \u043b\u044e\u0431\u043e\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u0438 \u0440\u0443\u0442\u0438\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0435\u0433\u043e \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0423\u0442\u0438\u043b\u0438\u0442\u044b \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u0438 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u0438.<\/p>\n<p>\u042f \u2014 <a href=\"http:\/\/go.surf.ru\/hr\/ios\/habr\/modularizationXcode8\">\u041d\u0438\u043a\u0438\u0442\u0430 \u041a\u043e\u0440\u043e\u0431\u0435\u0439\u043d\u0438\u043a\u043e\u0432<\/a>, iOS Team Lead <a href=\"https:\/\/surf.ru\/?utm_source=habr&amp;utm_medium=organic&amp;utm_campaign=bit_ili_ne_bit_moduli_v_xcode_sravnivaem_xcodegen_i_tuist\">\u0432 Surf<\/a>. \u041f\u0440\u043e\u0432\u0435\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"http:\/\/go.surf.ru\/hr\/ios\/habr\/modularizationXcode1\">XcodeGen<\/a> \u0438 <a href=\"http:\/\/go.surf.ru\/hr\/ios\/habr\/modularizationXcode2\">Tuist<\/a>. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e\u0431 \u044d\u0442\u043e\u043c \u043e\u043f\u044b\u0442\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0434\u0435\u043b\u044e\u0441\u044c \u043d\u0430\u0448\u0438\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043e\u0431 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0433\u0440\u0430\u0444\u0435 \u043c\u043e\u0434\u0443\u043b\u0435\u0439.<\/p>\n<blockquote>\n<p>\u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f Surf \u0432 iOS, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432 \u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435, \u2014\u00a0<a href=\"http:\/\/go.surf.ru\/hr\/ios\/habr\/modularizationXcode7\">\u0432 \u043d\u0430\u0448\u0435\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/a>. \u0421\u043e\u0431\u0440\u0430\u043b\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0443\u0442\u0438\u043b\u0438\u0442\u044b, \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0438 \u043b\u0443\u0447\u0448\u0438\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438. \u041d\u0430\u043c \u043e\u043d\u0438 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443, \u043f\u0438\u0441\u0430\u0442\u044c \u0447\u0438\u0441\u0442\u044b\u0439 \u043a\u043e\u0434. \u041c\u043e\u0433\u0443\u0442 \u043f\u043e\u043c\u043e\u0447\u044c \u0438 \u0432\u0430\u043c \ud83d\ude42<\/p>\n<\/blockquote>\n<figure class=\"full-width\"><\/figure>\n<h2>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043c\u043e\u0434\u0443\u043b\u044c<\/h2>\n<p><strong>\u041c\u043e\u0434\u0443\u043b\u044c<\/strong> \u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u043a\u043e\u043d\u0447\u0435\u043d\u043d\u044b\u0439 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u043a\u043e\u0434\u0430, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0439 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443: \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u043c\u0443 \u0441\u043b\u043e\u044e, \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0444\u0438\u0447\u0438 \u0438\u043b\u0438 \u044e\u0437\u043a\u0435\u0439\u0441\u0430.\u00a0<\/p>\n<p>\u0422\u0443\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u044e \u0441 \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u0432 \u041e\u041e\u041f \u2014 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u043c \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438: \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u043c\u043e\u0434\u0443\u043b\u044c, \u043a\u0430\u043a \u0438 \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u043a\u043b\u0430\u0441\u0441, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043e\u0434\u043d\u0443 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443.<\/p>\n<figure class=\"full-width\"><\/figure>\n<ul>\n<li>\n<p>\u041c\u043e\u0434\u0443\u043b\u044c <em>Models<\/em><strong> <\/strong>\u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0438. <\/p>\n<\/li>\n<li>\n<p><em>Resources<\/em> \u2014 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0438 \u043a\u043b\u044e\u0447\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043d\u0438\u043c.<\/p>\n<\/li>\n<li>\n<p><em>Network<\/em> \u2014 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0441\u043b\u043e\u044f. <\/p>\n<\/li>\n<li>\n<p><em>Library<\/em> \u2014 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 UI-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0438\u043b\u0438 \u044d\u043a\u0440\u0430\u043d\u044b (<em>\u043a \u043d\u0430\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 Library \u043f\u0440\u0438\u0448\u043b\u043e \u0438\u0437 \u0431\u043e\u0435\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043d\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0435\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u043e\u0434\u0443\u043b\u044c UI Kit<\/em>).<\/p>\n<\/li>\n<li>\n<p><em>AuthFlow<\/em><strong> <\/strong>\u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0444\u043b\u043e\u0443 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0441\u043b\u043e\u044f \u0438 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432. \u0417\u0434\u0435\u0441\u044c \u0444\u043b\u043e\u0443 \u2014 \u044d\u0442\u043e \u043b\u044e\u0431\u043e\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439.<\/p>\n<\/li>\n<li>\n<p><em>Application<\/em> \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0432\u0441\u0451 \u0444\u043b\u043e\u0443 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u043e\u0434\u0443\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u0438, \u043d\u043e <strong>\u0441\u0432\u044f\u0437\u044c<\/strong> \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430 <strong>\u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0430\u044f <\/strong>\u2014<strong> <\/strong>\u0442\u0430\u043a<strong> <\/strong>\u0440\u0435\u0448\u0438\u043b \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u043e\u0440 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. <em>Network<\/em> \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c \u0438\u043b\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c \u0438\u0437 \u0441\u043e\u0441\u0435\u0434\u043d\u0435\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f Library. <em>AuthFlow<\/em> \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a <em>MonitorFlow<\/em> \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.\u00a0<\/p>\n<p>\u042d\u0442\u0443 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0438 \u043a \u0434\u0440\u0443\u0433\u0438\u043c \u043c\u043e\u0434\u0435\u043b\u044f\u043c \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u0438:\u00a0 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0432\u044f\u0437\u044c \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043b\u044e\u0434\u0430\u0442\u044c \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0435\u0434\u0438\u043d\u043e\u0439 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0432 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0438 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0443\u043b\u0435\u0439. \u042d\u0442\u043e \u0434\u0430\u0451\u0442 \u0447\u0438\u0441\u0442\u043e\u0442\u0443 \u043a\u043e\u0434\u0430 \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0430.\u00a0<\/p>\n<h3>\u0417\u0430\u0447\u0435\u043c \u0431\u0438\u0442\u044c \u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u0438<\/h3>\n<p><strong>\u0423\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0431\u043e\u0440\u043e\u043a<\/strong>. \u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u0431\u043e\u0440\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b \u043c\u043e\u0434\u0443\u043b\u0435\u0439 (\u0443 \u043d\u0430\u0441 \u044d\u0442\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438) \u0438 \u043f\u0435\u0440\u0435\u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435 \u043c\u043e\u0434\u0443\u043b\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0434\u0435\u043b\u0430\u043d\u044b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u043b\u0441\u044f 40 \u0441\u0435\u043a\u0443\u043d\u0434. \u041f\u043e\u0441\u043b\u0435 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u043d\u0430 20 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u043e\u043d \u0441\u0442\u0430\u043b \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0437\u0430 5 \u0441\u0435\u043a\u0443\u043d\u0434: \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u0432 8 \u0440\u0430\u0437.<\/p>\n<p><strong>\u0412 \u043c\u043d\u043e\u0433\u043e\u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043f\u0440\u043e\u0449\u0435 \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f<\/strong>. \u0425\u043e\u0440\u043e\u0448\u043e \u0440\u0430\u0437\u0431\u0438\u0442\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u043f\u0430\u043f\u043e\u043a \u0438 \u0444\u0430\u0439\u043b\u043e\u0432. \u0421\u0440\u0430\u0437\u0443 \u0432\u0438\u0434\u043d\u043e, \u0438\u0437 \u043a\u0430\u043a\u0438\u0445 \u00ab\u043a\u0438\u0440\u043f\u0438\u0447\u0438\u043a\u043e\u0432\u00bb \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u043a\u0443\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u0432\u043d\u0435\u0441\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f.\u00a0<\/p>\n<p><strong>\u0413\u0438\u0431\u043a\u043e\u0441\u0442\u044c \u0438 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u044c<\/strong>: \u043c\u043e\u0434\u0443\u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u044f\u0442\u044c \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0438\u043b\u0438 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e. \u041d\u0430\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u0435\u0437 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0433\u0440\u0443\u043f\u043f\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u0413\u043b\u0430\u0432\u043d\u043e\u0435, \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0435 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u043b\u0438, \u043f\u043e \u043a\u0430\u043a\u043e\u043c\u0443 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u0438. \u0427\u0442\u043e\u0431\u044b \u0443\u043d\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0438 \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e.<\/p>\n<h3>\u0417\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u043d\u044b \u0443\u0442\u0438\u043b\u0438\u0442\u044b<\/h3>\n<p>\u0427\u0442\u043e\u0431\u044b \u0434\u0435\u043b\u0430\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044f\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u0430 \u0433\u043e\u043b\u043e\u043c Xcode, \u043d\u0443\u0436\u043d\u043e:<\/p>\n<ul>\n<li>\n<p>\u041f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u0438\u0446\u0443 \u043c\u0435\u0436\u0434\u0443 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438, \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430\u043c\u0438 \u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u0442\u0430\u0440\u0433\u0435\u0442\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u0423\u043c\u0435\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0441 \u043d\u0443\u043b\u044f.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043b\u0438\u043d\u043a\u043e\u0432\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0423\u043c\u0435\u0442\u044c \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u043e\u0442\u043b\u0430\u0434\u043a\u0443 \u043c\u043e\u0434\u0443\u043b\u0435\u0439.<\/p>\n<\/li>\n<\/ul>\n<p>\u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0432\u0441\u0451 \u0441\u043b\u043e\u0436\u043d\u043e. \u0418 \u044d\u0442\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043c\u0438\u043d\u0443\u0441 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u0438. \u0427\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u043d\u0438\u0432\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u0430\u043c\u0438 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432. \u041e\u043d\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438. \u0413\u043e\u0440\u0430\u0437\u0434\u043e \u043f\u0440\u043e\u0449\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u043d\u0438\u0445, \u0447\u0435\u043c \u0432 \u0442\u043e\u043c, \u0433\u0434\u0435 \u0436\u0435 \u044d\u0442\u043e \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 Xcode.<\/p>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043c\u043e\u0436\u0435\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b, \u043a\u043e\u0433\u0434\u0430 <em>Network<\/em>, <em>Library<\/em> \u0438 \u043f\u0440\u043e\u0447\u0438\u0435 \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0443\u0442\u0438\u043b\u0438\u0442\u0430\u043c\u0438. <\/p>\n<p>\u041c\u044b \u0432 Surf \u0441\u0442\u0440\u0435\u043c\u0438\u043c\u0441\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0443\u0442\u0438\u043b\u0438\u0442:<\/p>\n<ul>\n<li>\n<p>\u0421\u0435\u0442\u0435\u0432\u043e\u0439 \u0441\u043b\u043e\u0439 \u0438 \u043c\u043e\u0434\u0435\u043b\u044c\u043a\u0438 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c <a href=\"http:\/\/go.surf.ru\/hr\/ios\/habr\/modularizationXcode3\"><em>SurfGen<\/em><\/a>.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0435\u0441\u0443\u0440\u0441\u044b \u0438 \u043a\u043b\u044e\u0447\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043d\u0438\u043c \u2014 <a href=\"http:\/\/go.surf.ru\/hr\/ios\/habr\/modularizationXcode4\"><em>FigmaGen<\/em><\/a> \u0438 <a href=\"http:\/\/go.surf.ru\/hr\/ios\/habr\/modularizationXcode5\"><em>SwiftGen<\/em><\/a>.<\/p>\n<\/li>\n<li>\n<p>\u0427\u0430\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 UI-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0438\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044d\u043a\u0440\u0430\u043d\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u0444\u043b\u043e\u0443-\u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u043e\u0441\u043d\u043e\u0432\u0443 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0438\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 <a href=\"http:\/\/go.surf.ru\/hr\/ios\/habr\/modularizationXcode6\"><em>Generamba<\/em><\/a>.<\/p>\n<\/li>\n<\/ul>\n<figure class=\"full-width\"><\/figure>\n<p>\u041d\u0430 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0435 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430\u043c\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0430 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f: \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043e <em>Flow <\/em>\u043c\u043e\u0434\u0443\u043b\u044f\u0445 \u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 <em>Application<\/em>. <\/p>\n<p>\u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043a \u044d\u0442\u0438\u043c \u043c\u043e\u0434\u0443\u043b\u044f\u043c \u0434\u043e\u0431\u0430\u0432\u044f\u0442\u0441\u044f \u0435\u0449\u0451 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041d\u0430\u0437\u043e\u0432\u0435\u043c \u0438\u0445 \u00ab\u043c\u043e\u0434\u0443\u043b\u044f\u043c\u0438 \u0441\u0432\u044f\u0437\u0438\u00bb: \u0432 \u043d\u0438\u0445 \u043f\u043e\u043f\u0430\u0434\u0443\u0442 \u043e\u0431\u0449\u0438\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b \u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u0432\u044b\u0448\u0435\u0441\u0442\u043e\u044f\u0449\u0438\u0445 \u043c\u043e\u0434\u0443\u043b\u044f\u0445 \u0438 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u044e\u0442 \u0438\u0445 \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>Utils \u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043c\u043e\u0434\u0443\u043b\u0435\u0439 Features \u2014 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0441\u0432\u044f\u0437\u0438.<\/p>\n<p><strong>Utils<\/strong> \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u0432\u044f\u0437\u0438 \u043c\u0435\u0436\u0434\u0443 \u0431\u0438\u0437\u043d\u0435\u0441-\u043c\u043e\u0434\u0443\u043b\u044f\u043c\u0438 \u0438 UI-\u043c\u043e\u0434\u0443\u043b\u044f\u043c\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <em>DateFormatter<\/em> \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 <em>Models<\/em> \u0434\u043b\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u0434\u0430\u0442 \u0438 \u0432 <em>Library \u2014<\/em> \u0434\u043b\u044f \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0435\u0445 \u0436\u0435 \u0434\u0430\u0442 \u0432 \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0439 \u0432\u0438\u0434. <\/p>\n<p><strong>Features<\/strong> (\u0444\u0438\u0447\u0430-\u043c\u043e\u0434\u0443\u043b\u0438) \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043c\u044b \u0432\u044b\u043d\u0435\u0441\u043b\u0438 \u0432 \u043d\u0438\u0445 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u043a\u043e\u043d\u043a\u0438 \u043e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u0439 \u0432 <em>Navigation Bar<\/em>. \u0424\u0438\u0447\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u043b\u0430\u0441\u044c \u0432 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 <em>UIBarButtonItem<\/em> \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u043e\u0439. \u0415\u0451 \u043d\u0435\u043b\u044c\u0437\u044f \u0431\u044b\u043b\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0432 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0441\u043b\u043e\u0439 \u0438 \u0441\u043b\u043e\u0439 c UI-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438. \u042d\u0442\u043e\u0442 \u043c\u043e\u0434\u0443\u043b\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u043d\u0430 \u0434\u0435\u0441\u044f\u0442\u0438 \u044d\u043a\u0440\u0430\u043d\u0430\u0445 \u0438\u0437 \u0440\u0430\u0437\u043d\u044b\u0445 \u0444\u043b\u043e\u0443.\u00a0<\/p>\n<p><strong>\u0412\u044b\u0432\u043e\u0434:<\/strong> <strong>\u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0431\u044b\u0432\u0430\u0435\u0442 \u043c\u043d\u043e\u0433\u043e<\/strong>, \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u043c\u0438 \u0431\u0435\u0437 \u0443\u0442\u0438\u043b\u0438\u0442 \u0441\u043b\u043e\u0436\u043d\u043e. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u043c\u043e\u0434\u0443\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 \u0433\u043e\u043b\u043e\u043c Xcode. \u041e\u0447\u0430\u0433 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432 \u2014 xcworkspace \u0441\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u043f\u043e\u0434\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0438\u043b\u0438 \u043f\u0443\u0445\u043b\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u0442\u0430\u0440\u0433\u0435\u0442\u043e\u0432.\u00a0\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0430\u0440\u0433\u0435\u0442\u0430 \u0432\u0440\u0443\u0447\u043d\u0443\u044e <strong>\u043f\u043e\u0432\u044b\u0448\u0430\u0435\u0442 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438<\/strong>. <\/p>\n<p>\u0411\u0430\u0437\u043e\u0432\u044b\u0439\u00a0\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043c\u043e\u0434\u0443\u043b\u044f:<\/p>\n<ul>\n<li>\n<p>\u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0442\u0438\u043f \u0442\u0430\u0440\u0433\u0435\u0442\u0430,\u00a0<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0444\u043b\u0430\u0433\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438,<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438,<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u043e\u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0437\u0430 \u0442\u0435\u043c, \u0447\u0442\u043e \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b \u043c\u043e\u0434\u0443\u043b\u044f \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0432 \u043d\u043e\u0432\u044b\u0439 \u0442\u0430\u0440\u0433\u0435\u0442, \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.<\/p>\n<\/li>\n<\/ul>\n<p>\u0413\u043e\u0440\u0430\u0437\u0434\u043e \u043f\u0440\u043e\u0449\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u0438\u043b\u0438 \u0442\u0430\u0440\u0433\u0435\u0442\u044b \u043f\u043e\u0434 \u043c\u043e\u0434\u0443\u043b\u0438\u00a0\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0443\u0442\u0438\u043b\u0438\u0442 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0443\u043b\u044f\u043c\u0438. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 XcodeGen \u0438 Tuist.<\/p>\n<h3>XcodeGen<\/h3>\n<p>\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 <a href=\"http:\/\/go.surf.ru\/hr\/ios\/habr\/modularizationXcode1\">XcodeGen<\/a>:<\/p>\n<ul>\n<li>\n<p>\u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u0438\u043b\u0438 \u0442\u0430\u0440\u0433\u0435\u0442\u044b \u0438\u0437 <strong>yml<\/strong> \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432. \u041a\u0430\u043a \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435 \u2014 \u0432\u0441\u0435 xcworkspace \u0438 pbxproj \u0444\u0430\u0439\u043b\u044b \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0435\u0437\u0434\u0430 \u043d\u0430 XcodeGen \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u0441\u043b\u0430\u043d\u044b \u0432 gitignore. \u042d\u0442\u043e \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u0435\u0440\u0435 \u0437\u0430\u0449\u0438\u0449\u0430\u0435\u0442 \u043d\u0430\u0441 \u043e\u0442 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432 \u2014 \u043d\u043e \u0435\u0441\u043b\u0438 \u0432\u0441\u0435 \u0442\u0430\u0440\u0433\u0435\u0442\u044b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043d\u043e\u043c yml, \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u044b \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0431\u0443\u0434\u0443\u0442.\u00a0 <\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043b\u044e\u0431\u043e\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u041f\u043e\u0434\u044b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0438 \u043b\u0438\u043d\u043a\u0443\u044e\u0442\u0441\u044f \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u0447\u0435\u0440\u0435\u0437 Podfile. \u0414\u043b\u044f carthage \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0438 packages \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0440\u0435\u0444\u0435\u0440\u0435\u043d\u0441 \u0432 yml.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u0431\u043e\u043b\u044c\u0448\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u0435\u0439. \u0427\u0442\u043e\u0431\u044b yml \u043d\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043b\u0441\u044f \u0432 \u043f\u043e\u043a\u0440\u044b\u0442\u044b\u0439 \u043c\u0445\u043e\u043c \u043c\u043e\u043d\u043e\u043b\u0438\u0442 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u044b\u0441\u044f\u0447 \u0441\u0442\u0440\u043e\u043a, \u0432 XcodeGen \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0448\u0430\u0431\u043b\u043e\u043d\u044b.<\/p>\n<pre><code class=\"yaml\">ServicesFramework:     platform: iOS     deploymentTarget: 12.0     type: framework     sources:       - TestProject\/Services\/${source_folder}     info:       path: TestProject\/Services\/${source_folder}\/Info.plist     settings:       base:         PRODUCT_BUNDLE_IDENTIFIER: ru.surfstudio.testproject.service.${target_name}       configs:         Debug:           EXCLUDED_ARCHS[sdk=iphonesimulator*]: \"arm64\" <\/code><\/pre>\n<p>\u0428\u0430\u0431\u043b\u043e\u043d\u0443 \u0442\u0430\u0440\u0433\u0435\u0442\u0430 \u0434\u0430\u0451\u0442\u0441\u044f \u0438\u043c\u044f, \u0430 \u0437\u0430\u0442\u0435\u043c \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f <strong>\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0431\u0430\u0437\u044b<\/strong> \u0442\u0430\u0440\u0433\u0435\u0442\u0430. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441 \u0444\u0438\u0433\u0443\u0440\u043d\u044b\u043c\u0438 \u0441\u043a\u043e\u0431\u043a\u0430\u043c\u0438: <em>source_folder<\/em> \u0438 <em>target_name<\/em>. \u042d\u0442\u043e <strong>\u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u0430: <\/strong>\u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.<\/p>\n<p>\u0410\u0442\u0440\u0438\u0431\u0443\u0442 <em>target_name<\/em> \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u043d \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0442\u0430\u0440\u0433\u0435\u0442\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0435\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d (\u0437\u0434\u0435\u0441\u044c \u2014 <em>NetworkServices<\/em>). \u0410\u0442\u0440\u0438\u0431\u0443\u0442 <em>source_folder<\/em>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043f\u043e\u0434\u043f\u0430\u043f\u043a\u0443 \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u043c\u0438 \u0442\u0430\u0440\u0433\u0435\u0442\u0430, \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u0442\u0430\u043a.<\/p>\n<pre><code class=\"yaml\"># \u0428\u0430\u0431\u043b\u043e\u043d\u044b include:   - path: ..\/templates.yml     relativePaths: false # \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 name: NetworkServices targets:     NetworkServices:       templates:         - ServicesFramework       templateAttributes:         source_folder: Network       dependencies:         - target: Models           embed: false         - target: SecurityServices           embed: false<\/code><\/pre>\n<p>\u041a\u0430\u043a\u043e\u0439 \u0438\u043c\u0435\u043d\u043d\u043e \u0448\u0430\u0431\u043b\u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043a\u043b\u044e\u0447\u0435\u0432\u0438\u043a <em>templates<\/em>. \u041e\u0434\u0438\u043d \u0442\u0430\u0440\u0433\u0435\u0442 <strong>\u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432<\/strong>. \u0415\u0441\u043b\u0438 \u0448\u0430\u0431\u043b\u043e\u043d \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c yml \u043a\u043e\u043d\u0444\u0438\u0433\u0435, \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0443\u0442\u044c \u043a \u043d\u0435\u043c\u0443, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <strong>include<\/strong>.<\/p>\n<p>\u041b\u044e\u0431\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0438\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0432 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u0442\u0430\u0440\u0433\u0435\u0442\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0435 \u0434\u043b\u044f \u0442\u0430\u0440\u0433\u0435\u0442\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0441\u0435 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438, \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0447\u0435\u0440\u0435\u0437 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b.<\/p>\n<pre><code class=\"yaml\">App:     type: application     platform: iOS     deploymentTarget: 12.0     dependencies:       - target: Utils       - target: Resources       - target: Models       - target: SecurityServices       - target: NetworkServices       - target: AnalyticsServices       - target: PushServices       - target: NotificationsFeature       - target: Library       - target: AuthFlow       - target: NotificationsFlow       - target: MonitoringFlow       - target: ProfileFlow  attributes:       SystemCapabilities:         com.apple.Push:           enabled: 1     info:       path: TestProject\/Application\/Info\/Info.plist       properties:         CFBundleName: ${bundle_name}         CFBundleDisplayName: ${bundle_display_name}         CFBundleShortVersionString: $(MARKETING_VERSION)         CFBundleVersion: $(CURRENT_PROJECT_VERSION)         CFBundleDevelopmentRegion: ru         UILaunchStoryboardName: Launch Screen         UIUserInterfaceStyle: Light         UIBackgroundModes: [remote-notification]         UISupportedInterfaceOrientations:           - UIInterfaceOrientationPortrait           - UIInterfaceOrientationLandscapeLeft           - UIInterfaceOrientationLandscapeRight         NSAppTransportSecurity:             NSAllowsArbitraryLoads: true             NSExceptionDomains:               testproject.co.ru:                 NSExceptionAllowsInsecureHTTPLoads: true                 NSIncludesSubdomains: true     settings:       base:         PRODUCT_BUNDLE_IDENTIFIER: com.testproject.${bundle_suffix}         ASSETCATALOG_COMPILER_APPICON_NAME: ${icon_name}         TARGETED_DEVICE_FAMILY: 1       configs:         Debug:           EXCLUDED_ARCHS[sdk=iphonesimulator*]: \"arm64\"<\/code><\/pre>\n<p>\u0410 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0435 \u0442\u0430\u0440\u0433\u0435\u0442\u0430 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0438\u0445.<\/p>\n<pre><code class=\"yaml\">TestProject:       templates:         - App       templateAttributes:         bundle_name:<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-390560","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/390560","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=390560"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/390560\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=390560"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=390560"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=390560"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}