рдХреНрдпреЛрдВ рдЬрд░реВрд░реА рд╣реИ?
рдЬрдм рдЖрдкрдХреА рдЯреАрдо рдореЗрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╡реНрдпрдХреНрддрд┐ рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рд░ рдХрд┐рд╕реА рдХреЛ рдЯреАрдо рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рджрд╕реНрдп рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреЛрдбрд┐рдВрдЧ рд╕реНрдЯрд╛рдЗрд▓ рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рдХреЛрдИ рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрд╖реНрдардХ рд▓рд┐рдЦрддрд╛ рд╣реИ if...else
, рддреЛ рдХреЛрдИ рдирд╣реАрдВред рдЬрдм рдХреЛрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдбрд╝реА рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЛ рдкрдврд╝рдирд╛ рдФрд░ рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рднреА рдХрдард┐рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рддрд╛рдХрд┐ рдХреЛрдб рдХреА рд╕рдореАрдХреНрд╖рд╛ рдФрд░ рдЕрдиреНрдп рдЯреАрдо рдХреА рдмреИрдардХ рдКрдВрдЪреЗ рд╕реНрд╡рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЯреИрдм рдмрдирд╛рдо рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдХреА рдЪрд░реНрдЪрд╛ рдореЗрдВ рди рдмрджрд▓ рдЬрд╛рдП, рдЗрд╕рд▓рд┐рдП рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рддрд╛рдХрд┐ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЦреБрдж рд╣реА рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рди рджреЗ рдЬреЛ рдХрд┐ рдЯреАрдо рдХреЗ рд▓рд┐рдП рдЕрдорд╛рдиреНрдп рдФрд░ рдЧреИрд░-рдорд╛рдирдХ рд╣реЛред
рдПрдХ рддрд░рдл, рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреЛрдбрд┐рдВрдЧ рд╢реИрд▓рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрд╡рд╛рджрд┐рд╖реНрдЯ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВред рдареАрдХ рд╣реИ, рдЬреВрди рд╢рд░реНрдд рдХреЗ рдмрд╛рдж рдХреЛрдб рдХреА рдПрдХ рднреА рдкрдВрдХреНрддрд┐ рдирд╣реАрдВ рд▓рдкреЗрдЯрддрд╛ рд╣реИ if
, рд▓реЗрдХрд┐рди рдХреЛрдИ рд▓рд┐рдЦрддрд╛ рд╣реИ, рддреЛ рдХреНрдпрд╛? рдпрджрд┐ рдЖрдк рдЬреВрди рдкреЗрди "рдЬреИрд╕рд╛ рд╣реИ" рдХреЗ рддрд╣рдд рдХреЛрдб рдЫреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ "рдЯрд╛рдЗрдо рдмрдо" рдмрди рд╕рдХрддрд╛ рд╣реИ: рдХреЛрдб рдХреА рдЙрд╕ рд▓рд╛рдЗрди рдХреЛ if
рдЙрд╕рдХреЗ рдмрд╛рдж рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЕрдЧрд▓реА рд▓рд╛рдЗрди рд╢рд░реНрдд рдХреЗ рддрд╣рдд рдЖ рдЬрд╛рдПрдЧреАред рдмреЗрд╢рдХ, рдпрд╣ рд╕реНрдерд┐рддрд┐ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛ рдореЗрдВ рдкрдХрдбрд╝реА рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрднрд╛рд╡рд┐рдд рдмрдЧ рдкрд░реАрдХреНрд╖рдг рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рджреЛ рдореБрдЦреНрдп рдХрд╛рд░рдг рд╣реИрдВ:
- рд╣рдо рд╕рднреА рд▓реЛрдЧ рд╣реИрдВ, рдФрд░ рд▓реЛрдЧ рдЧрд▓рдд рд╣реИрдВред
- рд▓реЛрдЧ рд╕рд╛рдорд╛рдЬрд┐рдХ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╡реЗ рд╢реИрд▓рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде "рд╕рдВрдШрд░реНрд╖" рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдФрд░ рдпрд╣рд╛рдВ рджреЛ рд╡рд┐рдХрд▓реНрдк рд╕рдВрднрд╡ рд╣реИрдВ:
- "рдмреЗрд╣рддрд░ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдареАрдХ рдХрд░реЗрдВ," рд╕рдореАрдХреНрд╖рдХ рд╕реЛрдЪрддрд╛ рд╣реИ, рдФрд░ рдХреЛрдб рдХреЛ рдареАрдХ рдХрд░рддрд╛ рд╣реИред
- рдирд┐рд░реАрдХреНрд╖рдХ рдЬреВрди рдХреЛ рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреА рдкрд░реНрдпрд╛рдкреНрддрддрд╛ рдФрд░ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдиреЗ рд╕рдВрджреЗрд╣ рд╡реНрдпрдХреНрдд рдХрд░рддрд╛ рд╣реИред
рд╣рдо рдпрд╣ рдХреИрд╕реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рд░ рдХреЛрдИ рдЯреАрдо рдХреА рд╢реИрд▓реА рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд▓рд┐рдЦрддрд╛ рд╣реИ? рд╣рд░ рдмрд╛рд░ рдХреЛрдб рдХреА рд╕рдореАрдХреНрд╖рд╛ рдореЗрдВ рд╣рд╛рдереЛрдВ рдХреЛ рд╣рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЗ рд▓реЗрдЦрдХ рдФрд░ рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рджреЛрдиреЛрдВ рдХреЛ рдЦреБрдж рдХреЛ рдбрд┐рдореЛрдЯ рдХрд░рддрд╛ рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдПрдХ рд╡рд░реНрд╖ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рддрдХ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рджрд┐рдорд╛рдЧ рдХреЛ рдЙрддреНрддреЗрдЬрд┐рдд рдХрд░рддреА рд╣реИ, рдФрд░ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣рдорд╛рд░реЗ рдирд┐рдкрдЯрд╛рди рдореЗрдВ рдХрдИ рдЙрдкрдХрд░рдг рд╣реИрдВред
рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рджреВрд╕рд░реЛрдВ рдФрд░ рдЦреБрдж рдХреЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдирд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдореИрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЯреАрдо рдорд╛рдирдХреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЕрдорд╛рдиреНрдп рдХреЛрдб рд╕реЗ рдЦреБрдж рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реИред
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реИ
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдПрдХ рдбреЗрдореЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд▓реЗрдВ рдЬрд┐рд╕рдХрд╛ рдХреЛрдб GitHub рдкрд░ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЪреВрдВрдХрд┐ рдореИрдВ .NET рдХреЛрд░ рдкрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕ рдкрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред рдореИрдВ рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛:
- .NET рдХреЛрд░ 3.1
- рдХреЛрдгреАрдп 8+
- рдЬреАрдердм рдЦрд╛рддрд╛
- рдЯреНрд░реИрд╡рд┐рд╕ рд╕реА.рдЖрдИ.
Travis-CI. , .
тАФ , master branch
.
" " Gitlab Azure DevOps, Github тАФ Travis CI.
. . , , :
- . develop master , (maintainer).
- . CICD , .
- Repository is a king. gitflow, .
- Fail fast. , .
- Git pre-commits hoocks. CI , - .
? -, master develop . , , , "" . " ". , .
solution- (*.sln) , - .NET . , , nuget- .
stylecop .NET Core. , solution- ( gist.github.com):
Directory.build.props
тАФ .standard.ruleset
тАФ .stylecop.json
тАФ .
, .
- . : - , . . :
ng lint
ng build --prod
ng test
. , (Chrome / Chromium), CI-. , npm- puppeteer
, .
, , :
"test-headless-ci-only": "ng test --browsers ChromiumNoSandbox"
scripts
packages.json
:
"scripts": {
"ng": "ng",
"start": "ng serve -o",
"build": "ng build",
"build-stage": "ng build --configuration=staging",
"build-prod": "ng build --prod",
"test": "ng test",
"test-headless-ci-only": "ng test --browsers ChromiumNoSandbox",
"lint": "ng lint",
"e2e": "ng e2e"
},
npm install puppeteer
karma.conf.js
:
const process = require("process");
process.env.CHROME_BIN = require("puppeteer").executablePath();
module.exports = function(config) {
...
};
karma.conf.js
customLaunchers
:
config.set({
....,
customLaunchers: {
ChromiumNoSandbox: {
base: "ChromeHeadless",
flags: [
"--no-sandbox",
"--headless",
"--disable-gpu",
"--disable-translate",
"--disable-extensions"
]
}
},
singleRun: true
});
npm run est-headless-ci-only
.
- , . prettierrc, . . prettierrc , :
- prettier pretty-quick :
npm install -g prettier
npm install -g pretty-quick
.prettierrc
-:
{
"useTabs": false,
"printWidth": 120,
"tabWidth": 2,
"singleQuote": true,
"trailingComma": "none",
"semi": true
}
- prettier-
.prettierignore
-:
package.json
package-lock.json
tslint.json
tsconfig.json
browserslist
.gitkeep
favicon.ico
tsconfig.lib.json
tsconfig.app.json
tsconfig.spec.json
karma.conf.js
protractor.conf.js
ng-package.json
*.html
" " pretty-quick --staged
.
-
CI/CD тАФ , . , . . , -, .
husky. , :
- husky
npm install -g husky
- husk
package.json
:
"devDependencies": {
...
},
"husky": {
"hooks": {
"pre-commit": "pretty-quick --staged",
"pre-push": "ng lint && ng test --browsers ChromiumNoSandbox"
}
}
: , , "".
рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрджрдо рдЙрдард╛рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рдЕрдорд╛рдиреНрдп рдХреЛрдб рд╕реЗ "рдЦреБрдж рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реИ"ред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╕рд┐рд░реНрдл рд╕рд┐рдВрдЯреИрдХреНрд╕ рдФрд░ рд╕реНрдЯрд╛рдЗрд▓ рдЧрд╛рдЗрдб рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рд╕реЗ рдЙрддреНрдкрд╛рдж рдХреЛ рдХреАрдбрд╝реЗ рд╕реЗ рдмрдЪрд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдпреЗ рдЫреЛрдЯреА рдЪреАрдЬреЗрдВ рдмреЗрд╣рддрд░ рдХреЛрдб рдЧреБрдгрд╡рддреНрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреА рд╣реИрдВ рдФрд░ рдЖрдкрдХреЛ рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддреБ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИрдВ, рдореБрджреНрджреЛрдВ рдХреЛ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдирд╣реАрдВред