{"id":315904,"date":"2021-01-02T21:00:22","date_gmt":"2021-01-02T21:00:22","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=315904"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=315904","title":{"rendered":"lerna + CI =? \u0418\u043b\u0438 \u043a\u0430\u043a \u043d\u0435 \u0437\u0430\u043f\u0443\u0442\u0430\u0442\u044c\u0441\u044f \u0432 \u0442\u0440\u0451\u0445 \u0441\u043e\u0441\u043d\u0430\u0445"},"content":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<h3>\u0412\u043c\u0435\u0441\u0442\u043e \u043f\u0440\u0435\u0434\u0438\u0441\u043b\u043e\u0432\u0438\u044f<\/h3>\n<p>\u0414\u043e\u0431\u0440\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441\u0443\u0442\u043e\u043a! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0421\u0435\u0440\u0433\u0435\u0439, \u0438 \u044f \u0442\u0438\u043c\u043b\u0438\u0434 \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u041c\u0435\u0434\u043f\u043e\u0438\u043d\u044224-\u041b\u0430\u0431. \u042f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u043d\u0430 nodejs \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u043b\u0443\u0442\u043e\u0440\u0430 \u043b\u0435\u0442 &#8212; \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u0431\u044b\u043b C#, \u043d\u0443 \u0430 \u0435\u0449\u0451 \u0434\u043e \u0442\u043e\u0433\u043e, \u0432\u0441\u044f\u043a\u043e\u0435 \u0440\u0430\u0437\u043d\u043e\u0435 \u0438 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u043e. \u041d\u0443 \u0442\u043e \u0435\u0441\u0442\u044c, \u043e\u043f\u044b\u0442\u0430 \u0443 \u043c\u0435\u043d\u044f \u043d\u0435 \u0442\u0430\u043a \u0447\u0442\u043e\u0431\u044b \u0432\u0430\u0433\u043e\u043d, \u0438 \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u043e \u043f\u043e\u043b\u043e\u043c\u0430\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u0443 \u043f\u0440\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0449\u0438\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c. \u0420\u0435\u0448\u0438\u0432 \u0442\u0430\u043a\u0443\u044e, \u0432\u0441\u0435\u0433\u0434\u0430 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043d\u0430\u0445\u043e\u0434\u043a\u0430\u043c\u0438 \u0441 \u0442\u043e\u0432\u0430\u0440\u0438\u0449\u0430\u043c\u0438 \u043f\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0435.<\/p>\n<p>\u0418 \u0432\u043e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043d\u0435\u0439 \u043d\u0430\u0437\u0430\u0434, \u043e\u043d\u0438 \u043f\u043e\u0441\u043e\u0432\u0435\u0442\u043e\u0432\u0430\u043b\u0438 \u043c\u043d\u0435 \u0437\u0430\u0432\u0435\u0441\u0442\u0438 \u0431\u043b\u043e\u0433&#8230; \u0430 \u044f \u043f\u043e\u0434\u0443\u043c\u0430\u043b, \u043c\u043e\u0436\u0435\u0442 \u0442\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 \u0425\u0430\u0431\u0440?<\/p>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0439, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043e \u0441\u043a\u0440\u0438\u043f\u043e\u043c \u0432\u044b\u043b\u0435\u0437\u0430\u0435\u0442 \u0442\u043e\u043b\u043a\u043e\u0432\u044b\u0439, \u043d\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043e\u043f\u044b\u0442\u043d\u044b\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u0431\u0443\u0434\u0443\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u0442\u043e\u043b\u043a\u043e\u0432\u044b\u043c \u0438 \u043d\u0435\u043e\u043f\u044b\u0442\u043d\u044b\u043c )) \u0410 \u043c\u043e\u0436\u0435\u0442 \u0438 \u0435\u0449\u0451 \u043a\u043e\u043c\u0443 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f.<\/p>\n<p>\u0420\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u0431\u0435\u0437 \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0432 \u0442\u0435\u043e\u0440\u0438\u044e, \u043d\u043e \u0441\u043e \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438 \u043d\u0430 \u043e\u043d\u0443\u044e.<\/p>\n<h3>\u041e \u0447\u0451\u043c \u043f\u043e\u0439\u0434\u0451\u0442 \u0440\u0435\u0447\u044c?<\/h3>\n<p>\u041f\u0438\u043b\u043e\u0442 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u0432\u044f\u0449\u0451\u043d \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0435 \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0438\u0441\u044c \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c CI\/CD \u0434\u043b\u044f \u043c\u043e\u043d\u043e\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0441 <strong>lerna<\/strong>. \u0421\u0440\u0430\u0437\u0443 \u0441\u043a\u0430\u0436\u0443, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u043f\u043e\u0441\u0442:<\/p>\n<ul>\n<li>\n<p>\u043d\u0435 \u043f\u0440\u043e <strong>\u043c\u043e\u043d\u043e\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/strong>. \u041f\u043b\u044e\u0441\u044b \u0438 \u043c\u0438\u043d\u0443\u0441\u044b \u043c\u043e\u043d\u043e\u0440\u0435\u043f\u044b, \u043a\u0430\u043a \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438, \u0443\u0436\u0435 \u0434\u0430\u0432\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0432 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435 \u043f\u043e\u0441\u0442\u043e\u0432, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043d\u0430 <a href=\"https:\/\/habr.com\/ru\/post\/435306\/\" rel=\"noopener noreferrer nofollow\">\u0445\u0430\u0431\u0440\u0435<\/a> (\u044d\u0442\u043e\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0445\u043e\u043b\u0438\u0432\u0430\u0440\u043d\u044b\u0439, \u043a\u0441\u0442\u0430\u0442\u0438)<\/p>\n<\/li>\n<li>\n<p>\u043d\u0435 \u043f\u0440\u043e <strong>\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b<\/strong> \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u043d\u043e\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f\u043c\u0438. \u041c\u043e\u043d\u043e\u0440\u0435\u043f\u0443 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <a href=\"https:\/\/nx.dev\/\" rel=\"noopener noreferrer nofollow\">Nx<\/a>, <a href=\"https:\/\/rushjs.io\/\" rel=\"noopener noreferrer nofollow\">rush<\/a>, \u0434\u0430\u0436\u0435 \u043f\u0440\u043e\u0441\u0442\u043e yarn workspaces. \u041d\u043e \u0442\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043c\u044b \u0432\u044b\u0431\u0440\u0430\u043b\u0438 lerna \u0438 \u043f\u043e\u0436\u0438\u0432\u0451\u043c \u0441 \u043d\u0435\u0439 \u043a\u0430\u043a\u043e\u0435 \u0442\u043e \u0432\u0440\u0435\u043c\u044f.<\/p>\n<\/li>\n<li>\n<p>\u043d\u0435 \u043f\u0440\u043e <strong>\u043f\u0430\u043a\u0435\u0442\u043d\u044b\u0435 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u044b<\/strong>. \u041c\u043e\u0433\u0443 \u043f\u043e\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u0438\u0439 <a href=\"https:\/\/www.youtube.com\/watch?v=hq-gIihAs5A\" rel=\"noopener noreferrer nofollow\">\u0432\u0438\u0434\u043e\u0441<\/a> \u0441\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435\u043c npm, yarn \u0438 pnpm \u0438 \u043e\u0444\u0438\u0433\u0435\u043d\u043d\u0443\u044e \u0441\u0435\u0440\u0438\u044e <a href=\"https:\/\/habr.com\/ru\/company\/domclick\/blog\/510812\/\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0441\u0442\u043e\u0432<\/a> \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0430 c npm \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0435\u0442\u0441\u044f \u0441 \u0441\u0430\u043c\u044b\u0445 \u0430\u0437\u043e\u0432 \u0438 \u043e\u0447\u0435\u043d\u044c \u0442\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u0410 \u0443 \u043d\u0430\u0441 npm (\u043f\u043e\u043a\u0430)&#8230;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0435 \u043f\u0440\u043e <strong>nestjs<\/strong>. \u041d\u043e \u043e\u043d \u043a\u043b\u0430\u0441\u0441\u043d\u044b\u0439!<\/p>\n<\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u0431\u043e \u0432\u0441\u0451\u043c \u044d\u0442\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u043e\u043c \u043e\u0431\u044a\u0451\u043c\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0442\u0438\u043a\u0438.<\/p>\n<p>\u0422\u043e\u0433\u0434\u0430 \u043e \u0447\u0451\u043c?<\/p>\n<p><strong>\u0414\u0430\u043d\u043e:<\/strong><\/p>\n<p>\u0418\u043c\u0435\u0435\u0442\u0441\u044f \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u043c\u043e\u043d\u043e\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043b\u0435\u0436\u0438\u0442 \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430 \u043d\u0435\u0441\u0442\u0435 \u0438 npm-\u043f\u0430\u043a\u0435\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u0441\u0451 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u0434\u043b\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u044d\u0442\u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c.<\/p>\n<pre><code>packages +-- @contract |\t\t+-- src |\t\t+-- package.json |   ... | +-- application |   +-- src |   +-- package.json |   ... | +-- package.json +-- lerna.json ...<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0417\u0430\u0447\u0435\u043c \u043f\u0430\u043a\u0435\u0442?<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0439 \u043f\u0430\u043a\u0435\u0442 \u0438\u043b\u0438, \u043a\u0430\u043a \u043c\u044b \u0435\u0433\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c, &#171;\u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442&#187; \u043d\u0443\u0436\u0435\u043d \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u0438\u043f\u043e\u0432 \u0432 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u043c \u043a\u043e\u0434\u0435 \u0438 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438.<\/p>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c, \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u0434\u0435\u043b\u0430\u0435\u0442 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e axios.post(&#8230;.) \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f \u0442\u0443\u0434\u0430 \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u044b\u0435 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b (any), \u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 \u0441 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0432\u0445\u043e\u0434\u043e\u043c \u0438 \u0432\u044b\u0445\u043e\u0434\u043e\u043c.<\/p>\n<pre><code class=\"javascript\">import { Client } from '@contract\/some-service';  const client = new Client(options);  const filters: StronglyTypedObject = ... const data = await client.getSomeData(filters) \/* * \u0418 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0443 \u043d\u0430\u0441 \u0442\u043e\u0436\u0435 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439. * \u0410 \u0435\u0449\u0451 \u0438\u0437 getSomeData() \u0432\u044b\u043b\u0435\u0442\u0430\u044e\u0442 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430, * \u0447\u0435\u043c \u0432 \u043d\u0430\u0441 \u043e\u0431\u044b\u0447\u043d\u043e \u043a\u0438\u0434\u0430\u0435\u0442\u0441\u044f, axios. *\/<\/code><\/pre>\n<p>\u041d\u0430\u0448\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0430, \u0447\u0442\u043e \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043e\u0431\u043b\u0435\u0433\u0447\u0430\u0435\u0442 \u0438 \u0443\u0441\u043a\u043e\u0440\u044f\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0434\u043b\u044f \u0432\u0441\u0435\u0445, \u043a\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043d\u0430\u0448 \u0441\u0435\u0440\u0432\u0438\u0441, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434. \u0422\u0430\u043a \u0447\u0442\u043e \u043d\u0430\u043c \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u0441\u044f.<\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043c\u044b \u043f\u043e\u0448\u043b\u0438 \u0447\u0443\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435 \u0438 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"javascript\">const query = new SomeQuery({ ... }); const data = await client.call(query); \/* * \u0422\u0435\u043f\u0435\u0440\u044c \u043a\u043b\u0438\u0435\u043d\u0442 \u0443 \u043d\u0430\u0441 \u043e\u0431\u0449\u0438\u0439 \u043d\u0430 \u0432\u0441\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b, \u0430 \u0432\u043e\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b - * \u0432\u043e\u043b\u0448\u0435\u0431\u043d\u044b\u0435 \u0438 \u0441\u0430\u043c\u0438 \u0437\u043d\u0430\u044e\u0442, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c. \u042d\u0442\u043e \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441 rabbitMQ. *\/ <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f http-\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u043d\u043e \u0438 \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u0437 RabbitMQ, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0441\u0430\u043c\u043e\u043f\u0438\u0441\u043d\u044b\u0445 \u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 redis. \u041d\u043e \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e \u044d\u0442\u0438\u043c\u0438 \u0434\u0435\u0442\u0430\u043b\u044f\u043c\u0438 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c.<\/p>\n<\/p>\n<p>\u0422\u0430\u043a \u0432\u043e\u0442, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043c\u043e\u043d\u043e\u0440\u0435\u043f\u0430, \u0447\u0442\u043e \u043e\u043d\u0430 \u043d\u0430\u043c \u0434\u0430\u0451\u0442? \u0412 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u0411\u0430\u0437\u043e\u0432\u0430\u044f \u0444\u0438\u0447\u0430 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 &#8212; \u044d\u0442\u043e \u0442\u043e, \u0447\u0442\u043e \u0432 lerna \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <strong>bootstrap<\/strong>.<\/p>\n<pre><code class=\"bash\">lerna bootstrap --hoist<\/code><\/pre>\n<p>\u0424\u043b\u0430\u0433 <code>--hoist<\/code><strong> <\/strong>&#8212; \u0441\u0430\u043c\u0430\u044f \u043f\u0440\u0438\u044f\u0442\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c. \u041e\u043d \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043b\u0435\u0440\u043d\u0435, \u0447\u0442\u043e \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0435\u0441\u043b\u0438 \u043c\u043e\u0436\u043d\u043e, \u043d\u0430\u0434\u043e \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 node_modules \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041c\u044b \u043d\u0430 \u044d\u0442\u043e\u043c \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043c \u043c\u0435\u0441\u0442\u043e + \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0435\u0449\u0451 \u0431\u043e\u043d\u0443\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043c \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 <code>lerna bootstrap<\/code> \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0441\u0438\u043c\u043b\u0438\u043d\u043a\u0438 \u043d\u0430 \u043f\u0430\u043a\u0435\u0442\u044b \u0438\u043c\u0435\u044e\u0449\u0438\u0435\u0441\u044f \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438. \u0422\u043e \u0435\u0441\u0442\u044c, \u0445\u043e\u0442\u044f \u0432 application\/package.json \u0443\u043a\u0430\u0437\u0430\u043d\u043e<\/p>\n<pre><code class=\"json\">\"dependencies\": { \t\"@contract\/core\": \"^1.0.0\" }<\/code><\/pre>\n<p>\u0432 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u044d\u0442\u043e\u0442 \u043f\u0430\u043a\u0435\u0442 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u0438\u0437 npm-\u0440\u0435\u0435\u0441\u0442\u0440\u0430, \u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0438\u043b\u0438\u043d\u043a\u0443\u0435\u0442\u0441\u044f \u0432 node_modules \u0438\u0437 \u043f\u0430\u043f\u043a\u0438 packages. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u044b \u0435\u0433\u043e \u043c\u0435\u043d\u044f\u0435\u043c, \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0438 \u0441\u0440\u0430\u0437\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438.<\/p>\n<h3>\u0417\u0430\u0434\u0430\u0447\u0430<\/h3>\n<p>\u041c\u044b \u0441\u0442\u0440\u043e\u0438\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 CI\/CD. \u0418 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u043a\u0440\u0430\u0441\u0438\u0432\u043e \u0432\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430\u0448 \u043c\u043e\u043d\u043e\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0432 \u043a\u043e\u043d\u0432\u0435\u0435\u0440. \u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0437\u0430\u0434\u0430\u0447\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u043b\u0430 \u0443\u0436\u0435 1000 \u0440\u0430\u0437 \u0431\u044b\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0430 &#8212; \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043d\u0430 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u0430.<\/p>\n<p>\u0418 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0435\u0441\u0442\u044c \u043a\u0443\u0447\u0430 issues \u043d\u0430 github, \u043f\u043e\u0441\u0442\u044b \u043d\u0430 Stackoverflow \u0438 \u0434\u0440. \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u0445. \u041d\u043e \u043d\u0435\u0442 \u0440\u0435\u0446\u0435\u043f\u0442\u043e\u0432.. \u043a\u043e\u0441\u0442\u044b\u043b\u0438 \u0435\u0441\u0442\u044c, \u0438 \u0442\u043e \u043d\u0435 \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0447\u0438\u0435, \u0430 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e &#171;\u0448\u0442\u0430\u0442\u043d\u043e\u0433\u043e&#187; \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044f \u043d\u0435 \u043d\u0430\u0448\u0451\u043b (\u0438\u0441\u043a\u0430\u043b, \u0447\u0435\u0441\u0441\u043b\u043e\u0432\u043e).<\/p>\n<p>\u0422\u0430\u043a \u0432\u043e\u0442, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0448 \u0441\u0435\u0440\u0432\u0438\u0441 \u0433\u043e\u0442\u043e\u0432 \u043a \u0440\u0435\u043b\u0438\u0437\u0443:<\/p>\n<ol>\n<li>\n<p>\u041c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u043c\u0435\u0440\u0436\u0438\u0442\u044c PR \u0438, \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d.<\/p>\n<\/li>\n<li>\n<p>\u041c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442, \u043f\u0440\u043e\u0433\u043d\u0430\u0442\u044c \u043b\u0438\u043d\u0442\u0435\u0440, unit-\u0442\u0435\u0441\u0442\u044b.<\/p>\n<\/li>\n<li>\n<p>\u041c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u0434\u043d\u044f\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u044e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u043f\u0430\u043a\u0435\u0442\u0430 (\u0430 \u0432 \u0447\u0451\u043c \u043d\u0435 \u0431\u044b\u043b\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 &#8212; \u0442\u0430\u043c \u043d\u0435 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0442\u044c).<\/p>\n<\/li>\n<li>\n<p>\u041c\u044b \u0445\u043e\u0442\u0438\u043c \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442 @contract \u0432 npm registry (\u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u043e\u043c).<\/p>\n<\/li>\n<li>\n<p>\u041c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0438\u0437 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0442\u043e\u043c \u043e\u0442\u0434\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430\u043c, \u043d\u0443 \u0430 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0440\u0430\u0431\u043e\u0447\u0443\u044e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u043a\u0443 \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c. (\u0434\u0430, \u0434\u0430, \u044f \u0437\u043d\u0430\u044e &#8212; <strong>docker<\/strong>, \u043d\u043e \u043d\u0435 \u0432\u0441\u0435 \u0441\u0440\u0430\u0437\u0443. \u0412 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0442\u0430\u043c \u0431\u0443\u0434\u0443\u0442 \u0442\u0435 \u0436\u0435 \u0441\u0430\u043c\u044b\u0435)<\/p>\n<\/li>\n<li>\n<p>\u041d\u0443 \u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0448 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 \u0431\u044b\u043b \u0440\u0430\u0437\u0443\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e, \u0447\u0442\u043e \u0435\u043c\u0443 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b. node_modules \u043f\u043e \u0413\u0411 &#8212; \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0442\u043e, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e.<\/p>\n<\/li>\n<\/ol>\n<h3>\u041f\u043e\u0435\u0445\u0430\u043b\u0438!<\/h3>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u0443\u043d\u043a\u0442 \u0431\u0435\u0440\u0443\u0442 \u043d\u0430 \u0441\u0435\u0431\u044f CI\/CD \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<p>\u0421\u043e \u0432\u0442\u043e\u0440\u044b\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0431\u044b\u0442\u044c \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e:<\/p>\n<p>\u0414\u043b\u044f \u0442\u0440\u0435\u0442\u044c\u0435\u0433\u043e lerna \u043d\u0430\u043c \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0434\u0432\u0435 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b: <strong>lerna version<\/strong> \u0438<strong> lerna publish<\/strong> (\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u043f\u0435\u0440\u0432\u0443\u044e \u0438 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0451). \u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"bash\">lerna publish --conventional-commits --yes # \u041d\u0430 \u0437\u0430\u043c\u0435\u0442\u043a\u0443: \u043a\u043e\u043c\u0430\u043d\u0434\u0430 publish \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0432\u0441\u0435 \u0444\u043b\u0430\u0433\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b version. # \u0412 \u0434\u043e\u043a\u0435 \u044d\u0442\u043e \u0435\u0441\u0442\u044c, \u043d\u043e \u044f \u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0440\u0430\u0437\u0430 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u043b.<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0427\u0443\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e conventional commits.<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0415\u0441\u043b\u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>lerna publish<\/code> \u0431\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0445 \u043a\u043b\u044e\u0447\u0435\u0439, \u0442\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u043c,\u0447\u0442\u043e \u0434\u043b\u044f CI<em>-\u043a<\/em>\u043e\u043d\u0432\u0435\u0439\u0440\u0430 \u043d\u0435 \u0433\u043e\u0434\u0438\u0442\u0441\u044f. \u041d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f <a href=\"https:\/\/www.conventionalcommits.org\/en\/v1.0.0\/\" rel=\"noopener noreferrer nofollow\">Conventional Commits<\/a>. \u0421\u043e\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0433\u043e \u0441\u043e\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u044f \u043f\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 commit-\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 lerna \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u043a\u0430\u043a\u0443\u044e \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043f\u043e semver \u043f\u043e\u0434\u043d\u044f\u0442\u044c (\u043c\u0438\u043d\u043e\u0440, \u043c\u0430\u0436\u043e\u0440 \u0438\u043b\u0438 \u043f\u0430\u0442\u0447). \u0421\u0430\u043c\u043e\u0435 \u043c\u0438\u043b\u043e\u0435, \u0447\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c <strong>\u0432\u044b\u043d\u0443\u0434\u0438\u0442\u044c<\/strong> \u043d\u0430\u0448\u0438\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043c\u043c\u0438\u0442\u044b (\u0447\u0442\u043e \u0441\u0430\u043c\u043e \u043f\u043e \u0441\u0435\u0431\u0435 \u0445\u043e\u0440\u043e\u0448\u043e)! \u0412\u043e\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0430\u044f <a href=\"https:\/\/dev.to\/omarzi\/how-to-validate-commit-message-convention-using-commitlint-and-husky-aaa\" rel=\"noopener noreferrer nofollow\">\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f<\/a>.<\/p>\n<\/div>\n<\/details>\n<p>\u0421 \u043f\u0443\u043d\u043a\u0442\u043e\u043c 4 \u0443 \u043d\u0430\u0441 \u0442\u043e\u0436\u0435 \u043d\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c.<code>lerna publish<\/code> \u043d\u0430\u043c \u044d\u0442\u043e \u0443\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u043b\u0430, \u0430 \u0435\u0441\u043b\u0438 \u043d\u0430\u0441 \u044d\u0442\u043e \u043f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e \u043d\u0435 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 (\u043d\u0443, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u043c\u044b \u043d\u0435 \u0445\u043e\u0442\u0438\u043c \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u0435\u0433\u0438 \u0438\u043b\u0438 \u0435\u0449\u0451 \u0447\u0442\u043e), \u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <code>lerna version<\/code> \u0432 \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0438 \u0441 <code>npm publish<\/code> \u0438\u0437 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043f\u0430\u043a\u0435\u0442\u0430. \u0417\u0430\u0431\u0430\u0432\u043d\u043e, \u0447\u0442\u043e npm publish \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u043a\u043b\u044e\u0447\u0430<code> --registry<\/code>, \u0447\u0442\u043e\u0431\u044b \u0443\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0443\u0434\u0430 \u043f\u0443\u0448\u0438\u0442\u044c \u043f\u0430\u043a\u0435\u0442. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 <code>lerna publish<\/code>, \u043d\u0430\u0441 \u0432\u044b\u0440\u0443\u0447\u0438\u0442 <strong>lerna.json<\/strong> (\u0441\u0442\u0440. 7):<\/p>\n<pre><code class=\"json\">{   \"version\": \"1.2.2\",   \"npmClient\": \"npm\",   \"command\": {     \"publish\": {       \"message\": \"chore(release): publish\",       \"registry\": ....     }   },   \"packages\": [     \"packages\/@contract\",     \"packages\/application\"   ] } <\/code><\/pre>\n<p>\u0418\u043d\u0430\u0447\u0435 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0444\u0430\u0439\u043b<strong> .npmrc<\/strong> (\u0444\u0430\u0439\u043b \u0441 <a href=\"https:\/\/docs.npmjs.com\/cli\/v6\/configuring-npm\/npmrc\" rel=\"noopener noreferrer nofollow\">\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 npm<\/a>) \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043f\u0430\u043a\u0435\u0442\u0430.<\/p>\n<h3>\u041f\u0435\u0440\u0432\u044b\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438<\/h3>\n<p>\u0418\u0442\u0430\u043a, \u043d\u0430\u0448\u0430 CI-\u043c\u0430\u0448\u0438\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 (\u0431\u0435\u0437 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 CI\/CD):<\/p>\n<pre><code class=\"bash\"># Pull \u0438 checkout lerna bootsrap --hoist  lerna run build # \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 npm run build \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0430\u043a\u0435\u0442\u0435. lerna publish --conventional-commits --yes cp packages\/application\/build \/tmp\/place\/for\/artifact ...<\/code><\/pre>\n<p>\u041d\u043e \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0448\u0435\u043c\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u043d\u0443\u0436\u043d\u044b \u0435\u0449\u0451 <strong>node_modules<\/strong>.<\/p>\n<\/p>\n<p><em><u>\u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u21161.<\/u><\/em> \u041c\u043e\u0436\u043d\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0432\u0437\u044f\u0442\u044c \u0434\u0430 \u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u043f\u043a\u0443 node_modules \u0438\u0437 \u043a\u043e\u0440\u043d\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432 \u043d\u0430\u0448 \/tmp\/place\/for\/artifact. \u041d\u043e \u0442\u043e\u0433\u0434\u0430:<\/p>\n<ul>\n<li>\n<p>\u041c\u044b \u0442\u043e\u0447\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043b\u0438\u0448\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 (\u0432\u0441\u044f\u043a\u0438\u0435 jest, typescript \u0438 \u043a\u0443\u0447\u0443 \u0435\u0449\u0451 \u0432\u0441\u0435\u0433\u043e \u043d\u0435\u043d\u0443\u0436\u043d\u043e\u0433\u043e \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435). \u0410 \u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u043d\u0435 2 \u043f\u0430\u043a\u0435\u0442\u0430, \u0430 22, \u0442\u043e \u0440\u0430\u0437\u043c\u0435\u0440 node_modules \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u043f\u0440\u0438\u043b\u0438\u0447\u043d\u044b\u043c.<\/p>\n<\/li>\n<li>\n<p>\u041c\u044b, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043d\u0435\u0434\u043e\u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043d\u0443\u0436\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0442. \u043a. lerna \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u0430\u043a\u0435\u0442\u044b \u0432 \u043a\u043e\u0440\u0435\u043d\u044c \u0442\u043e\u043b\u044c\u043a\u043e <strong>\u0435\u0441\u043b\u0438 \u043c\u043e\u0436\u0435\u0442<\/strong>. \u0422\u0430\u043a \u0431\u044b\u0432\u0430\u0435\u0442 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 &#8212; \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0433\u0434\u0435-\u0442\u043e \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440.<\/p>\n<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u21162. \u041d\u0435 \u0432\u043e\u043f\u0440\u043e\u0441. \u0423 \u043d\u0430\u0441 \u0436\u0435 \u0435\u0441\u0442\u044c package.json \u0432\u043d\u0443\u0442\u0440\u0438 packages\/application. \u0422\u0430\u043c \u0432\u0435\u0434\u044c \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e \u0432\u0441\u0451, \u0447\u0442\u043e \u043d\u0430\u0434\u043e! \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c package.json \u0432 \u043f\u0430\u043f\u043a\u0443 \u0441 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u043c, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c <code>npm i<\/code> &#8212; \u043f\u0440\u043e\u0444\u0438\u0442! \u041d\u043e:<\/p>\n<p>\u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c\u043e\u0441\u0442\u0438 \u0431\u0438\u043b\u0434\u0430, \u0432 CI \u0441\u0440\u0435\u0434\u0435 \u0432\u043c\u0435\u0441\u0442\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u044b npm install \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>npm ci<\/code>. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 npm install \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0430\u043a\u0435\u0442\u044b \u0441\u0442\u0430\u0432\u044f\u0442\u0441\u044f \u043d\u0435 \u0438\u0437 package.json, \u0430 \u0438\u0437 package-lock.json \u0438\u043b\u0438 shrinkwrap.json (\u0441\u043c\u044b\u0441\u043b \u0442\u043e\u0442 \u0436\u0435). \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e lock-\u0444\u0430\u0439\u043b\u0430\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 \u0445\u043e\u0440\u043e\u0448\u0435\u043c <a href=\"https:\/\/medium.com\/devschacht\/understanding-lock-files-in-npm-5-4bf615c6cd50\" rel=\"noopener noreferrer nofollow\">\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0435 \u043e\u0442 \u0410\u043d\u0434\u0440\u0435\u044f \u041c\u0435\u043b\u0438\u0445\u043e\u0432\u0430<\/a>.<\/p>\n<p>\u0414\u043b\u044f \u043c\u043e\u0435\u0433\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430 \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<ul>\n<li>\n<p>\u041e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0431\u0435\u0437 lock-\u0444\u0430\u0439\u043b\u0430 \u043d\u0438\u043a\u0430\u043a \u043d\u0435\u043b\u044c\u0437\u044f. \u0414\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0432 dependencies \u0442\u043e\u0447\u043d\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0431\u0435\u0437 \u0432\u0441\u044f\u043a\u0438\u0445 &#171;~&#187; \u0438 &#171;^&#187; &#8212; \u044d\u0442\u043e \u043d\u0435 \u043f\u043e\u043c\u043e\u0436\u0435\u0442, \u0442. \u043a. \u0442\u0440\u0430\u043d\u0437\u0438\u0442\u0438\u0432\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 (\u0442\u043e \u0435\u0441\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u0430\u0448\u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439) \u0432\u044b \u043d\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u0442\u0435.<\/p>\n<\/li>\n<li>\n<p>lock-\u0444\u0430\u0439\u043b \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c <strong>\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d<\/strong> \u0441 package.json. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0432 package.json \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043d\u043e\u0432\u0430\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c (\u0438\u043b\u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442), \u0430 \u0432 package-lock.json \u0435\u0451 \u043d\u0435\u0442, \u0442\u043e npm ci \u0431\u0443\u0434\u0435\u0442 \u0440\u0443\u0433\u0430\u0442\u044c\u0441\u044f:<\/p>\n<\/li>\n<\/ul>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4ed\/839\/608\/4ed83960827a326d708bcd132110bc75.png\" width=\"834\" height=\"49\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0440\u0438\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0442\u0435\u043a\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u0440\u044f\u043c\u043e\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c &#8212; npm install.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c, \u0441 \u0447\u0435\u0433\u043e \u043c\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u0438 \u043d\u0430\u0448\u0443 \u0441\u0431\u043e\u0440\u043a\u0443: <code>lerna bootstrap --hoist<\/code> \u042d\u0442\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0443\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u043b\u0430 \u043d\u0430\u043c package-lock.json \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041e\u0434\u043d\u0430\u043a\u043e, \u044d\u0442\u043e \u043d\u0430\u043c \u043c\u0430\u043b\u043e \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442.<\/p>\n<p>\u041c\u043e\u0436\u0435\u0442\u0435 \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u044d\u0442\u043e\u043c \u0441\u0430\u043c\u0438, \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0432 \u0432 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 package.json \u0438\u0437 packages\/application \u0438 lock-\u0444\u0430\u0439\u043b \u0438\u0437 \u043a\u043e\u0440\u043d\u044f &#8212; \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u043e\u0448\u0438\u0431\u043a\u0443. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0432\u0435\u0434\u044c \u0442\u0430\u043c \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u043d\u0430\u043c\u0451\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430 <strong>\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e<\/strong>! \u0410 \u0432 application lock-\u0444\u0430\u0439\u043b\u0430 \u0443 \u043d\u0430\u0441 \u043d\u0435\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443:<\/p>\n<p><em><u>\u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u21163.<\/u><\/em> \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0431\u0435\u0437 &#171;\u0432\u0441\u043f\u043b\u044b\u0442\u0438\u044f&#187;. \u0414\u0430, \u043d\u0435 \u0441\u0443\u043f\u0435\u0440 \u0443\u0434\u043e\u0431\u043d\u043e, \u0437\u0430\u0442\u043e lock-\u0444\u0430\u0439\u043b \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043c \u0433\u0434\u0435 \u043d\u0430\u0434\u043e. \u0414\u0435\u043b\u0430\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<pre><code class=\"bash\">lerna bootstrap<\/code><\/pre>\n<p>\u042d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0430\u0441\u0442 \u043d\u0430\u043c \u043f\u043e lock-\u0444\u0430\u0439\u043b\u0443 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442. \u041d\u043e \u0438 \u0442\u0443\u0442 \u0432\u0441\u0451 \u043d\u0435 \u0441\u043b\u0430\u0432\u0430 \u0411\u043e\u0433\u0443! \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0441 \u044d\u0442\u0438\u043c \u0444\u0430\u0439\u043b\u043e\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c <code>npm ci<\/code>, \u043d\u0430\u043c \u043e\u043f\u044f\u0442\u044c \u0441\u043a\u0430\u0436\u0443\u0442 \u043d\u0435\u0445\u043e\u0440\u043e\u0448\u0438\u0435 \u0441\u043b\u043e\u0432\u0430 \u043f\u0440\u043e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e. \u041a\u0430\u043a \u0442\u0430\u043a?<\/p>\n<p>\u0418\u0437\u0443\u0447\u0430\u0435\u043c \u0444\u0430\u0439\u043b package-lock.json \u0438 \u0432\u0438\u0434\u0438\u043c.. \u0447\u0442\u043e \u0442\u0430\u043c \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u043f\u0430\u043a\u0435\u0442\u0430 <a class=\"mention\" href=\"\/users\/contract\/core!\">@contract\/core!<\/a>\u041d\u0443 \u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u043c\u044b \u0435\u0433\u043e \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u043b\u0438, \u0430 \u0434\u0435\u043b\u0430\u043b\u0438 \u0441\u0438\u043c\u043b\u0438\u043d\u043a&#8230;<\/p>\n<p><em><u>\u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u21164.<\/u><\/em> \u041e\u043a, \u0434\u0435\u043b\u0430\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e npm install \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430. \u0422\u0443\u0442 \u043d\u0430\u043c \u043f\u043e\u043c\u043e\u0436\u0435\u0442:<\/p>\n<pre><code class=\"bash\">lerna exec -- npm i<\/code><\/pre>\n<p>\u0423\u0440\u0430, \u0442\u0435\u043f\u0435\u0440\u044c lock-\u0444\u0430\u0439\u043b \u0438 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u044b! <code>npm ci<\/code> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442! \u041f\u043e\u0431\u0435\u0434\u0430!<\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0436\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0435&#8230;<\/p>\n<h3>\u041e\u043d\u043e \u043f\u0430\u0434\u0430\u0435\u0442<\/h3>\n<p>\u0413\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e \u0441 \u043c\u043e\u0434\u0443\u043b\u0435\u043c <a class=\"mention\" href=\"\/users\/contract\">@contract<\/a>\u0447\u0442\u043e-\u0442\u043e \u043d\u0435 \u0442\u043e. \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u043d\u0435 \u0442\u043e! \u0412\u0435\u0434\u044c <code>npm i<\/code> \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b \u044d\u0442\u043e\u0442 \u043c\u043e\u0434\u0443\u043b\u044c \u0438\u0437 npm registry. \u041d\u0443 \u0442\u043e\u0433\u0434\u0430 \u043f\u043e\u043d\u044f\u0442\u043d\u043e &#8212; \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0442\u0430 \u0436\u0435 \u0432\u0435\u0440\u0441\u0438\u044f. \u0410 \u043f\u043e \u0444\u0430\u043a\u0442\u0443, \u043c\u044b \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u043c\u043e\u0433\u043b\u0438 \u0432\u043d\u0435\u0441\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u043b\u043e\u043c\u0430\u044e\u0449\u0438\u0435, \u043d\u043e \u0432\u0435\u0440\u0441\u0438\u044e \u0435\u0449\u0451 \u043d\u0435 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u043b\u0438 \u0438 \u043f\u0430\u043a\u0435\u0442 \u043d\u0435 \u043f\u0443\u0448\u0438\u043b\u0438 (\u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044e, \u0447\u0442\u043e build \u0443 \u043d\u0430\u0441 \u0434\u043e publish). \u0415\u0441\u043b\u0438 \u0436\u0435 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u043f\u0430\u043a\u0435\u0442\u0435 \u043d\u0435 \u0431\u044b\u043b\u043e, \u0442\u043e \u0432\u0441\u0451 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.. \u0438 \u044d\u0442\u043e \u0441\u043a\u043e\u0440\u0435\u0435 \u043f\u043b\u043e\u0445\u043e, \u0447\u0435\u043c \u0445\u043e\u0440\u043e\u0448\u043e. \u041b\u0443\u0447\u0448\u0435 \u043f\u0443\u0441\u0442\u044c \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0447\u0435\u043c \u0442\u043e \u0442\u0430\u043a, \u0442\u043e \u0441\u044f\u043a.<\/p>\n<p>\u0414\u0443\u043c\u0430\u043b\u0438 \u0433\u0430\u0434\u0430\u043b\u0438 \u043d\u0430\u0441\u0447\u0451\u0442 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0431\u044b \u0434\u0435\u043b\u0430\u0442\u044c <code>publish<\/code> \u0441\u043d\u0430\u0447\u0430\u043b\u0430. \u041d\u043e \u044d\u0442\u043e \u043d\u0435 \u043b\u043e\u0433\u0438\u0447\u043d\u043e &#8212; \u043a\u043e\u0434 \u043d\u0430\u0434\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c, \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043f\u043e\u0442\u043e\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u0431\u043b\u0438\u0448\u0438\u0442\u044c &#8212; \u0430 \u043e\u043d, \u0437\u0430\u0440\u0430\u0437\u0430, \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p><em><u>\u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u21164.<\/u><\/em> \u041d\u0443 \u043e\u043a, \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0441\u0438\u043c\u043b\u0438\u043d\u043a, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0435\u0433\u043e \u0441\u0434\u0435\u043b\u0430\u0435\u043c&#8230;<\/p>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c: <\/p>\n<pre><code class=\"bash\">lerna exec -- npm i      # \u0421\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f lock-\u0444\u0430\u0439\u043b\u044b \u0432 \u043f\u0430\u043a\u0435\u0442\u0430\u0445. lerna link               # \u0421\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0441\u0438\u043c\u043b\u0438\u043d\u043a\u0438. lerna run build lerna publish --conventional-commits ... cp packages\/application\/build \/path\/to\/artifact # \u041c\u043e\u0436\u043d\u043e \u0435\u0449\u0451 \u0432\u043c\u0435\u0441\u0442\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c production \u0441\u0431\u043e\u0440\u043a\u0443 # - \u0431\u0435\u0437 sourceMaps \u0438 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u0439. cp packages\/application\/package*.json \/path\/to\/artifact (cd \/path\/to\/artifact &amp;&amp; npm ci --production)<\/code><\/pre>\n<p>\u0418 \u043e\u043d\u043e \u0434\u0430\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442! \u0422\u043e\u043b\u044c\u043a\u043e \u043c\u044b \u043a\u043e\u0435-\u0447\u0442\u043e \u0437\u0430\u0431\u044b\u043b\u0438.. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0432\u044b\u0437\u043e\u0432 <strong>jest<\/strong> \u0433\u0434\u0435-\u043d\u0438\u0431\u0443\u0434\u044c \u043c\u0435\u0436\u0434\u0443 3-\u0439 \u0438 4-\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439&#8230;<\/p>\n<h3>\u0418 \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u043f\u0430\u0434\u0430\u044e\u0442 \u0443\u0436\u0435 \u0442\u0435\u0441\u0442\u044b<\/h3>\n<p>\u041c\u043e\u0433\u0443\u0442 \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0438 \u043d\u0435 \u0443\u043f\u0430\u0441\u0442\u044c&#8230; \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e, \u0435\u0441\u043b\u0438 \u0438\u0445 \u043d\u0435\u0442. \u041d\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e. \u0410 \u0442\u043e\u0447\u043d\u0435\u0435, \u043d\u0435 \u0442\u0430\u043a, \u043a\u0430\u043a \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430, \u0433\u0434\u0435 \u043e\u043d \u0434\u0435\u043b\u0430\u0435\u0442 <code>lerna bootstrap --hoist<\/code> \u0430 \u043f\u043e\u0442\u043e\u043c \u0431\u0438\u043b\u0434.<\/p>\n<p>\u0414\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0432\u0441\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0431\u044b\u043b\u0438 \u0432 \u043e\u0431\u0449\u0435\u043c-\u0442\u043e \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b. \u0412\u0440\u0435\u043c\u0435\u043d\u0438 \u043c\u043d\u043e\u0433\u043e \u0443\u0448\u043b\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0437\u043d\u0430\u043d\u0438\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u0421\u0435\u0439\u0447\u0430\u0441 &#8212; \u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0447\u0430\u0441\u043e\u0432 \u043f\u0440\u043e\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0445 \u0432 \u0433\u0443\u0433\u043b\u0435 (\u0445\u0430\u0431\u0440\u0435, \u043c\u0435\u0434\u0438\u0443\u043c\u0435, \u0433\u0438\u0442\u0445\u0430\u0431\u0435&#8230;) &#8212; \u0443\u0436\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0432\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e. \u0410 \u0432\u043e\u0442 \u043d\u043e\u0432\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043f\u0440\u044f\u043c\u043e \u043c\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f. \u0418 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432\u044b \u0441 \u043d\u0435\u0439 \u043d\u0435 \u0441\u0442\u043e\u043b\u043a\u043d\u0451\u0442\u0435\u0441\u044c. \u041d\u043e \u0432 \u0447\u0451\u043c \u0442\u0443\u0442 \u0441\u0443\u0442\u044c, \u0418\u041c\u0425\u041e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u043e.<\/p>\n<p>\u0418\u0442\u0430\u043a, <code>lerna bootstrap --hoist<\/code> \u0438 <code>lerna exec -- npm i &amp;&amp; lerna link<\/code> &#8212; \u0432 \u0447\u0451\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u043d\u0438\u0446\u0430? \u0412\u0435\u0434\u044c \u0432\u0442\u043e\u0440\u043e\u0435 &#8212; \u044d\u0442\u043e \u043f\u043e \u0441\u0443\u0442\u0438 <code>lerna bootstrap<\/code>, \u043d\u043e \u0431\u0435\u0437 <code>--hoist<\/code>. \u041f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0443\u0431\u0440\u0430\u0442\u044c \u0444\u043b\u0430\u0433 hoist&#8230; \u0442\u0435\u0441\u0442\u044b \u043f\u0430\u0434\u0430\u044e\u0442. \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c &#8212; \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442.<\/p>\n<p>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u043a\u043e\u0433\u0434\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u0438\u0441\u0442\u0443\u043f \u043e\u0442\u0443\u043f\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442, \u043c\u043e\u0436\u043d\u043e \u043e\u0441\u043e\u0437\u043d\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<pre><code>packages +-- @contract |   +-- node_modules |       +-- class-transformer |\t\t+-- src |\t\t+-- package.json |   ... | +-- application |   +-- node_modules |       +-- class-transformer |       +-- @contract -&gt; \u0441\u0438\u043c\u0432\u043e\u043b\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0441\u044b\u043b\u043a\u0430 |   +-- src |   +-- package.json |   ... | +-- package.json +-- lerna.json ...<\/code><\/pre>\n<p>\u041d\u0430 \u0441\u0445\u0435\u043c\u0435 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430. \u0418 application \u0438 contract \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 \u043f\u0430\u043a\u0435\u0442\u0430 class-transformer. \u0412\u043e\u043e\u0431\u0449\u0435-\u0442\u043e, \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043e\u0431\u0449\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u043d\u043e, \u043a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u043d\u0435 \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043b\u043e\u043c\u0430\u044e\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 node_modules \u043e\u043d\u0438 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0432 \u0434\u0432\u043e\u0439\u043d\u043e\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0435.<\/p>\n<p><a href=\"https:\/\/github.com\/typestack\/class-transformer\" rel=\"noopener noreferrer nofollow\">class-transformer<\/a> &#8212; \u0438\u0437 \u0442\u0435\u0445, \u0447\u0442\u043e \u043b\u043e\u043c\u0430\u0435\u0442\u0441\u044f.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u0442\u043e\u043c, \u043f\u043e\u0447\u0435\u043c\u0443<\/summary>\n<div class=\"spoiler__content\">\n<p>class-transformer &#8212; \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043d\u0430 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u0430\u0445. \u0412 nestjs \u043e\u043d\u0430 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u0432 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 (ValidationPipe). \u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0435\u0451 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0442\u0430\u043a\u043e\u0439:<\/p>\n<pre><code class=\"javascript\">import { Type } from 'class-transformer'; import { IsInt, IsPositive } from 'class-validator';  export class Query {   @IsInt()   @IsPositive()   @Type(() =&gt; Number)   id: number; } <\/code><\/pre>\n<p>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043c\u044b \u044d\u0442\u043e \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u043c \u0432 GET \u0437\u0430\u043f\u0440\u043e\u0441\u0435 (?id=100500) \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e nest \u043d\u0430 \u0432\u0445\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u0441\u0442\u0440\u043e\u0447\u043a\u0443, \u0430 \u043d\u0435 \u0447\u0438\u0441\u043b\u043e. \u0418 \u0432\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440 <strong>IsInt() <\/strong>\u043d\u0430 \u044d\u0442\u043e \u0440\u0443\u0433\u043d\u0451\u0442\u0441\u044f (\u043c\u043e\u0436\u0435\u0442 \u0438 \u043d\u0435\u0442, \u043d\u043e <strong>IsPositive()<\/strong> \u0440\u0443\u0433\u043d\u0451\u0442\u0441\u044f 100%).<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043d\u0435\u0441\u0442\u0443: \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0439 \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0432 \u0447\u0438\u0441\u043b\u043e. \u0414\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440 @Type() &#8212; \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431. \u0415\u0441\u043b\u0438 \u044f \u043d\u0435 \u043e\u0448\u0438\u0431\u0430\u044e\u0441\u044c, \u0442\u043e \u043e\u043d \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e <code>return Number(id)<\/code> \u0414\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440 @Transform() \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>\u0412\u0441\u0451 \u044d\u0442\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 \u0432 \u0434\u043e\u043a\u0435 \u043f\u043e class-validator \u0438 class-transformer.<\/p>\n<blockquote>\n<p>\u041d\u043e \u0432\u043e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0443\u0434\u0442\u0435 \u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u044b &#8212; \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u041d\u0418 \u0412 \u041a\u041e\u0415\u041c \u0421\u041b\u0423\u0427\u0410\u0415 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u0440\u043e\u0441\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443. \u042d\u0442\u043e \u043f\u043e\u043b\u043e\u0436\u0438\u0442 \u043f\u043e\u0442\u043e\u043a (\u043d\u0430 \u0433\u043e\u0440\u044c\u043a\u043e\u043c \u043e\u043f\u044b\u0442\u0435 &#8212; \u043f\u043e\u0442\u0435\u0440\u044f\u043d\u043d\u044b\u0435 3 \u0447\u0430\u0441\u0430 \u0436\u0438\u0437\u043d\u0438)<\/p>\n<\/blockquote>\n<p><strong>\u0422\u0430\u043a \u0432\u043e\u0442:<\/strong><\/p>\n<p>\u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442 \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435. \u041a\u043e\u0433\u0434\u0430 \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440 @Type(), \u043e\u043d \u043e\u043d \u0437\u0430\u043f\u0438\u0448\u0435\u0442 \u0432 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0432 \u043d\u0435\u0434\u0440\u0430\u0445 class-transformer \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435: &#171;\u0443 \u0432\u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u043d\u0430\u0434\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0447\u0438\u0441\u043b\u043e&#187;. \u041f\u043e\u0442\u043e\u043c, \u043a\u043e\u0433\u0434\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u0440\u0438\u0434\u0451\u0442 \u0432 \u0432\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 nest \u0432\u044b\u0437\u043e\u0432\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e plainToClass \u0438\u0437 <strong>\u0442\u043e\u0439 \u0436\u0435 <\/strong>\u0441\u0430\u043c\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043f\u0435\u0440\u0435\u0434\u0430\u0432 \u0442\u0443\u0434\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 Query. \u041e\u043d\u0430 \u0438\u0437 <strong>\u0442\u043e\u0433\u043e \u0436\u0435<\/strong> \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u043f\u0440\u043e\u0432\u0435\u0434\u0451\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c &#171;\u0442\u043e\u043c \u0436\u0435&#187; \u0432\u0441\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u0415\u0441\u043b\u0438 \u043a\u043e\u043f\u0438\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0443 \u043d\u0430\u0441 \u0434\u0432\u0435, \u0442\u043e \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u0432\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 \u043a\u043e\u0433\u0434\u0430 plainToClass \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0432 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u0435 @Type() \u0442\u0430\u043c \u043d\u0435 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f!<\/p>\n<blockquote>\n<p>\u042d\u0442\u043e \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0451\u043d\u043d\u044b\u0439 \u0444\u0430\u043a\u0442. \u041d\u043e \u0432\u043e\u0442 \u043f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u0442\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u044f \u043d\u0435 \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u043f\u043e\u043d\u0438\u043c\u0430\u044e. \u0412\u0441\u0435\u0433\u0434\u0430 \u0441\u0447\u0438\u0442\u0430\u043b, \u0447\u0442\u043e <code>import<\/code> \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u043d\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442, \u043d\u043e \u0432\u0438\u0434\u0438\u043c\u043e \u0432\u0441\u0451 \u0441\u043b\u043e\u0436\u043d\u0435\u0435.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043a\u0442\u043e-\u0442\u043e \u0443\u0436\u0435 \u0434\u043e\u0441\u0442\u0438\u0433 \u0434\u0437\u0435\u043d &#8212; \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0445, \u043a\u043e\u043c\u0443-\u0442\u043e \u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f.<\/p>\n<\/blockquote>\n<p>\u0410 \u043c\u044b \u043a\u0430\u043a \u0440\u0430\u0437 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043b\u0438 \u043d\u0430\u0448 \u043a\u043b\u0430\u0441\u0441 Query \u0432 \u043e\u0434\u0438\u043d \u043f\u0430\u043a\u0435\u0442, \u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0438 \u0435\u0441\u043b\u0438 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432\u044b\u0448\u0435, \u043d\u043e \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0443 <a class=\"mention\" href=\"\/users\/contract\">@contract<\/a>\u043d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0448\u0430\u043d\u0441\u043e\u0432 \u043d\u0430\u0439\u0442\u0438 \u043d\u0443\u0436\u043d\u0443\u044e \u043a\u043e\u043f\u0438\u044e class-transformer.<\/p>\n<p>\u0417\u0430\u0431\u0430\u0432\u043d\u043e, \u0447\u0442\u043e \u0443 class-validator \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043d\u0435\u0442. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043e\u043d\u0438 \u0445\u0440\u0430\u043d\u044f\u0442 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u043d\u0430\u0447\u0435 (\u0432 global?). \u041a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u0435\u0449\u0451 \u043d\u0435 \u0443\u0441\u043f\u0435\u043b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c.<\/p>\n<\/div>\n<\/details>\n<p>\u0412\u043e\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0442\u0432\u0435\u0442 \u0438 \u043d\u0430\u0439\u0434\u0435\u043d. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0440\u0435\u0437\u043e\u043b\u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0432 \u043d\u043e\u0434\u0435 (\u0438\u0449\u0435\u043c \u0432 node_modules, \u043f\u043e\u0442\u043e\u043c \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u043c\u0441\u044f \u0432\u044b\u0448\u0435, \u0438\u0449\u0435\u043c \u0432 node_modules&#8230; \u0438 \u0442\u0430\u043a \u0434\u043e \u0440\u0443\u0442\u0430) \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u0438\u043c\u043b\u0438\u043d\u043a\u043e\u0432 \u043d\u0430\u043c \u043e\u0447\u0435\u043d\u044c \u0432\u044b\u0433\u043e\u0434\u0435\u043d <strong>&#8212;hoist.<\/strong> \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0438\u0437 registry, \u043f\u0430\u043a\u0435\u0442\u043d\u044b\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e (\u043c\u0435\u043d\u044f \u043f\u0443\u0433\u0430\u0435\u0442 \u044d\u0442\u043e <em>\u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e<\/em>&#8230;) \u0442\u043e \u0436\u0435 &#8212; \u043f\u043e\u0434\u043d\u0438\u043c\u0435\u0442 \u0432\u0441\u0451, \u0447\u0442\u043e \u0441\u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0434\u043d\u044f\u0442\u044c.<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e \u0431\u044b\u043b\u043e \u0443\u0436\u0435 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 &#8212; \u043f\u0435\u0440\u0435\u0441\u043f\u0430\u0442\u044c&#8230;<\/p>\n<h3>\u0427\u0442\u043e \u0432 \u0438\u0442\u043e\u0433\u0435?<\/h3>\n<p>\u0427\u0443\u0442\u043e\u043a \u0443\u0441\u0442\u0430\u043a\u0430\u043d\u0438\u0432 \u0432 \u0433\u043e\u043b\u043e\u0432\u0435 \u043d\u043e\u0432\u043e\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 (\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u044b), \u044f \u0440\u043e\u0434\u0438\u043b \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<ul>\n<li>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u043d\u0430\u0434 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u043c (\u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0441\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0432 \u0435\u0433\u043e), \u043e\u043d \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u043e \u043f\u043b\u0430\u043d\u0443:<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"bash\">lerna bootstrap --hoist # \u041d\u0435 npm i \u0432 \u043a\u043e\u0440\u043d\u0435! \u042d\u0442\u043e \u0441\u043b\u043e\u043c\u0430\u0435\u0442 \u0432\u0430\u0448 lock-file! lerna run build jest # \u043d\u0443 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c...<\/code><\/pre>\n<ul>\n<li>\n<p>\u0412 CI \u0434\u0435\u043b\u0430\u0435\u043c \u0442\u043e <strong>\u0436\u0435 \u0441\u0430\u043c\u043e\u0435<\/strong>, \u043f\u043e\u0442\u043e\u043c <code>lerna publish<\/code>, \u0430 \u0437\u0430\u0442\u0435\u043c:<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"bash\"># Makefile  # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u0435\u0440\u0441\u0438\u044e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. BUILD:=build.$(shell jq .version packages\/application\/package.json | sed 's\/\"\/\/g')  artifact:   # \u0421\u043a\u0440\u0438\u043f\u0442 build\/prod \u0443\u0431\u0438\u0440\u0430\u0435\u0442 sourceMap'\u044b \u0438 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u044b \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435 \t(cd packages\/application &amp;&amp; npm run build:prod -- --outDir ..\/..\/deploy\/$(BUILD)) \tcp -r packages\/application\/package*.json deploy\/$(BUILD)   # \u0421\u0442\u0430\u0432\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u043d\u0442\u0430\u0439\u043c-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u0437 package-lock.json \t(cd deploy\/$(BUILD) &amp;&amp; npm ci --production)      # \u042f \u0432\u044b\u0440\u0435\u0437\u0430\u043b \u043a\u043e\u0435-\u043a\u0430\u043a\u0438\u0435 \u043d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438, \u0442\u0438\u043f\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f package*.json \u0438   # \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f tar.gz \u0430\u0440\u0445\u0438\u0432\u0430. \trm deploy\/$(BUILD)\/package*.jsosdf<\/code><\/pre>\n<p>\u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <strong>make<\/strong>, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u0441\u0443\u0442\u044c. \u0412 \u0438\u0442\u043e\u0433\u0435, \u044d\u0442\u043e \u0432\u0441\u0451 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0432 <strong>Dockerfile<\/strong>, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0448\u0430 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u043a \u044d\u0442\u043e\u043c\u0443 \u0433\u043e\u0442\u043e\u0432\u0430.<\/p>\n<ul>\n<li>\n<p>\u041a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0435 lock-\u0444\u0430\u0439\u043b\u044b, \u0435\u0441\u043b\u0438 \u0438\u0445 \u043d\u0435\u0442?<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"bash\">lerna exec -- npm i lerna clean --yes # \u0418\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a. \u0421\u0442\u0430\u0432\u0438\u043c \u043c\u043e\u0434\u0443\u043b\u0438, \u0430 \u043f\u043e\u0442\u043e\u043c \u0443\u0434\u0430\u043b\u044f\u0435\u043c. \u041d\u043e \u044d\u0442\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c # lock-\u0444\u0430\u0439\u043b\u044b lerna bootstrap -- hoist<\/code><\/pre>\n<ul>\n<li>\n<p>\u041d\u0443 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0438, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u0441\u0430\u043c\u043e\u0435 \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u043e\u0435. \u041a\u0430\u043a \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0432 \u043d\u0430\u0448 application (\u0438\u043b\u0438 <a class=\"mention\" href=\"\/users\/contract)\">@contract)<\/a>\u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c lock-\u0444\u0430\u0439\u043b\u043e\u0432:<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"cmake\"># Makefile  add: \t# (\u041e\u0427\u0415\u041d\u042c \u0412\u0410\u0416\u041d\u041e) \u0417\u0434\u0435\u0441\u044c \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e package.json \tlerna add --scope=$(scope) $(package) --no-bootstrap \t# \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u0441\u044f package-lock.json \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 \tlerna exec --scope=$(scope) -- npm i \t# node_modules \u0432\u043d\u0443\u0442\u0440\u0438 units\/application \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u044b! \tlerna clean --yes \t# \u0432\u0435\u0440\u043d\u0451\u0442 \u043d\u0430\u043c \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0432 \u043a\u043e\u0440\u0435\u043d\u044c \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442 \u0440\u0443\u0442\u043e\u0432\u044b\u0439 package-lock.json \tlerna bootstrap --hoist    # \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0442\u0430\u043a (\u0432 scope \u043d\u0430\u0434\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0438\u043c\u044f \u043f\u0430\u043a\u0435\u0442\u0430 \u0438\u0437 package.json): $ make add scope=app_name package left-pad<\/code><\/pre>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u0442\u0430\u043a \u0441\u043b\u043e\u0436\u043d\u043e? \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0430 <strong>lerna add<\/strong> \u043d\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 package-lock.json, \u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442. \u041d\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u043f\u043e\u0447\u0435\u043c\u0443. \u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u044f \u043d\u0435 \u043d\u0430\u0448\u0451\u043b \u0447\u0435\u0433\u043e-\u0442\u043e. \u041f\u043e\u0434\u0441\u043a\u0430\u0436\u0438\u0442\u0435&#8230;<\/p>\n<\/p>\n<p><strong>\u0412\u044b\u0432\u043e\u0434\u044b:<\/strong><\/p>\n<ul>\n<li>\n<p>\u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0432 \u043d\u043e\u0434\u0435 &#8212; \u044d\u0442\u043e \u0441\u043b\u043e\u0436\u043d\u043e.<\/p>\n<\/li>\n<li>\n<p>\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u0432 \u043c\u043e\u043d\u043e\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f\u0445 \u0432 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 CI\/CD &#8212; \u044d\u0442\u043e \u0435\u0449\u0451 \u0441\u043b\u043e\u0436\u043d\u0435\u0435.<\/p>\n<\/li>\n<li>\n<p>\u041d\u043e \u0441\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435, \u0441\u0432\u0435\u0442 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0442\u0443\u043d\u043d\u0435\u043b\u044f \u0435\u0441\u0442\u044c! \u0418 \u043f\u043e\u043a\u0430 \u0440\u0435\u0448\u0430\u0435\u0448\u044c \u0442\u0430\u043a\u043e\u0433\u043e \u0440\u043e\u0434\u0430 \u0437\u0430\u043c\u043e\u0440\u043e\u0447\u043a\u0438, \u0447\u0430\u0441\u0442\u0435\u043d\u044c\u043a\u043e \u0443\u0434\u0430\u0451\u0442\u0441\u044f \u043f\u043e\u0434\u043d\u044f\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u043f\u043b\u0430\u0441\u0442 \u043d\u043e\u0432\u044b\u0445 \u0437\u043d\u0430\u043d\u0438\u0439.<\/p>\n<\/li>\n<\/ul>\n<p>\u0423\u0432\u0435\u0440\u0435\u043d, \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f. \u041c\u0435\u043d\u044f \u043d\u0435 \u043f\u043e\u043a\u0438\u0434\u0430\u0435\u0442 \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u0432\u0441\u0451 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0449\u0435, \u0447\u0438\u0449\u0435 &#8212; \u0431\u0443\u0434\u0443 \u0440\u0430\u0434 \u043c\u043d\u0435\u043d\u0438\u044f\u043c \u0438 \u0438\u0434\u0435\u044f\u043c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.<\/p>\n<blockquote>\n<p>\u041d\u0430\u0434\u043e \u0435\u0449\u0451 \u043f\u043e\u0438\u0433\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 npm shrinkwrap, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440&#8230;<\/p>\n<\/blockquote>\n<p>\u0411\u043e\u043b\u044c\u0448\u043e\u0435 \u0441\u043f\u0430\u0441\u0438\u0431\u043e \u0442\u0435\u043c, \u043a\u0442\u043e \u0434\u043e\u0447\u0438\u0442\u0430\u043b \u0434\u043e \u043a\u043e\u043d\u0446\u0430&#8230; \u0415\u0441\u043b\u0438 \u0437\u0434\u0435\u0441\u044c \u0435\u0449\u0451 \u043a\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0435\u0441\u0442\u044c?<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 &#171;\u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0438\u0437 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438&#187; \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d, \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0447\u0442\u043e &#171;\u0442\u0430\u043a&#187;, \u0447\u0442\u043e &#171;\u043d\u0435 \u0442\u0430\u043a&#187;. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0438\u0441\u0442\u043e\u0440\u0438\u0439&#8230; \u0438\u0445 \u0435\u0441\u0442\u044c \u0443 \u043c\u0435\u043d\u044f.<\/p>\n<\/p>\n<p>\u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435!<\/p>\n<\/p>\n<\/div>\n<p> \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\/post\/535944\/\"> https:\/\/habr.com\/ru\/post\/535944\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<h3>\u0412\u043c\u0435\u0441\u0442\u043e \u043f\u0440\u0435\u0434\u0438\u0441\u043b\u043e\u0432\u0438\u044f<\/h3>\n<p>\u0414\u043e\u0431\u0440\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441\u0443\u0442\u043e\u043a! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0421\u0435\u0440\u0433\u0435\u0439, \u0438 \u044f \u0442\u0438\u043c\u043b\u0438\u0434 \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u041c\u0435\u0434\u043f\u043e\u0438\u043d\u044224-\u041b\u0430\u0431. \u042f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u043d\u0430 nodejs \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u043b\u0443\u0442\u043e\u0440\u0430 \u043b\u0435\u0442 &#8212; \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u0431\u044b\u043b C#, \u043d\u0443 \u0430 \u0435\u0449\u0451 \u0434\u043e \u0442\u043e\u0433\u043e, \u0432\u0441\u044f\u043a\u043e\u0435 \u0440\u0430\u0437\u043d\u043e\u0435 \u0438 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u043e. \u041d\u0443 \u0442\u043e \u0435\u0441\u0442\u044c, \u043e\u043f\u044b\u0442\u0430 \u0443 \u043c\u0435\u043d\u044f \u043d\u0435 \u0442\u0430\u043a \u0447\u0442\u043e\u0431\u044b \u0432\u0430\u0433\u043e\u043d, \u0438 \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u043e \u043f\u043e\u043b\u043e\u043c\u0430\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u0443 \u043f\u0440\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0449\u0438\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c. \u0420\u0435\u0448\u0438\u0432 \u0442\u0430\u043a\u0443\u044e, \u0432\u0441\u0435\u0433\u0434\u0430 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043d\u0430\u0445\u043e\u0434\u043a\u0430\u043c\u0438 \u0441 \u0442\u043e\u0432\u0430\u0440\u0438\u0449\u0430\u043c\u0438 \u043f\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0435.<\/p>\n<p>\u0418 \u0432\u043e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043d\u0435\u0439 \u043d\u0430\u0437\u0430\u0434, \u043e\u043d\u0438 \u043f\u043e\u0441\u043e\u0432\u0435\u0442\u043e\u0432\u0430\u043b\u0438 \u043c\u043d\u0435 \u0437\u0430\u0432\u0435\u0441\u0442\u0438 \u0431\u043b\u043e\u0433&#8230; \u0430 \u044f \u043f\u043e\u0434\u0443\u043c\u0430\u043b, \u043c\u043e\u0436\u0435\u0442 \u0442\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 \u0425\u0430\u0431\u0440?<\/p>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0439, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043e \u0441\u043a\u0440\u0438\u043f\u043e\u043c \u0432\u044b\u043b\u0435\u0437\u0430\u0435\u0442 \u0442\u043e\u043b\u043a\u043e\u0432\u044b\u0439, \u043d\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043e\u043f\u044b\u0442\u043d\u044b\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u0431\u0443\u0434\u0443\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u0442\u043e\u043b\u043a\u043e\u0432\u044b\u043c \u0438 \u043d\u0435\u043e\u043f\u044b\u0442\u043d\u044b\u043c )) \u0410 \u043c\u043e\u0436\u0435\u0442 \u0438 \u0435\u0449\u0451 \u043a\u043e\u043c\u0443 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f.<\/p>\n<p>\u0420\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u0431\u0435\u0437 \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0432 \u0442\u0435\u043e\u0440\u0438\u044e, \u043d\u043e \u0441\u043e \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438 \u043d\u0430 \u043e\u043d\u0443\u044e.<\/p>\n<h3>\u041e \u0447\u0451\u043c \u043f\u043e\u0439\u0434\u0451\u0442 \u0440\u0435\u0447\u044c?<\/h3>\n<p>\u041f\u0438\u043b\u043e\u0442 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u0432\u044f\u0449\u0451\u043d \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0435 \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0438\u0441\u044c \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c CI\/CD \u0434\u043b\u044f \u043c\u043e\u043d\u043e\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0441 <strong>lerna<\/strong>. \u0421\u0440\u0430\u0437\u0443 \u0441\u043a\u0430\u0436\u0443, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u043f\u043e\u0441\u0442:<\/p>\n<ul>\n<li>\n<p>\u043d\u0435 \u043f\u0440\u043e <strong>\u043c\u043e\u043d\u043e\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/strong>. \u041f\u043b\u044e\u0441\u044b \u0438 \u043c\u0438\u043d\u0443\u0441\u044b \u043c\u043e\u043d\u043e\u0440\u0435\u043f\u044b, \u043a\u0430\u043a \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438, \u0443\u0436\u0435 \u0434\u0430\u0432\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0432 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435 \u043f\u043e\u0441\u0442\u043e\u0432, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043d\u0430 <a href=\"https:\/\/habr.com\/ru\/post\/435306\/\" rel=\"noopener noreferrer nofollow\">\u0445\u0430\u0431\u0440\u0435<\/a> (\u044d\u0442\u043e\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0445\u043e\u043b\u0438\u0432\u0430\u0440\u043d\u044b\u0439, \u043a\u0441\u0442\u0430\u0442\u0438)<\/p>\n<\/li>\n<li>\n<p>\u043d\u0435 \u043f\u0440\u043e <strong>\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b<\/strong> \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u043d\u043e\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f\u043c\u0438. \u041c\u043e\u043d\u043e\u0440\u0435\u043f\u0443 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <a href=\"https:\/\/nx.dev\/\" rel=\"noopener noreferrer nofollow\">Nx<\/a>, <a href=\"https:\/\/rushjs.io\/\" rel=\"noopener noreferrer nofollow\">rush<\/a>, \u0434\u0430\u0436\u0435 \u043f\u0440\u043e\u0441\u0442\u043e yarn workspaces. \u041d\u043e \u0442\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043c\u044b \u0432\u044b\u0431\u0440\u0430\u043b\u0438 lerna \u0438 \u043f\u043e\u0436\u0438\u0432\u0451\u043c \u0441 \u043d\u0435\u0439 \u043a\u0430\u043a\u043e\u0435 \u0442\u043e \u0432\u0440\u0435\u043c\u044f.<\/p>\n<\/li>\n<li>\n<p>\u043d\u0435 \u043f\u0440\u043e <strong>\u043f\u0430\u043a\u0435\u0442\u043d\u044b\u0435 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u044b<\/strong>. \u041c\u043e\u0433\u0443 \u043f\u043e\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u0438\u0439 <a href=\"https:\/\/www.youtube.com\/watch?v=hq-gIihAs5A\" rel=\"noopener noreferrer nofollow\">\u0432\u0438\u0434\u043e\u0441<\/a> \u0441\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435\u043c npm, yarn \u0438 pnpm \u0438 \u043e\u0444\u0438\u0433\u0435\u043d\u043d\u0443\u044e \u0441\u0435\u0440\u0438\u044e <a href=\"https:\/\/habr.com\/ru\/company\/domclick\/blog\/510812\/\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0441\u0442\u043e\u0432<\/a> \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0430 c npm \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0435\u0442\u0441\u044f \u0441 \u0441\u0430\u043c\u044b\u0445 \u0430\u0437\u043e\u0432 \u0438 \u043e\u0447\u0435\u043d\u044c \u0442\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u0410 \u0443 \u043d\u0430\u0441 npm (\u043f\u043e\u043a\u0430)&#8230;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0435 \u043f\u0440\u043e <strong>nestjs<\/strong>. \u041d\u043e \u043e\u043d \u043a\u043b\u0430\u0441\u0441\u043d\u044b\u0439!<\/p>\n<\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u0431\u043e \u0432\u0441\u0451\u043c \u044d\u0442\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u043e\u043c \u043e\u0431\u044a\u0451\u043c\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0442\u0438\u043a\u0438.<\/p>\n<p>\u0422\u043e\u0433\u0434\u0430 \u043e \u0447\u0451\u043c?<\/p>\n<p><strong>\u0414\u0430\u043d\u043e:<\/strong><\/p>\n<p>\u0418\u043c\u0435\u0435\u0442\u0441\u044f \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u043c\u043e\u043d\u043e\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043b\u0435\u0436\u0438\u0442 \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430 \u043d\u0435\u0441\u0442\u0435 \u0438 npm-\u043f\u0430\u043a\u0435\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u0441\u0451 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u0434\u043b\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u044d\u0442\u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c.<\/p>\n<pre><code>packages +-- @contract |\t\t+-- src |\t\t+-- package.json |   ... | +-- application |   +-- src |   +-- package.json |   ... | +-- package.json +-- lerna.json ...<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0417\u0430\u0447\u0435\u043c \u043f\u0430\u043a\u0435\u0442?<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0439 \u043f\u0430\u043a\u0435\u0442 \u0438\u043b\u0438, \u043a\u0430\u043a \u043c\u044b \u0435\u0433\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c, &#171;\u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442&#187; \u043d\u0443\u0436\u0435\u043d \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u0438\u043f\u043e\u0432 \u0432 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u043c \u043a\u043e\u0434\u0435 \u0438 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438.<\/p>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c, \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u0434\u0435\u043b\u0430\u0435\u0442 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e axios.post(&#8230;.) \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f \u0442\u0443\u0434\u0430 \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u044b\u0435 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b (any), \u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 \u0441 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0432\u0445\u043e\u0434\u043e\u043c \u0438 \u0432\u044b\u0445\u043e\u0434\u043e\u043c.<\/p>\n<pre><code class=\"javascript\">import { Client } from '@contract\/some-service';  const client = new Client(options);  const filters: StronglyTypedObject = ... const data = await client.getSomeData(filters) \/* * \u0418 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0443 \u043d\u0430\u0441 \u0442\u043e\u0436\u0435 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439. * \u0410 \u0435\u0449\u0451 \u0438\u0437 getSomeData() \u0432\u044b\u043b\u0435\u0442\u0430\u044e\u0442 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430, * \u0447\u0435\u043c \u0432 \u043d\u0430\u0441 \u043e\u0431\u044b\u0447\u043d\u043e \u043a\u0438\u0434\u0430\u0435\u0442\u0441\u044f, axios. *\/<\/code><\/pre>\n<p>\u041d\u0430\u0448\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0430, \u0447\u0442\u043e \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043e\u0431\u043b\u0435\u0433\u0447\u0430\u0435\u0442 \u0438 \u0443\u0441\u043a\u043e\u0440\u044f\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0434\u043b\u044f \u0432\u0441\u0435\u0445, \u043a\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043d\u0430\u0448 \u0441\u0435\u0440\u0432\u0438\u0441, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434. \u0422\u0430\u043a \u0447\u0442\u043e \u043d\u0430\u043c \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u0441\u044f.<\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043c\u044b \u043f\u043e\u0448\u043b\u0438 \u0447\u0443\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435 \u0438 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"javascript\">const query = new SomeQuery({ ... }); const data = await client.call(query); \/* * \u0422\u0435\u043f\u0435\u0440\u044c \u043a\u043b\u0438\u0435\u043d\u0442 \u0443 \u043d\u0430\u0441 \u043e\u0431\u0449\u0438\u0439 \u043d\u0430 \u0432\u0441\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b, \u0430 \u0432\u043e\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b - * \u0432\u043e\u043b\u0448\u0435\u0431\u043d\u044b\u0435 \u0438 \u0441\u0430\u043c\u0438 \u0437\u043d\u0430\u044e\u0442, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c. \u042d\u0442\u043e \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441 rabbitMQ. *\/ <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f http-\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u043d\u043e \u0438 \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u0437 RabbitMQ, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0441\u0430\u043c\u043e\u043f\u0438\u0441\u043d\u044b\u0445 \u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 redis. \u041d\u043e \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e \u044d\u0442\u0438\u043c\u0438 \u0434\u0435\u0442\u0430\u043b\u044f\u043c\u0438 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c.<\/p>\n<\/p>\n<p>\u0422\u0430\u043a \u0432\u043e\u0442, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043c\u043e\u043d\u043e\u0440\u0435\u043f\u0430, \u0447\u0442\u043e \u043e\u043d\u0430 \u043d\u0430\u043c \u0434\u0430\u0451\u0442? \u0412 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u0411\u0430\u0437\u043e\u0432\u0430\u044f \u0444\u0438\u0447\u0430 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 &#8212; \u044d\u0442\u043e \u0442\u043e, \u0447\u0442\u043e \u0432 lerna \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <strong>bootstrap<\/strong>.<\/p>\n<pre><code class=\"bash\">lerna bootstrap --hoist<\/code><\/pre>\n<p>\u0424\u043b\u0430\u0433 <code>--hoist<\/code><strong> <\/strong>&#8212; \u0441\u0430\u043c\u0430\u044f \u043f\u0440\u0438\u044f\u0442\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c. \u041e\u043d \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043b\u0435\u0440\u043d\u0435, \u0447\u0442\u043e \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0435\u0441\u043b\u0438 \u043c\u043e\u0436\u043d\u043e, \u043d\u0430\u0434\u043e \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 node_modules \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041c\u044b \u043d\u0430 \u044d\u0442\u043e\u043c \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043c \u043c\u0435\u0441\u0442\u043e + \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0435\u0449\u0451 \u0431\u043e\u043d\u0443\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043c \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 <code>lerna bootstrap<\/code> \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0441\u0438\u043c\u043b\u0438\u043d\u043a\u0438 \u043d\u0430 \u043f\u0430\u043a\u0435\u0442\u044b \u0438\u043c\u0435\u044e\u0449\u0438\u0435\u0441\u044f \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438. \u0422\u043e \u0435\u0441\u0442\u044c, \u0445\u043e\u0442\u044f \u0432 application\/package.json \u0443\u043a\u0430\u0437\u0430\u043d\u043e<\/p>\n<pre><code class=\"json\">\"dependencies\": { \t\"@contract\/core\": \"^1.0.0\" }<\/code><\/pre>\n<p>\u0432 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u044d\u0442\u043e\u0442 \u043f\u0430\u043a\u0435\u0442 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u0438\u0437 npm-\u0440\u0435\u0435\u0441\u0442\u0440\u0430, \u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0438\u043b\u0438\u043d\u043a\u0443\u0435\u0442\u0441\u044f \u0432 node_modules \u0438\u0437 \u043f\u0430\u043f\u043a\u0438 packages. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u044b \u0435\u0433\u043e \u043c\u0435\u043d\u044f\u0435\u043c, \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0438 \u0441\u0440\u0430\u0437\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438.<\/p>\n<h3>\u0417\u0430\u0434\u0430\u0447\u0430<\/h3>\n<p>\u041c\u044b \u0441\u0442\u0440\u043e\u0438\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 CI\/CD. \u0418 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u043a\u0440\u0430\u0441\u0438\u0432\u043e \u0432\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430\u0448 \u043c\u043e\u043d\u043e\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0432 \u043a\u043e\u043d\u0432\u0435\u0435\u0440. \u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0437\u0430\u0434\u0430\u0447\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u043b\u0430 \u0443\u0436\u0435 1000 \u0440\u0430\u0437 \u0431\u044b\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0430 &#8212; \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043d\u0430 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u0430.<\/p>\n<p>\u0418 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0435\u0441\u0442\u044c \u043a\u0443\u0447\u0430 issues \u043d\u0430 github, \u043f\u043e\u0441\u0442\u044b \u043d\u0430 Stackoverflow \u0438 \u0434\u0440. \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u0445. \u041d\u043e \u043d\u0435\u0442 \u0440\u0435\u0446\u0435\u043f\u0442\u043e\u0432.. \u043a\u043e\u0441\u0442\u044b\u043b\u0438 \u0435\u0441\u0442\u044c, \u0438 \u0442\u043e \u043d\u0435 \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0447\u0438\u0435, \u0430 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e &#171;\u0448\u0442\u0430\u0442\u043d\u043e\u0433\u043e&#187; \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044f \u043d\u0435 \u043d\u0430\u0448\u0451\u043b (\u0438\u0441\u043a\u0430\u043b, \u0447\u0435\u0441\u0441\u043b\u043e\u0432\u043e).<\/p>\n<p>\u0422\u0430\u043a \u0432\u043e\u0442, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0448 \u0441\u0435\u0440\u0432\u0438\u0441 \u0433\u043e\u0442\u043e\u0432 \u043a \u0440\u0435\u043b\u0438\u0437\u0443:<\/p>\n<ol>\n<li>\n<p>\u041c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u043c\u0435\u0440\u0436\u0438\u0442\u044c PR \u0438, \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d.<\/p>\n<\/li>\n<li>\n<p>\u041c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442, \u043f\u0440\u043e\u0433\u043d\u0430\u0442\u044c \u043b\u0438\u043d\u0442\u0435\u0440, unit-\u0442\u0435\u0441\u0442\u044b.<\/p>\n<\/li>\n<li>\n<p>\u041c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u0434\u043d\u044f\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u044e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u043f\u0430\u043a\u0435\u0442\u0430 (\u0430 \u0432 \u0447\u0451\u043c \u043d\u0435 \u0431\u044b\u043b\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 &#8212; \u0442\u0430\u043c \u043d\u0435 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0442\u044c).<\/p>\n<\/li>\n<li>\n<p>\u041c\u044b \u0445\u043e\u0442\u0438\u043c \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442 @contract \u0432 npm registry (\u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u043e\u043c).<\/p>\n<\/li>\n<li>\n<p>\u041c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0438\u0437 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0442\u043e\u043c \u043e\u0442\u0434\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430\u043c, \u043d\u0443 \u0430 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0440\u0430\u0431\u043e\u0447\u0443\u044e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u043a\u0443 \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c. (\u0434\u0430, \u0434\u0430, \u044f \u0437\u043d\u0430\u044e &#8212; <strong>docker<\/strong>, \u043d\u043e \u043d\u0435 \u0432\u0441\u0435 \u0441\u0440\u0430\u0437\u0443. \u0412 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0442\u0430\u043c \u0431\u0443\u0434\u0443\u0442 \u0442\u0435 \u0436\u0435 \u0441\u0430\u043c\u044b\u0435)<\/p>\n<\/li>\n<li>\n<p>\u041d\u0443 \u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0448 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 \u0431\u044b\u043b \u0440\u0430\u0437\u0443\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e, \u0447\u0442\u043e \u0435\u043c\u0443 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b. node_modules \u043f\u043e \u0413\u0411 &#8212; \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0442\u043e, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e.<\/p>\n<\/li>\n<\/ol>\n<h3>\u041f\u043e\u0435\u0445\u0430\u043b\u0438!<\/h3>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u0443\u043d\u043a\u0442 \u0431\u0435\u0440\u0443\u0442 \u043d\u0430 \u0441\u0435\u0431\u044f CI\/CD \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<p>\u0421\u043e \u0432\u0442\u043e\u0440\u044b\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0431\u044b\u0442\u044c \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e:<\/p>\n<p>\u0414\u043b\u044f \u0442\u0440\u0435\u0442\u044c\u0435\u0433\u043e lerna \u043d\u0430\u043c \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0434\u0432\u0435 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b: <strong>lerna version<\/strong> \u0438<strong> lerna publish<\/strong> (\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u043f\u0435\u0440\u0432\u0443\u044e \u0438 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0451). \u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"bash\">lerna publish --conventional-commits --yes # \u041d\u0430 \u0437\u0430\u043c\u0435\u0442\u043a\u0443: \u043a\u043e\u043c\u0430\u043d\u0434\u0430 publish \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0432\u0441\u0435 \u0444\u043b\u0430\u0433\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b version. # \u0412 \u0434\u043e\u043a\u0435 \u044d\u0442\u043e \u0435\u0441\u0442\u044c, \u043d\u043e \u044f \u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0440\u0430\u0437\u0430 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u043b.<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0427\u0443\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e conventional commits.<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0415\u0441\u043b\u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>lerna publish<\/code> \u0431\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0445 \u043a\u043b\u044e\u0447\u0435\u0439, \u0442\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u043c,\u0447\u0442\u043e \u0434\u043b\u044f CI<em>-\u043a<\/em>\u043e\u043d\u0432\u0435\u0439\u0440\u0430 \u043d\u0435 \u0433\u043e\u0434\u0438\u0442\u0441\u044f. \u041d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f <a href=\"https:\/\/www.conventionalcommits.org\/en\/v1.0.0\/\" rel=\"noopener noreferrer nofollow\">Conventional Commits<\/a>. \u0421\u043e\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0433\u043e \u0441\u043e\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u044f \u043f\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 commit-\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 lerna \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u043a\u0430\u043a\u0443\u044e \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043f\u043e semver \u043f\u043e\u0434\u043d\u044f\u0442\u044c (\u043c\u0438\u043d\u043e\u0440, \u043c\u0430\u0436\u043e\u0440 \u0438\u043b\u0438 \u043f\u0430\u0442\u0447). \u0421\u0430\u043c\u043e\u0435 \u043c\u0438\u043b\u043e\u0435, \u0447\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c <strong>\u0432\u044b\u043d\u0443\u0434\u0438\u0442\u044c<\/strong> \u043d\u0430\u0448\u0438\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043c\u043c\u0438\u0442\u044b (\u0447\u0442\u043e \u0441\u0430\u043c\u043e \u043f\u043e \u0441\u0435\u0431\u0435 \u0445\u043e\u0440\u043e\u0448\u043e)! \u0412\u043e\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0430\u044f <a href=\"https:\/\/dev.to\/omarzi\/how-to-validate-commit-message-convention-using-commitlint-and-husky-aaa\" rel=\"noopener noreferrer nofollow\">\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f<\/a>.<\/p>\n<\/div>\n<\/details>\n<p>\u0421 \u043f\u0443\u043d\u043a\u0442\u043e\u043c 4 \u0443 \u043d\u0430\u0441 \u0442\u043e\u0436\u0435 \u043d\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c.<code>lerna publish<\/code> \u043d\u0430\u043c \u044d\u0442\u043e \u0443\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u043b\u0430, \u0430 \u0435\u0441\u043b\u0438 \u043d\u0430\u0441 \u044d\u0442\u043e \u043f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e \u043d\u0435 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 (\u043d\u0443, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u043c\u044b \u043d\u0435 \u0445\u043e\u0442\u0438\u043c \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u0435\u0433\u0438 \u0438\u043b\u0438 \u0435\u0449\u0451 \u0447\u0442\u043e), \u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <code>lerna version<\/code> \u0432 \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0438 \u0441 <code>npm publish<\/code> \u0438\u0437 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043f\u0430\u043a\u0435\u0442\u0430. \u0417\u0430\u0431\u0430\u0432\u043d\u043e, \u0447\u0442\u043e npm publish \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u043a\u043b\u044e\u0447\u0430<code> --registry<\/code>, \u0447\u0442\u043e\u0431\u044b \u0443\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0443\u0434\u0430 \u043f\u0443\u0448\u0438\u0442\u044c \u043f\u0430\u043a\u0435\u0442. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 <code>lerna publish<\/code>, \u043d\u0430\u0441 \u0432\u044b\u0440\u0443\u0447\u0438\u0442 <strong>lerna.json<\/strong> (\u0441\u0442\u0440. 7):<\/p>\n<pre><code class=\"json\">{   \"version\": \"1.2.2\",   \"npmClient\": \"npm\",   \"command\": {     \"publish\": {       \"message\": \"chore(release): publish\",       \"registry\": ....     }   },   \"packages\": [     \"packages\/@contract\",     \"packages\/application\"   ] } <\/code><\/pre>\n<p>\u0418\u043d\u0430\u0447\u0435 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0444\u0430\u0439\u043b<strong> .npmrc<\/strong> (\u0444\u0430\u0439\u043b \u0441 <a href=\"https:\/\/docs.npmjs.com\/cli\/v6\/configuring-npm\/npmrc\" rel=\"noopener noreferrer nofollow\">\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 npm<\/a>) \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043f\u0430\u043a\u0435\u0442\u0430.<\/p>\n<h3>\u041f\u0435\u0440\u0432\u044b\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438<\/h3>\n<p>\u0418\u0442\u0430\u043a, \u043d\u0430\u0448\u0430 CI-\u043c\u0430\u0448\u0438\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 (\u0431\u0435\u0437 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 CI\/CD):<\/p>\n<pre><code class=\"bash\"># Pull \u0438 checkout lerna bootsrap --hoist  lerna run build # \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 npm run build \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0430\u043a\u0435\u0442\u0435. lerna publish --conventional-commits --yes cp packages\/application\/build \/tmp\/place\/for\/artifact ...<\/code><\/pre>\n<p>\u041d\u043e \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0448\u0435\u043c\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u043d\u0443\u0436\u043d\u044b \u0435\u0449\u0451 <strong>node_modules<\/strong>.<\/p>\n<\/p>\n<p><em><u>\u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u21161.<\/u><\/em> \u041c\u043e\u0436\u043d\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0432\u0437\u044f\u0442\u044c \u0434\u0430 \u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u043f\u043a\u0443 node_modules \u0438\u0437 \u043a\u043e\u0440\u043d\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432 \u043d\u0430\u0448 \/tmp\/place\/for\/artifact. \u041d\u043e \u0442\u043e\u0433\u0434\u0430:<\/p>\n<ul>\n<li>\n<p>\u041c\u044b \u0442\u043e\u0447\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043b\u0438\u0448\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 (\u0432\u0441\u044f\u043a\u0438\u0435 jest, typescript \u0438 \u043a\u0443\u0447\u0443 \u0435\u0449\u0451 \u0432\u0441\u0435\u0433\u043e \u043d\u0435\u043d\u0443\u0436\u043d\u043e\u0433\u043e \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435). \u0410 \u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u043d\u0435 2 \u043f\u0430\u043a\u0435\u0442\u0430, \u0430 22, \u0442\u043e \u0440\u0430\u0437\u043c\u0435\u0440 node_modules \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u043f\u0440\u0438\u043b\u0438\u0447\u043d\u044b\u043c.<\/p>\n<\/li>\n<li>\n<p>\u041c\u044b, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043d\u0435\u0434\u043e\u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043d\u0443\u0436\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0442. \u043a. lerna \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u0430\u043a\u0435\u0442\u044b \u0432 \u043a\u043e\u0440\u0435\u043d\u044c \u0442\u043e\u043b\u044c\u043a\u043e <strong>\u0435\u0441\u043b\u0438 \u043c\u043e\u0436\u0435\u0442<\/strong>. \u0422\u0430\u043a \u0431\u044b\u0432\u0430\u0435\u0442 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 &#8212; \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0433\u0434\u0435-\u0442\u043e \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440.<\/p>\n<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u21162. \u041d\u0435 \u0432\u043e\u043f\u0440\u043e\u0441. \u0423 \u043d\u0430\u0441 \u0436\u0435 \u0435\u0441\u0442\u044c package.json \u0432\u043d\u0443\u0442\u0440\u0438 packages\/application. \u0422\u0430\u043c \u0432\u0435\u0434\u044c \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e \u0432\u0441\u0451, \u0447\u0442\u043e \u043d\u0430\u0434\u043e! \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c package.json \u0432 \u043f\u0430\u043f\u043a\u0443 \u0441 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u043c, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c <code>npm i<\/code> &#8212; \u043f\u0440\u043e\u0444\u0438\u0442! \u041d\u043e:<\/p>\n<p>\u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c\u043e\u0441\u0442\u0438 \u0431\u0438\u043b\u0434\u0430, \u0432 CI \u0441\u0440\u0435\u0434\u0435 \u0432\u043c\u0435\u0441\u0442\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u044b npm install \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>npm ci<\/code>. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 npm install \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0430\u043a\u0435\u0442\u044b \u0441\u0442\u0430\u0432\u044f\u0442\u0441\u044f \u043d\u0435 \u0438\u0437 package.json, \u0430 \u0438\u0437 package-lock.json \u0438\u043b\u0438 shrinkwrap.json (\u0441\u043c\u044b\u0441\u043b \u0442\u043e\u0442 \u0436\u0435). \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e lock-\u0444\u0430\u0439\u043b\u0430\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 \u0445\u043e\u0440\u043e\u0448\u0435\u043c <a href=\"https:\/\/medium.com\/devschacht\/understanding-lock-files-in-npm-5-4bf615c6cd50\" rel=\"noopener noreferrer nofollow\">\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0435 \u043e\u0442 \u0410\u043d\u0434\u0440\u0435\u044f \u041c\u0435\u043b\u0438\u0445\u043e\u0432\u0430<\/a>.<\/p>\n<p>\u0414\u043b\u044f \u043c\u043e\u0435\u0433\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430 \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<ul>\n<li>\n<p>\u041e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0431\u0435\u0437 lock-\u0444\u0430\u0439\u043b\u0430 \u043d\u0438\u043a\u0430\u043a \u043d\u0435\u043b\u044c\u0437\u044f. \u0414\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0432 dependencies \u0442\u043e\u0447\u043d\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0431\u0435\u0437 \u0432\u0441\u044f\u043a\u0438\u0445 &#171;~&#187; \u0438 &#171;^&#187; &#8212; \u044d\u0442\u043e \u043d\u0435 \u043f\u043e\u043c\u043e\u0436\u0435\u0442, \u0442. \u043a. \u0442\u0440\u0430\u043d\u0437\u0438\u0442\u0438\u0432\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 (\u0442\u043e \u0435\u0441\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u0430\u0448\u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439) \u0432\u044b \u043d\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u0442\u0435.<\/p>\n<\/li>\n<li>\n<p>lock-\u0444\u0430\u0439\u043b \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c <strong>\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d<\/strong> \u0441 package.json. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0432 package.json \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043d\u043e\u0432\u0430\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c (\u0438\u043b\u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442), \u0430 \u0432 package-lock.json \u0435\u0451 \u043d\u0435\u0442, \u0442\u043e npm ci \u0431\u0443\u0434\u0435\u0442 \u0440\u0443\u0433\u0430\u0442\u044c\u0441\u044f:<\/p>\n<\/li>\n<\/ul>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0440\u0438\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0442\u0435\u043a\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u0440\u044f\u043c\u043e\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c &#8212; npm install.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c, \u0441 \u0447\u0435\u0433\u043e \u043c\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u0438 \u043d\u0430\u0448\u0443 \u0441\u0431\u043e\u0440\u043a\u0443: <code>lerna bootstrap --hoist<\/code> \u042d\u0442\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0443\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u043b\u0430 \u043d\u0430\u043c package-lock.json \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041e\u0434\u043d\u0430\u043a\u043e, \u044d\u0442\u043e \u043d\u0430\u043c \u043c\u0430\u043b\u043e \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442.<\/p>\n<p>\u041c\u043e\u0436\u0435\u0442\u0435 \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u044d\u0442\u043e\u043c \u0441\u0430\u043c\u0438, \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0432 \u0432 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 package.json \u0438\u0437 packages\/application \u0438 lock-\u0444\u0430\u0439\u043b \u0438\u0437 \u043a\u043e\u0440\u043d\u044f &#8212; \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u043e\u0448\u0438\u0431\u043a\u0443. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0432\u0435\u0434\u044c \u0442\u0430\u043c \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u043d\u0430\u043c\u0451\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430 <strong>\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e<\/strong>! \u0410 \u0432 application lock-\u0444\u0430\u0439\u043b\u0430 \u0443 \u043d\u0430\u0441 \u043d\u0435\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443:<\/p>\n<p><em><u>\u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u21163.<\/u><\/em> \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0431\u0435\u0437 &#171;\u0432\u0441\u043f\u043b\u044b\u0442\u0438\u044f&#187;. \u0414\u0430, \u043d\u0435 \u0441\u0443\u043f\u0435\u0440 \u0443\u0434\u043e\u0431\u043d\u043e, \u0437\u0430\u0442\u043e lock-\u0444\u0430\u0439\u043b \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043c \u0433\u0434\u0435 \u043d\u0430\u0434\u043e. \u0414\u0435\u043b\u0430\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<pre><code class=\"bash\">lerna bootstrap<\/code><\/pre>\n<p>\u042d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0430\u0441\u0442 \u043d\u0430\u043c \u043f\u043e lock-\u0444\u0430\u0439\u043b\u0443 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442. \u041d\u043e \u0438 \u0442\u0443\u0442 \u0432\u0441\u0451 \u043d\u0435 \u0441\u043b\u0430\u0432\u0430 \u0411\u043e\u0433\u0443! \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0441 \u044d\u0442\u0438\u043c \u0444\u0430\u0439\u043b\u043e\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c <code>npm ci<\/code>, \u043d\u0430\u043c \u043e\u043f\u044f\u0442\u044c \u0441\u043a\u0430\u0436\u0443\u0442 \u043d\u0435\u0445\u043e\u0440\u043e\u0448\u0438\u0435 \u0441\u043b\u043e\u0432\u0430 \u043f\u0440\u043e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e. \u041a\u0430\u043a \u0442\u0430\u043a?<\/p>\n<p>\u0418\u0437\u0443\u0447\u0430\u0435\u043c \u0444\u0430\u0439\u043b package-lock.json \u0438 \u0432\u0438\u0434\u0438\u043c.. \u0447\u0442\u043e \u0442\u0430\u043c \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u043f\u0430\u043a\u0435\u0442\u0430 <a class=\"mention\" href=\"\/users\/contract\/core!\">@contract\/core!<\/a>\u041d\u0443 \u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u043c\u044b \u0435\u0433\u043e \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u043b\u0438, \u0430 \u0434\u0435\u043b\u0430\u043b\u0438 \u0441\u0438\u043c\u043b\u0438\u043d\u043a&#8230;<\/p>\n<p><em><u>\u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u21164.<\/u><\/em> \u041e\u043a, \u0434\u0435\u043b\u0430\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e npm install \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430. \u0422\u0443\u0442 \u043d\u0430\u043c \u043f\u043e\u043c\u043e\u0436\u0435\u0442:<\/p>\n<pre><code class=\"bash\">lerna exec -- npm i<\/code><\/pre>\n<p>\u0423\u0440\u0430, \u0442\u0435\u043f\u0435\u0440\u044c lock-\u0444\u0430\u0439\u043b \u0438 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u044b! <code>npm ci<\/code> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442! \u041f\u043e\u0431\u0435\u0434\u0430!<\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 <\/p>\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-315904","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/315904","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=315904"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/315904\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=315904"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=315904"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=315904"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}