рддреАрди рдлреНрд░рдВрдЯ-рдПрдВрдб рдЯреАрдореЗрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ
рдЖрдИрдПрд╕рдкреАрд╕рд┐рд╕реНрдЯрдо рдкрд░ рддреАрди рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реА рд╣реИрдВ: рд╡реЗрдм рд╕рд░реНрд╡рд░реЛрдВ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдЖрдИрдПрд╕рдкреАрдореИрдирдЧрд░, рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреЗрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реАрдПрдордПрдореНрдиреЗрдЬрд░, рдФрд░ рд╣реЙрд╕реНрдЯрд▓рд░реНрд╕ рдХреЗ рд╡реНрдпрд╡рд╕рд╛рдп рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓рдореИрдирдЧрд░ред рдЯреАрдореЗрдВ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ, рддрдВрдЧ рд╕рдордп рд╕реАрдорд╛ рдХреЗ рдореЛрдб рдореЗрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рд╕рдордп рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдШрдЯрдХреЛрдВ рдХреЛ рд▓реЗрддреЗ рд╣реИрдВред рдРрд╕реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреА рдЕрдкрдиреА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╣реЛрддреА рд╣реИ, рдЬреЛ рд╕рднреА рдЯреАрдореЛрдВ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реЛрддреА рд╣реИред рдпрд╣ рд▓реЗрдЦ рдЗрди рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реЛрдЧрд╛ред

