рд╣рдо рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреЗред рд╣рдорд╛рд░рд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЕрдм рдЪреЙрдХрд▓реЗрдЯреА рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ, рдЬреЛ рд╡рд┐рдВрдбреЛрдЬрд╝ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреИрдХреЗрдЬ рдореИрдиреЗрдЬрд░ рд╣реИред рд╣рдорд╛рд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХреНрд▓рд╛рдЙрдб рд╕реЗрд╡рд╛рдУрдВ рдореЗрдВ рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреА рддреИрдирд╛рддреА рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛ рд╣реЛрдЧреАред рдЕрдзрд┐рдХ рджреВрд░ рди рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдЙрд╕реА рдЪреЙрдХрд▓реЗрдЯреА рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВред Azure DevOps рдПрдХ CI рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░реЗрдЧрд╛ред
рдХреНрд▓рд╛рдЙрдб рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг рдХреЗ рд╡рд┐рд╖рдп рдкрд░ рд╣рдорд╛рд░реЗ рдЕрдиреНрдп рд▓реЗрдЦреЛрдВ рдХреА рд╕реВрдЪреА рдпрд╣рд╛рдВ рджреА рдЧрдИ рд╣реИ:
рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдмрд╛рджрд▓реЛрдВ рдкрд░ рдЬрд╛рддрд╛ рд╣реИ: Azure DevOps рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдмрд╛рджрд▓реЛрдВ рдкрд░ рдЬрд╛рддрд╛ рд╣реИ: рдЯреНрд░реИрд╡рд┐рд╕ рд╕реАрдЖрдИ рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдмрд╛рджрд▓реЛрдВ рдкрд░ рдЬрд╛рддрд╛ рд╣реИ: рд╕рд░реНрдХрд▓рд╕реАрдЖрдИ рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдмрд╛рджрд▓реЛрдВ рдкрд░ рдЬрд╛рддрд╛ рд╣реИ: рдЧрд┐рдЯрд▓реИрдм рд╕реАрдЖрдИ/рд╕реАрдбреА
рдореИрдВ рдЖрдкрдХреЛ Azure DevOps рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рд▓реЗрдЦ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдирдХрд▓ рди рд╣реЛред
рддреЛ, рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдирд╛рдпрдХ:
рдЪреЙрдХрд▓реЗрдЯреА рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рдЖрдк рдпрд╣рд╛рдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкреИрдХреЗрдЬ рдореИрдиреЗрдЬрд░ рдХреЛ рдХреИрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП
рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХрд╛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдЖрджреЗрд╢:
choco install pvs-studio
рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдкреИрдХреЗрдЬ рдХрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрд╕реНрдХрд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдЖрджреЗрд╢:
choco install pvs-studio --version=7.05.35617.2075
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдХреЗрд╡рд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХрд╛ рдХреЛрд░, рдХреЛрд░ рдШрдЯрдХ рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрддрд╛ рд╣реИред рдЕрдиреНрдп рд╕рднреА рдлрд╝реНрд▓реИрдЧ (рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди, JavaCore, IDEA, MSVS2010, MSVS2012, MSVS2013, MSVS2015, MSVS2017, MSVS2019) рдХреЛ --package-parameters рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдХрдорд╛рдВрдб рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЬреЛ рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ 2019 рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧрдЗрди рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдЧрд╛:
choco install pvs-studio --package-parameters="'/MSVS2019'"
рдЖрдЗрдП рдЕрдм Azure DevOps рдХреЗ рдЕрдВрддрд░реНрдЧрдд рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред
рд╕рдорд╛рдпреЛрдЬрди
рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛ рджреВрдВ рдХрд┐ рдЦрд╛рддрд╛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ, рдмрд┐рд▓реНрдб рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдмрдирд╛рдиреЗ рдФрд░ GitHub рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд╕реНрдерд┐рдд рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдЦрд╛рддреЗ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдЬреИрд╕реЗ рдореБрджреНрджреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдЕрдиреБрднрд╛рдЧ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рдПрдХ рд▓реЙрдиреНрдЪ рдЯреНрд░рд┐рдЧрд░ рд╕реЗрдЯ рдХрд░реЗрдВ, рдЬреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рдмрджрд▓рд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ рдорд╛рд╕реНрдЯрд░ рд╢рд╛рдЦрд╛:
trigger:
- master
рдЖрдЧреЗ рд╣рдореЗрдВ рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЕрднреА рдХреЗ рд▓рд┐рдП рдпрд╣ рд╡рд┐рдВрдбреЛрдЬ рд╕рд░реНрд╡рд░ 2019 рдФрд░ рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ 2019 рдХреЗ рд╕рд╛рде рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ рджреНрд╡рд╛рд░рд╛ рд╣реЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдПрдЬреЗрдВрдЯ рд╣реЛрдЧрд╛:
pool:
vmImage: 'windows-latest'
рдЖрдЗрдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ (рдмреНрд▓реЙрдХ) рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ рдХрджрдо). рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдЖрдк рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдореЗрдВ рдордирдорд╛рдирд╛ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдЗрдВрд╕реНрдЯреЙрд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдореИрдВрдиреЗ рдбреЙрдХрд░ рдХрдВрдЯреЗрдирд░ рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ред рд╣рдо Azure DevOps рдХреЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдЪреЙрдХрд▓реЗрдЯреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдЪрд▓рддреЗ рд╣реИрдВ
рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рдпрд╣ рдЪреБрдирдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдо рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╣рд╛рдВ рдЬреЛрдбрд╝реЗрдВрдЧреЗ рдФрд░ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ.
рд╕рдлрд▓ рдЗрдВрд╕реНрдЯрд╛рд▓реЗрд╢рди рдХреЗ рдмрд╛рдж рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рд╕рдВрдЧрдарди рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝реЗрдВ:
рдЕрдм рдЖрдк рд╡рд┐рдВрдбреЛ рдореЗрдВ рдЪреЙрдХрд▓реЗрдЯреА рдХрд╛рд░реНрдп рдХрд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд╛рд░реНрдп рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп рдиреАрд▓рд╛-рдкрд╛рдЗрдкрд▓рд╛рдЗрди.yml:
рдЪреЙрдХрд▓реЗрдЯреА рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ рдлрд╝реАрд▓реНрдб рдХреА рд╕реВрдЪреА рджреЗрдЦреЗрдВ:
рдпрд╣рд╛рдВ рд╣рдореЗрдВ рд╕реЗрд▓реЗрдХреНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рд╕реНрдерд╛рдкрд┐рдд рдЯреАрдореЛрдВ рдХреЗ рд╕рд╛рде рдореИрджрд╛рди рдореЗрдВ. рдореЗрдВ рдиреБрд╕реНрдкреЗрдХ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдЖрд╡рд╢реНрдпрдХ рдкреИрдХреЗрдЬ рдХрд╛ рдирд╛рдо рдмрддрд╛рдПрдВ - рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛред рдпрджрд┐ рдЖрдк рд╕рдВрд╕реНрдХрд░рдг рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдирд╡реАрдирддрдо рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рдЙрдкрдпреБрдХреНрдд рд╣реИред рдЪрд▓рд┐рдП рдмрдЯрди рджрдмрд╛рддреЗ рд╣реИрдВ рдЬреЛрдбрд╝рдирд╛ рдФрд░ рд╣рдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЗрдирд░реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХрд╛рд░реНрдп рджреЗрдЦреЗрдВрдЧреЗред
steps:
- task: ChocolateyCommand@0
inputs:
command: 'install'
installPackageId: 'pvs-studio'
рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдЗрдП рдЕрдкрдиреА рдлрд╝рд╛рдЗрд▓ рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ:
- task: CmdLine@2
inputs:
script:
рдЕрдм рд╣рдореЗрдВ рдПрдирд╛рд▓рд╛рдЗрдЬрд░ рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдпрд╣рд╛рдБ рдкреАрд╡реАрдПрд╕рдирд╛рдо ╨╕ рдкреА.рд╡реА.рдПрд╕.рдХреЗ.рдЖрдИ - рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреЗ рдирд╛рдо рдЬрд┐рдирдХреЗ рдорд╛рди рд╣рдо рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред рд╡реЗ рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рд▓реЙрдЧрд┐рди рдФрд░ рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреБрдВрдЬреА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗред рдЙрдирдХреЗ рдорд╛рди рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореЗрдиреВ рдЦреЛрд▓реЗрдВ рд╡реЗрд░рд┐рдПрдмрд▓->рдирдпрд╛ рд╡реЗрд░рд┐рдПрдмрд▓. рдЖрдЗрдП рд╡реЗрд░рд┐рдПрдмрд▓ рдмрдирд╛рдПрдВ рдкреАрд╡реАрдПрд╕рдирд╛рдо рд▓реЙрдЧрд┐рди рдХреЗ рд▓рд┐рдП рдФрд░ рдкреА.рд╡реА.рдПрд╕.рдХреЗ.рдЖрдИ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреБрдВрдЬреА рдХреЗ рд▓рд┐рдП. рдмреЙрдХреНрд╕ рдХреЛ рдЪреЗрдХ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ рдЗрд╕ рдорд╛рди рдХреЛ рдЧреБрдкреНрдд рд░рдЦреЗрдВ рдХреЗ рд▓рд┐рдП рдкреА.рд╡реА.рдПрд╕.рдХреЗ.рдЖрдИ. рдХрдорд╛рдВрдб рдХреЛрдб:
╤Бall "C:Program Files (x86)PVS-StudioPVS-Studio_Cmd.exe" credentials
тАУu $(PVSNAME) тАУn $(PVSKEY)
рдЖрдЗрдП рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд╕реНрдерд┐рдд рдмреИрдЯ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ:
╤Бall build.bat
рдЖрдЗрдП рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдВ рдЬрд╣рд╛рдВ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓реЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рдЬрд╛рдПрдВрдЧреА:
╤Бall mkdir PVSTestResults
рдЖрдЗрдП рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╢реБрд░реВ рдХрд░реЗрдВ:
╤Бall "C:Program Files (x86)PVS-StudioPVS-Studio_Cmd.exe"
тАУt .srcchocolatey.sln тАУo .PVSTestResultsChoco.plog
рд╣рдо Plog╨бconverter рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреА рд░рд┐рдкреЛрд░реНрдЯ рдХреЛ html рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
╤Бall "C:Program Files (x86)PVS-StudioPlogConverter.exe"
тАУt html тАУo PVSTestResults .PVSTestResultsChoco.plog
рдЕрдм рдЖрдкрдХреЛ рдПрдХ рдХрд╛рд░реНрдп рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рдЖрдк рд░рд┐рдкреЛрд░реНрдЯ рдЕрдкрд▓реЛрдб рдХрд░ рд╕рдХреЗрдВред
- task: PublishBuildArtifacts@1
inputs:
pathToPublish: PVSTestResults
artifactName: PVSTestResults
condition: always()
рд╕рдВрдкреВрд░реНрдг рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рджрд┐рдЦрддреА рд╣реИ:
trigger:
- master
pool:
vmImage: 'windows-latest'
steps:
- task: ChocolateyCommand@0
inputs:
command: 'install'
installPackageId: 'pvs-studio'
- task: CmdLine@2
inputs:
script: |
call "C:Program Files (x86)PVS-StudioPVS-Studio_Cmd.exe"
credentials тАУu $(PVSNAME) тАУn $(PVSKEY)
call build.bat
call mkdir PVSTestResults
call "C:Program Files (x86)PVS-StudioPVS-Studio_Cmd.exe"
тАУt .srcchocolatey.sln тАУo .PVSTestResultsChoco.plog
call "C:Program Files (x86)PVS-StudioPlogConverter.exe"
тАУt html тАУo .PVSTestResults .PVSTestResultsChoco.plog
- task: PublishBuildArtifacts@1
inputs:
pathToPublish: PVSTestResults
artifactName: PVSTestResults
condition: always()
рдЖрдЗрдП рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рд╕рд╣реЗрдЬреЗрдВ->рд╕рд╣реЗрдЬреЗрдВ->рдЪрд▓рд╛рдПрдБ рдХрд╛рд░реНрдп рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП. рдЖрдЗрдП рдЯрд╛рд╕реНрдХ рдЯреИрдм рдкрд░ рдЬрд╛рдХрд░ рд░рд┐рдкреЛрд░реНрдЯ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред
рдЪреЙрдХрд▓реЗрдЯреА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ C# рдХреЛрдб рдХреА рдХреЗрд╡рд▓ 37615 рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╣реИрдВред рдЖрдЗрдП рдкрд╛рдИ рдЧрдИ рдХреБрдЫ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдкрд░ рдирдЬрд░ рдбрд╛рд▓реЗрдВред
рдкрд░реАрдХреНрд╖рд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдо
рдЪреЗрддрд╛рд╡рдиреА N1
рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЪреЗрддрд╛рд╡рдиреА:
public abstract class CrytpoHashProviderSpecsBase : TinySpec
{
....
protected CryptoHashProvider Provider;
....
public override void Context()
{
Provider = Provider = new CryptoHashProvider(FileSystem.Object);
}
}
рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд▓рд┐рдП рдЪрд░ рдХреЗ рдПрдХ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛, рдЬрд┐рд╕рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдЪрд░ рдХреЗ рд╕реНрдерд╛рди рдкрд░ рдХреЛрдИ рдЕрдиреНрдп рдЪрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЦреИрд░, рдпрд╛ рдпрд╣ рдПрдХ рдЯрд╛рдЗрдкреЛ рд╣реИ, рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЪреЗрддрд╛рд╡рдиреА N2
рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЪреЗрддрд╛рд╡рдиреА:
public static PlatformType get_platform()
{
switch (Environment.OSVersion.Platform)
{
case PlatformID.MacOSX:
{
....
}
case PlatformID.Unix:
if(file_system.directory_exists("/Applications")
& file_system.directory_exists("/System")
& file_system.directory_exists("/Users")
& file_system.directory_exists("/Volumes"))
{
return PlatformType.Mac;
}
else
return PlatformType.Linux;
default:
return PlatformType.Windows;
}
}
рдСрдкрд░реЗрдЯрд░ рдЕрдВрддрд░ & рдСрдкрд░реЗрдЯрд░ рд╕реЗ && рдХреНрдпрд╛ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдмрд╛рдпрд╛рдВ рднрд╛рдЧ рд╣реИ рдЕрд╕рддреНрдп, рдлрд┐рд░ рднреА рджрд╛рдИрдВ рдУрд░ рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рдПрдЧреА, рдЬреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИ system.directory_рдореМрдЬреВрдж рд╣реИ.
рд╡рд┐рдЪрд╛рд░рд╛рдзреАрди рдЕрдВрд╢ рдореЗрдВ, рдпрд╣ рдПрдХ рдЫреЛрдЯреА рд╕реА рдЦрд╛рдореА рд╣реИред рд╣рд╛рдБ, рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ & рдСрдкрд░реЗрдЯрд░ рдХреЛ && рдСрдкрд░реЗрдЯрд░ рд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдХреЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдпрд╣ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ, & рдФрд░ && рдХреЗ рдмреАрдЪ рднреНрд░рдо рдЧрдВрднреАрд░ рд╕рдорд╕реНрдпрд╛рдПрдБ рдкреИрджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рджрд╛рд╣рд┐рдиреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдЧрд▓рдд/рдЕрдорд╛рдиреНрдп рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рддреНрд░реБрдЯрд┐ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ,
if ((k < nct) & (s[k] != 0.0))
рднрд▓реЗ рд╣реА рд╕реВрдЪрдХрд╛рдВрдХ k рдЧрд╝рд▓рдд рд╣реИ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рд╕рд░рдгреА рддрддреНрд╡ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ IndexOutOfRangeException.
рдЪреЗрддрд╛рд╡рдирд┐рдпрд╛рдБ N3, N4
рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЪреЗрддрд╛рд╡рдиреА:
рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЪреЗрддрд╛рд╡рдиреА:
public static string
prompt_for_confirmation(.... bool shortPrompt = false, ....)
{
....
if (shortPrompt)
{
var choicePrompt = choice.is_equal_to(defaultChoice) //1
?
shortPrompt //2
?
"[[{0}]{1}]".format_with(choice.Substring(0, 1).ToUpperInvariant(), //3
choice.Substring(1,choice.Length - 1))
:
"[{0}]".format_with(choice.ToUpperInvariant()) //0
:
shortPrompt //4
?
"[{0}]{1}".format_with(choice.Substring(0,1).ToUpperInvariant(), //5
choice.Substring(1,choice.Length - 1))
:
choice; //0
....
}
....
}
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЯрд░реНрдирд░реА рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдкреАрдЫреЗ рдПрдХ рдЕрдЬреАрдм рддрд░реНрдХ рд╣реИред рдЖрдЗрдП рдХрд░реАрдм рд╕реЗ рджреЗрдЦреЗрдВ: рдпрджрд┐ рд╡рд╣ рд╢рд░реНрдд рдкреВрд░реА рд╣реЛ рдЬрд╛рддреА рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рд╕рдВрдЦреНрдпрд╛ 1 рд╕реЗ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рд╣рдо рд╢рд░реНрдд 2 рдкрд░ рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗ, рдЬреЛ рд╣рдореЗрд╢рд╛ рд╣реЛрддреА рд╣реИ <strong>рдЙрджреНрджреЗрд╢реНрдп</strong>, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдкрдВрдХреНрддрд┐ 3 рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХреА рдЬрд╛рдПрдЧреАред рдпрджрд┐ рд╢рд░реНрдд 1 рдЧрд▓рдд рдирд┐рдХрд▓рддреА рд╣реИ, рддреЛ рд╣рдо рд╕рдВрдЦреНрдпрд╛ 4 рд╕реЗ рдЪрд┐рд╣реНрдирд┐рдд рд░реЗрдЦрд╛ рдкрд░ рдЬрд╛рдПрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рд╢рд░реНрдд рднреА рд╣рдореЗрд╢рд╛ рд╣реЛрддреА рд╣реИ <strong>рдЙрджреНрджреЗрд╢реНрдп</strong>, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдкрдВрдХреНрддрд┐ 5 рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХреА рдЬрд╛рдПрдЧреАред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЯрд┐рдкреНрдкрдгреА 0 рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рд╢рд░реНрддреЗрдВ рдХрднреА рдкреВрд░реА рдирд╣реАрдВ рд╣реЛрдВрдЧреА, рдЬреЛ рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рджреНрд╡рд╛рд░рд╛ рдЕрдкреЗрдХреНрд╖рд┐рдд рдСрдкрд░реЗрд╢рди рдХрд╛ рдмрд┐рд▓реНрдХреБрд▓ рддрд░реНрдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЪреЗрддрд╛рд╡рдиреА N5
рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЪреЗрддрд╛рд╡рдиреА:
private static string GetArgumentName (...., string description)
{
string[] nameStart;
if (maxIndex == 1)
{
nameStart = new string[]{"{0:", "{"};
}
else
{
nameStart = new string[]{"{" + index + ":"};
}
for (int i = 0; i < nameStart.Length; ++i)
{
int start, j = 0;
do
{
start = description.IndexOf (nameStart [i], j);
}
while (start >= 0 && j != 0 ? description [j++ - 1] == '{' : false);
....
return maxIndex == 1 ? "VALUE" : "VALUE" + (index + 1);
}
}
рдбрд╛рдпрдЧреНрдиреЛрд╕реНрдЯрд┐рдХ рдиреЗ рд▓рд╛рдЗрди рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛:
while (start >= 0 && j != 0 ? description [j++ - 1] == '{' : false)
рдЪрд░ рдХреЗ рдмрд╛рдж рд╕реЗ j рдЙрдкрд░реЛрдХреНрдд рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╢реВрдиреНрдп рд╕реЗ рдкреНрд░рд╛рд░рдВрдн рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЯрд░реНрдирд░реА рдСрдкрд░реЗрдЯрд░ рдорд╛рди рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛ рдЕрд╕рддреНрдп. рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЗ рдХрд╛рд░рдг, рд▓реВрдк рдХрд╛ рдореБрдЦреНрдп рднрд╛рдЧ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдХрд╛ рдпрд╣ рдЯреБрдХрдбрд╝рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рдЗрд░рд╛рджреЗ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдЪреЗрддрд╛рд╡рдиреА N6
рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЪреЗрддрд╛рд╡рдиреА:
private void remove_nuget_cache_for_package(....)
{
if (!config.AllVersions && installedPackageVersions.Count > 1)
{
const string allVersionsChoice = "All versions";
if (installedPackageVersions.Count != 1)
{
choices.Add(allVersionsChoice);
}
....
}
....
}
рдпрд╣рд╛рдБ рдПрдХ рдЕрдЬреАрдм рдиреЗрд╕реНрдЯреЗрдб рд╕реНрдерд┐рддрд┐ рд╣реИ: installPackageVersions.рдЧрд┐рдирддреА != 1рдЬреЛ рд╣рдореЗрд╢рд╛ рд░рд╣реЗрдЧрд╛ <strong>рдЙрджреНрджреЗрд╢реНрдп</strong>. рдЕрдХреНрд╕рд░ рдРрд╕реА рдЪреЗрддрд╛рд╡рдиреА рдХреЛрдб рдореЗрдВ рддрд╛рд░реНрдХрд┐рдХ рддреНрд░реБрдЯрд┐ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддреА рд╣реИ, рдФрд░ рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рдХреЗрд╡рд▓ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЬрд╛рдБрдЪ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддреА рд╣реИред
рдЪреЗрддрд╛рд╡рдиреА N7
рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЪреЗрддрд╛рд╡рдиреА:
public static bool arguments_contain_sensitive_information(string
commandArguments)
{
return commandArguments.contains("-install-arguments-sensitive")
|| commandArguments.contains("-package-parameters-sensitive")
|| commandArguments.contains("apikey ")
|| commandArguments.contains("config ")
|| commandArguments.contains("push ")
|| commandArguments.contains("-p ")
|| commandArguments.contains("-p=")
|| commandArguments.contains("-password")
|| commandArguments.contains("-cp ")
|| commandArguments.contains("-cp=")
|| commandArguments.contains("-certpassword")
|| commandArguments.contains("-k ")
|| commandArguments.contains("-k=")
|| commandArguments.contains("-key ")
|| commandArguments.contains("-key=")
|| commandArguments.contains("-apikey")
|| commandArguments.contains("-api-key")
|| commandArguments.contains("-apikey")
|| commandArguments.contains("-api-key");
}
рдХреЛрдб рдХреЗ рдЗрд╕ рдЕрдиреБрднрд╛рдЧ рдХреЛ рд▓рд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдиреЗ рдЕрдВрддрд┐рдо рджреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдХреЙрдкреА рдФрд░ рдкреЗрд╕реНрдЯ рдХрд┐рдпрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рднреВрд▓ рдЧрдпрд╛ред рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ, рдЪреЙрдХрд▓реЗрдЯреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рдереЗ рдПрдкреАрдЖрдИ рдХреБрдВрдЬреА рдХреБрдЫ рдФрд░ рддрд░реАрдХреЗ. рдЙрдкрд░реЛрдХреНрдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рдорд╛рди, рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдХрд▓реНрдк рдкреЗрд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ:
commandArguments.contains("-apikey=");
commandArguments.contains("-api-key=");
рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рд╕реНрд░реЛрдд рдХреЛрдб рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдЬрд▓реНрджреА рдпрд╛ рдмрд╛рдж рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рдХреА рдЙрдЪреНрдЪ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЙрдирд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рдЙрдкрдХрд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╣реИред
рдкреБрдирд╢реНрдЪ рдФрд░ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдпрд╣ рддреНрд░реБрдЯрд┐ рдмрд╣реБ-рдкрдВрдХреНрддрд┐ рд╕реНрдерд┐рддрд┐ рдХреЗ рдЕрдВрдд рдореЗрдВ рдкреНрд░рдХрдЯ рд╣реЛрддреА рд╣реИ :)ред рдкреНрд░рдХрд╛рд╢рди рджреЗрдЦреЗрдВ"
рдЪреЗрддрд╛рд╡рдиреА N8
рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЪреЗрддрд╛рд╡рдиреА:
public virtual ConcurrentDictionary<string, PackageResult> get_outdated(....)
{
....
var pinnedPackageResult = outdatedPackages.GetOrAdd(
packageName,
new PackageResult(installedPackage,
_fileSystem.combine_paths(
ApplicationParameters.PackagesLocation,
installedPackage.Id)));
....
if ( installedPackage != null
&& !string.IsNullOrWhiteSpace(installedPackage.Version.SpecialVersion)
&& !config.UpgradeCommand.ExcludePrerelease)
{
....
}
....
}
рдХреНрд▓рд╛рд╕рд┐рдХ рдЧрд▓рддреА: рдкрд╣рд▓реЗ рдЖрдкрддреНрддрд┐ рдХрд░реЗрдВ рдЗрдВрд╕реНрдЯреЙрд▓рдкреИрдХреЗрдЬ рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИ рд░рд┐рдХреНрдд. рдпрд╣ рдирд┐рджрд╛рди рд╣рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рджреЛ рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ: рдпрд╛ рддреЛ рдЗрдВрд╕реНрдЯреЙрд▓рдкреИрдХреЗрдЬ рдХрднреА рднреА рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд░рд┐рдХреНрдд, рдЬреЛ рд╕рдВрджрд┐рдЧреНрдз рд╣реИ, рдФрд░ рдлрд┐рд░ рдЪреЗрдХ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИ, рдпрд╛ рд╣рдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдХреЛрдб рдореЗрдВ рдПрдХ рдЧрдВрднреАрд░ рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд╕рдХрддреА рд╣реИ - рдПрдХ рд╢реВрдиреНрдп рд╕рдВрджрд░реНрдн рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ред
рдирд┐рд╖реНрдХрд░реНрд╖
рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдПрдХ рдФрд░ рдЫреЛрдЯрд╛ рдХрджрдо рдЙрдард╛рдпрд╛ рд╣реИ - рдЕрдм рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдФрд░ рднреА рдЖрд╕рд╛рди рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛ рдЧрдпрд╛ рд╣реИред рдореИрдВ рдпрд╣ рднреА рдХрд╣рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдЪреЙрдХрд▓реЗрдЯреА рдПрдХ рдЕрдЪреНрдЫрд╛ рдкреИрдХреЗрдЬ рдореИрдиреЗрдЬрд░ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдХреЛрдб рдореЗрдВ рдХрдо рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВ, рдЬреЛ рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдФрд░ рднреА рдХрдо рд╣реЛ рд╕рдХрддреА рд╣реИрдВред
рд╣рдо рдЖрдкрдХреЛ рдЖрдордВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ
рдкреБрдирд╢реНрдЪ
рдкреНрд░рдХрд╛рд╢рди рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдордиреЗ рд▓реЗрдЦ рдХреЛ рдЪреЙрдХрд▓реЗрдЯреА рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рднреЗрдЬрд╛ рдерд╛, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛ред рд╣рдореЗрдВ рдХреБрдЫ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рдорд┐рд▓рд╛, рд▓реЗрдХрд┐рди рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ "рдПрдкреАрдЖрдИ-рдХреА" рдХреБрдВрдЬреА рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЬреЛ рдмрдЧ рдорд┐рд▓рд╛, рд╡рд╣ рдкрд╕рдВрдж рдЖрдпрд╛ред
рдпрджрд┐ рдЖрдк рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдЕрдВрдЧреНрд░реЗрдЬреА рднрд╛рд╖реА рджрд░реНрд╢рдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдЕрдиреБрд╡рд╛рдж рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: рд╡реНрд▓рд╛рджрд┐рд╕реНрд▓рд╛рд╡ рд╕реНрдЯреЛрд▓рд╛рд░реЛрд╡ред
рд╕реНрд░реЛрдд: www.habr.com