рдХреИрд╕реЗ рдЖрдо рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рднрдВрдбрд╛рд░ рд╣реИрдВ
рд╣рдо рд░рд┐рдореЛрдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
GitLab рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдерд╛ рдХрд┐ рд╣рдо рдкрд░рд┐рдЪрд┐рдд рдХрд╛рдордХрд╛рдЬреА рд╡рд╛рддрд╛рд╡рд░рдг рдХреЛ рдмрдирд╛рдП рд░рдЦреЗрдВ рдФрд░ рдЙрдирдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ
npmjs.com рдирд┐рдЬреА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдиреЛрдб.рдЬреЗрдПрд╕ рдореЙрдбреНрдпреВрд▓ рди рдХреЗрд╡рд▓ рдПрдирдкреАрдПрдо рдХреЗ рд╕рд╛рде, рдмрд▓реНрдХрд┐
рдЕрдиреНрдп рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рднреА рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдЧрд┐рдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
рд╣рдо рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рд╕рдордп рдореЗрдВ, рд╢рд╛рдпрдж рдЖрд▓рд╕реА рд╕рд╛рдордиреЗ рд╡рд╛рд▓рд╛ рдЕрдкрдиреЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рд╕реНрд░реЛрдд рдХреЛрдб рдФрд░ рд╕рдВрдХрд▓рд┐рдд рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд▓рдВрдмреА рдЪрд░реНрдЪрд╛ рдХреЗ рдХрд╛рдВрдЯреЛрдВ рд╕реЗ рдЧреБрдЬрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдордиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрд╡рдзрд╛рд░рдгрд╛ рд╡рд┐рдХрд╕рд┐рдд рдХреАред рд╕реНрд░реЛрддреЛрдВ рдХреЗ рд▓рд┐рдП рдФрд░ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рдВрдХрд▓рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рджреВрд╕рд░рд╛ рднрдВрдбрд╛рд░ рдкрд╣рд▓реЗ рдХрд╛ рджрд░реНрдкрдг рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рдХрд┐рд╕реА рднреА рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рд╢рд╛рдЦрд╛ рдореЗрдВ рдЬрд╛рд░реА рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЙрд╕реА рдирд╛рдо рд╕реЗ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕ рд╢рд╛рдЦрд╛ рдореЗрдВ рд╡рд┐рдХрд╛рд╕ рд╣реЛ рд░рд╣рд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИ, рдЗрд╕реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╢рд╛рдЦрд╛ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реИред рдЬрд┐рд╕ рдЪреАрдЬ рдореЗрдВ рд╣рдо рд╡рд┐рдХрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╡рд╣ рдмрд╣реБрдд рд╣реА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдЗрд╕реЗ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рдЬрд╛рдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдПред
рд╕рд╛рде рд╣реА, рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд╢рди рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд▓реЗрдмрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реИред рд▓реЗрдмрд▓ рдХрд╛ рдирд╛рдо package.json рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдЧрд┐рдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╕рдордп, рд▓реЗрдмрд▓ рдХреЛ рдЬрд╛рд▓реА рдХреЗ рдмрд╛рдж рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
npm install git+ssh://[url ]
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЪрд┐рдВрддрд╛ рди рдХрд░реЗрдВ рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдХреБрдЫ рдмрджрд▓ рджреЗрдЧрд╛ред
рдЕрд╕реНрдерд┐рд░ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд▓реЗрдмрд▓ рднреА рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдБрдХрд┐, рдкреНрд░рддрд┐рдмрджреНрдз рдХрд╛ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реИрд╢ рдЙрдиреНрд╣реЗрдВ рд╕реНрд░реЛрдд рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╕реЗ рдкреНрд░рдХрд╛рд╢рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд▓реЗрдмрд▓ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
1.0.0_e5541dc1
рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЖрдкрдХреЛ рд▓реЗрдмрд▓ рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЙрдиреНрд╣реЗрдВ рд╕реНрд░реЛрдд рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд╕рд╛рде рд╕рдВрдмрджреНрдз рдХрд░рддрд╛ рд╣реИред
рдЪреВрдВрдХрд┐ рд╣рдо рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕реНрдерд┐рд░ рдФрд░ рдЕрд╕реНрдерд┐рд░ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рдЕрд▓рдЧ рдХрд░рддреЗ рд╣реИрдВ: рдпрджрд┐ рдкреНрд░рдХрд╛рд╢рди рдорд╛рд╕реНрдЯрд░ рдпрд╛ рд╡рд┐рдХрд╛рд╕ рд╢рд╛рдЦрд╛ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рдВрд╕реНрдХрд░рдг рд╕реНрдерд┐рд░ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдирд╣реАрдВред
рдХреИрд╕реЗ рдЖрдо рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?
рдпрджрд┐ рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рддреЛ рд╣рдорд╛рд░реЗ рд╕рднреА рд╕рдордЭреМрддреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдПрдВрдЧреЗред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдкреНрд░рдХрд╛рд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░реЗрдВред рдиреАрдЪреЗ рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдХрд╕реНрдЯрдо рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛ред
рдпрд╣ рдЙрдкрдпреЛрдЧрд┐рддрд╛,
рдХрдардкреБрддрд▓реА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдбреЙрдХрдЯрд░ рдХрдВрдЯреЗрдирд░реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдХреНрд░реЛрдорд┐рдпрдо рдмреНрд░рд╛рдЙрдЬрд╝рд░ рддреИрдпрд╛рд░ рдХрд░рддреА рд╣реИ рдФрд░
рдореЛрдЪрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддреА рд╣реИред рд╕рднреА рдЯреАрдореЛрдВ рдХреЗ рдкреНрд░рддрд┐рднрд╛рдЧреА рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдХреБрдЫ рддреЛрдбрд╝рдиреЗ рдХреЗ рдбрд░ рдХреЗ рдмрд┐рдирд╛ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдирд┐рдореНрди рдХрдорд╛рдВрдб рдкрд░реАрдХреНрд╖рдг рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ package.json рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦрд╛ рд╣реИ:
"publish:git": "ts-node ./scripts/publish.ts"
рд╡рд╣ рдкрд╛рд╕ рдХреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рддрд╛ рд╣реИ:
рдкреВрд░реНрдг рдкреНрд░рдХрд╛рд╢рд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб import { spawnSync } from 'child_process'; import { mkdirSync, existsSync } from 'fs'; import { join } from 'path'; import chalk from 'chalk'; /** * */ /** * * @param cwd - * @param stdio - / */ const getSpawnOptions = (cwd = process.cwd(), stdio = 'inherit') => ({ cwd, shell: true, stdio, }); /* */ const rootDir = join(__dirname, '../'); /* */ const isDiff = !!spawnSync('git', ['diff'], getSpawnOptions(rootDir, 'pipe')).stdout.toString().trim(); if (isDiff) { console.log(chalk.red('There are uncommitted changes')); } else { /* */ const build = spawnSync('npm', ['run', 'build'], getSpawnOptions(rootDir)); /* */ if (build.status === 0) { /* */ const tempDir = join(rootDir, 'temp'); if (existsSync(tempDir)) { spawnSync('rm', ['-rf', 'temp'], getSpawnOptions(rootDir)); } mkdirSync(tempDir); /* package.json */ const { name, version, repository } = require(join(rootDir, 'package.json')); const originUrl = repository.url.replace(`${name}-source`, name); spawnSync('git', ['init'], getSpawnOptions(tempDir)); spawnSync('git', ['remote', 'add', 'origin', originUrl], getSpawnOptions(tempDir)); /* */ const branch = spawnSync( 'git', ['symbolic-ref', '--short', 'HEAD'], getSpawnOptions(rootDir, 'pipe') ).stdout.toString().trim(); /* */ const buildBranch = branch === 'develop' ? 'master' : branch; /* , */ const shortSHA = spawnSync( 'git', ['rev-parse', '--short', 'HEAD'], getSpawnOptions(rootDir, 'pipe') ).stdout.toString().trim(); /* */ const tag = buildBranch === 'master' ? version : `${version}_${shortSHA}`; /* */ const isTagExists = !!spawnSync( 'git', ['ls-remote', 'origin', `refs/tags/${tag}`], getSpawnOptions(tempDir, 'pipe') ).stdout.toString().trim(); if (isTagExists) { console.log(chalk.red(`Tag ${tag} already exists`)); } else { /* */ const isBranchExits = !!spawnSync( 'git', ['ls-remote', '--exit-code', 'origin', buildBranch], getSpawnOptions(tempDir, 'pipe') ).stdout.toString().trim(); if (isBranchExits) { /* */ spawnSync('git', ['fetch', 'origin', buildBranch], getSpawnOptions(tempDir)); spawnSync('git', ['checkout', buildBranch], getSpawnOptions(tempDir)); } else { /* master */ spawnSync('git', ['fetch', 'origin', 'master'], getSpawnOptions(tempDir)); spawnSync('git', ['checkout', 'master'], getSpawnOptions(tempDir)); /* */ spawnSync('git', ['checkout', '-b', buildBranch], getSpawnOptions(tempDir)); /* */ spawnSync('git', ['commit', '--allow-empty', '-m', '"Initial commit"'], getSpawnOptions(tempDir)); } /* */ spawnSync( 'rm', ['-rf', 'lib', 'package.json', 'package-lock.json', 'README.md'], getSpawnOptions(tempDir) ); /* */ spawnSync('cp', ['-r', 'lib', 'temp/lib'], getSpawnOptions(rootDir)); spawnSync('cp', ['package.json', 'temp/package.json'], getSpawnOptions(rootDir)); spawnSync('cp', ['package-lock.json', 'temp/package-lock.json'], getSpawnOptions(rootDir)); spawnSync('cp', ['README.md', 'temp/README.md'], getSpawnOptions(rootDir)); /* */ spawnSync('git', ['add', '--all'], getSpawnOptions(tempDir)); /* */ const lastCommitMessage = spawnSync( 'git', ['log', '--oneline', '-1'], getSpawnOptions(rootDir, 'pipe') ).stdout.toString().trim(); /* */ const message = buildBranch === 'master' ? version : lastCommitMessage; /* */ spawnSync('git', ['commit', '-m', `"${message}"`], getSpawnOptions(tempDir)); /* */ spawnSync('git', ['tag', tag], getSpawnOptions(tempDir)); /* */ spawnSync('git', ['push', 'origin', buildBranch], getSpawnOptions(tempDir)); spawnSync('git', ['push', '--tags'], getSpawnOptions(tempDir)); console.log(chalk.green('Published successfully!')); } /* */ spawnSync('rm', ['-rf', 'temp'], getSpawnOptions(rootDir)); } else { console.log(chalk.red(`Build was exited exited with code ${build.status}`)); } } console.log(''); // space
рдмрджрд▓реЗ рдореЗрдВ, рдпрд╣ рдХреЛрдб Node.js
child_process рдореЙрдбреНрдпреВрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдпрд╣рд╛рдБ рдЙрдирдХреЗ рдХрд╛рдо рдХреЗ рдореБрдЦреНрдп рдЪрд░рдг рд╣реИрдВ:
1. рдЕрдирдзрд┐рдХреГрдд рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░реЗрдВ const isDiff = !!spawnSync('git', ['diff'], getSpawnOptions(rootDir, 'pipe')).stdout.toString().trim();
рдпрд╣рд╛рдБ рд╣рдо
git diff рдХрдорд╛рдВрдб рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреА рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдкреНрд░рдХрд╛рд╢рди рдореЗрдВ рд╕реНрд░реЛрдд рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рд╣реИрдВ рддреЛ рдпрд╣ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдХрдорд┐рдЯ рдХреЗ рд╕рд╛рде рдЕрд╕реНрдерд┐рд░ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдХрдиреЗрдХреНрд╢рди рдХреЛ рддреЛрдбрд╝ рджреЗрдЧрд╛ред
2. рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╡рд┐рдзрд╛рдирд╕рднрд╛ const build = spawnSync('npm', ['run', 'build'], getSpawnOptions(rootDir))
рдмрд┐рд▓реНрдб рд╕реНрдерд┐рд░рд╛рдВрдХ рд╕реЗ рдмрд┐рд▓реНрдб рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддрд╛ рд╣реИред рдпрджрд┐ рд╕рдм рдХреБрдЫ рдареАрдХ рд░рд╣рд╛, рддреЛ рд╕реНрдерд┐рддрд┐ рдкреИрд░рд╛рдореАрдЯрд░ 0. рд╣реЛрдЧрд╛ рдЕрдиреНрдпрдерд╛, рдХреБрдЫ рднреА рдкреНрд░рдХрд╛рд╢рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
3. рд╕рдВрдХрд▓рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреА рддреИрдирд╛рддреАрд╕рдВрдкреВрд░реНрдг рдкреНрд░рдХрд╛рд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдЧрд┐рдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдЖрд░рдВрдн рдХрд░рддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рджреВрд░рд╕реНрде рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рддреА рд╣реИред
const tempDir = join(rootDir, 'temp'); if (existsSync(tempDir)) { spawnSync('rm', ['-rf', 'temp'], getSpawnOptions(rootDir)); } mkdirSync(tempDir); const { name, version, repository } = require(join(rootDir, 'package.json')); const originUrl = repository.url.replace(`${name}-source`, name); spawnSync('git', ['init'], getSpawnOptions(tempDir)); spawnSync('git', ['remote', 'add', 'origin', originUrl], getSpawnOptions(tempDir));
рдпрд╣
git init рдФрд░
git рд░рд┐рдореЛрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдорд╛рдирдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИред
4. рд▓реЗрдмрд▓ рдирд╛рдо рдкреАрдврд╝реАрд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдЙрд╕ рд╢рд╛рдЦрд╛ рдХрд╛ рдирд╛рдо рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рд╣рдо
рдЧрд┐рдЯ рдкреНрд░рддреАрдХрд╛рддреНрдордХ-рд░реЗрдл рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдФрд░ рдЙрд╕ рд╢рд╛рдЦрд╛ рдХрд╛ рдирд╛рдо рд╕реЗрдЯ рдХрд░реЗрдВ рдЬрд┐рд╕рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдЕрдкрд▓реЛрдб рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ (рд╡рд┐рдзрд╛рдирд╕рднрд╛ рднрдВрдбрд╛рд░ рдореЗрдВ рдХреЛрдИ рд╡рд┐рдХрд╕рд┐рдд рд╢рд╛рдЦрд╛ рдирд╣реАрдВ рд╣реИ)ред
const branch = spawnSync( 'git', ['symbolic-ref', '--short', 'HEAD'], getSpawnOptions(rootDir, 'pipe') ).stdout.toString().trim(); const buildBranch = branch === 'develop' ? 'master' : branch;
Git Rev-parse рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рдЙрд╕ рд╢рд╛рдЦрд╛ рдореЗрдВ рдЕрдВрддрд┐рдо рдХрдорд┐рдЯ рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реИрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рд╣реИрдВред рдЕрд╕реНрдерд┐рд░ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓реЗрдмрд▓ рдирд╛рдо рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред
<source lang="typescript"> const shortSHA = spawnSync( 'git', ['rev-parse', '--short', 'HEAD'], getSpawnOptions(rootDir, 'pipe') ).stdout.toString().trim();
рдЦреИрд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓реЗрдмрд▓ рдХрд╛ рдирд╛рдо рдмрдирд╛ред
const tag = buildBranch === 'master' ? version : `${version}_${shortSHA}`;
5. рджреВрд░рд╕реНрде рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдареАрдХ рдЙрд╕реА рдЯреИрдЧ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░рдирд╛ /* */ const isTagExists = !!spawnSync( 'git', ['ls-remote', 'origin', `refs/tags/${tag}`], getSpawnOptions(tempDir, 'pipe') ).stdout.toString().trim();
рдпрджрд┐ рдПрдХ рд╕рдорд╛рди рд▓реЗрдмрд▓ рдкрд╣рд▓реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ
рдЧрд┐рдЯ ls- рд░рд┐рдореЛрдЯ рдХрдорд╛рдВрдб рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЦрд╛рд▓реА рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдПрдХ рд╣реА рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
6. рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЙрдкрдпреБрдХреНрдд рд╢рд╛рдЦрд╛ рдмрдирд╛рдирд╛рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдерд╛, рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рд╕рдВрдХрд▓рд┐рдд рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рднрдВрдбрд╛рд░ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рд╕рд╛рде рднрдВрдбрд╛рд░ рдХрд╛ рджрд░реНрдкрдг рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдкреНрд░рдХрд╛рд╢рди рдорд╛рд╕реНрдЯрд░ рдпрд╛ рд╡рд┐рдХрд╕рд┐рдд рд╢рд╛рдЦрд╛ рд╕реЗ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдЕрд╕реЗрдВрдмрд▓реА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рд╢рд╛рдЦрд╛ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред рдареАрдХ рд╣реИ, рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдЗрд╕рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ
/* */ const isBranchExits = !!spawnSync( 'git', ['ls-remote', '--exit-code', 'origin', buildBranch], getSpawnOptions(tempDir, 'pipe') ).stdout.toString().trim(); if (isBranchExits) { /* */ spawnSync('git', ['fetch', 'origin', buildBranch], getSpawnOptions(tempDir)); spawnSync('git', ['checkout', buildBranch], getSpawnOptions(tempDir)); } else { /* master */ spawnSync('git', ['fetch', 'origin', 'master'], getSpawnOptions(tempDir)); spawnSync('git', ['checkout', 'master'], getSpawnOptions(tempDir)); /* */ spawnSync('git', ['checkout', '-b', buildBranch], getSpawnOptions(tempDir)); /* */ spawnSync('git', ['commit', '--allow-empty', '-m', '"Initial commit"'], getSpawnOptions(tempDir)); }
рдпрджрд┐ рд╢рд╛рдЦрд╛ рдкрд╣рд▓реЗ рдЕрдиреБрдкрд╕реНрдерд┐рдд рдереА, рддреЛ рд╣рдо рдЦрд╛рд▓реА
-рдЦрд╛рд▓реА рдЭрдВрдбреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдХрдорд┐рдЯ рдХреЗ рд╕рд╛рде рдЖрд░рдВрдн рдХрд░рддреЗ рд╣реИрдВред
7. рдлрд╛рдЗрд▓ рддреИрдпрд╛рд░ рдХрд░рдирд╛рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рд╡рд╣ рд╕рдм рдХреБрдЫ рд╣рдЯрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдЬреЛ рддреИрдирд╛рдд рднрдВрдбрд╛рд░ рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЖрдЦрд┐рд░рдХрд╛рд░, рдпрджрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╢рд╛рдЦрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдореЗрдВ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдкрд┐рдЫрд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реЛрддрд╛ рд╣реИред
spawnSync( 'rm', ['-rf', 'lib', 'package.json', 'package-lock.json', 'README.md'], getSpawnOptions(tempDir) );
рдЕрдЧрд▓рд╛, рд╣рдо рдкреНрд░рдХрд╛рд╢рди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЕрджреНрдпрддрди рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдЗрдВрдбреЗрдХреНрд╕ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
/* */ spawnSync('cp', ['-r', 'lib', 'temp/lib'], getSpawnOptions(rootDir)); spawnSync('cp', ['package.json', 'temp/package.json'], getSpawnOptions(rootDir)); spawnSync('cp', ['package-lock.json', 'temp/package-lock.json'], getSpawnOptions(rootDir)); spawnSync('cp', ['README.md', 'temp/README.md'], getSpawnOptions(rootDir)); /* */ spawnSync('git', ['add', '--all'], getSpawnOptions(tempDir));
рдЗрд╕ рддрд░рд╣ рдХреЗ рд╣реЗрд░рдлреЗрд░ рдХреЗ рдмрд╛рдж, рдЧрд┐рдЯ рдлрд╛рдЗрд▓реЛрдВ рдХреА рд▓рд╛рдЗрдиреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд╣рдЪрд╛рди рд▓реЗрдВрдЧреЗред рдЗрд╕ рддрд░рд╣ рд╣рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рднреА рд▓рдЧрд╛рддрд╛рд░ рдмрджрд▓рд╛рд╡ рдХрд╛ рдЗрддрд┐рд╣рд╛рд╕ рдорд┐рд▓рддрд╛ рд╣реИред
8. рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдирд╛ рдФрд░ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛рдЕрд╕реЗрдВрдмрд▓реА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдПрдХ рдкреНрд░рддрд┐рдмрджреНрдз рд╕рдВрджреЗрд╢ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рд╕реНрдерд┐рд░ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд▓реЗрдмрд▓ рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдЕрд╕реНрдерд┐рд░ рдХреЗ рд▓рд┐рдП - рд╕реНрд░реЛрдд рднрдВрдбрд╛рд░ рд╕реЗ рдПрдХ рдкреНрд░рддрд┐рдмрджреНрдз рд╕рдВрджреЗрд╢ред рдЗрд╕ рддрд░рд╣, рджрд░реНрдкрдг рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд╣рдорд╛рд░реЗ рд╡рд┐рдЪрд╛рд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред
const lastCommitMessage = spawnSync( 'git', ['log', '--oneline', '-1'], getSpawnOptions(rootDir, 'pipe') ).stdout.toString().trim(); const message = buildBranch === 'master' ? version : lastCommitMessage; spawnSync('git', ['commit', '-m', `"${message}"`], getSpawnOptions(tempDir)); spawnSync('git', ['tag', tag], getSpawnOptions(tempDir)); spawnSync('git', ['push', 'origin', buildBranch], getSpawnOptions(tempDir)); spawnSync('git', ['push', '--tags'], getSpawnOptions(tempDir));
9. рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рд╣рдЯрд╛рдирд╛ spawnSync('rm', ['-rf', 'temp'], getSpawnOptions(rootDir))
рдЖрдо рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХреА рд╕рдореАрдХреНрд╖рд╛
рдЖрдо рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕рдореАрдХреНрд╖рд╛ рдмрди рдЬрд╛рддреА рд╣реИред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рд╡рд┐рдХрд╕рд┐рдд рддрдХрдиреАрдХ рдЖрдкрдХреЛ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреГрдердХ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдХреЛрдИ рднреА рдПрдХ рд╣реА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рджрд░реНрдЬрдиреЛрдВ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рдПрдХ рд╣реА рд╡рд┐рдХрд╛рд╕ рдкрде рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЯреАрдореЛрдВ рдХреЗ рдмреАрдЪ рдЗрд╕ рдкрд░ рд╕рд╣рдорддрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред
рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрд╕рдВрднрд╡ рд╣реЛ, рд╕рднреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЖрдо рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЕрджреНрдпрддрди рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХреА рдЬрд╛рддреА рд╣реИред рдпрд╣ рдПрдХ рдЬрдЯрд┐рд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЯреАрдо рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕реНрдкреНрд░рд┐рдВрдЯ рдкрд░ рд░рд╣рддреА рд╣реИ рдФрд░ рдПрдХ рдЕрд▓рдЧ рдХрд╛рд░реНрдпрднрд╛рд░ рд╣реИред рдХрднреА-рдХрднреА рдПрдХ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдореЗрдВ рджреЗрд░реА рд╣реЛ рд╕рдХрддреА рд╣реИред
рдпрд╣рд╛рдВ рдЖрдк рдХреЗрд╡рд▓ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рджреЗрд░реА рди рдХрд░рдиреЗ рдФрд░ рди рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред