Ninu oluyanju PVS-Studio fun awọn ede C ati C ++ lori Lainos ati macOS, ti o bẹrẹ lati ẹya 7.04, aṣayan idanwo kan ti han lati ṣayẹwo atokọ ti awọn faili ti o pato. Lilo ipo tuntun, o le tunto olutupalẹ lati ṣayẹwo awọn adehun ati fa awọn ibeere. Nkan yii yoo sọ fun ọ bi o ṣe le ṣeto iṣayẹwo atokọ ti awọn faili ti o yipada ti iṣẹ akanṣe GitHub ni iru awọn eto CI olokiki (Ijọpọ Ilọsiwaju) bii Travis CI, Buddy ati AppVeyor.
Ipo iṣayẹwo akojọ faili
Ninu ẹya PVS-Studio 7.04 fun Lainos ati macOS, ipo kan fun ṣiṣe ayẹwo atokọ ti awọn faili orisun ti han. Eyi n ṣiṣẹ fun awọn iṣẹ akanṣe ti eto kikọ gba ọ laaye lati ṣe ina faili kan
Paapaa, ipo iṣayẹwo atokọ faili le ṣee lo papọ pẹlu iwe itọpa strace ti awọn ifilọlẹ alakojọ (pvs-studio-analyzer trace). Lati ṣe eyi, iwọ yoo nilo lati kọkọ ni kikun iṣẹ akanṣe ki o tọpa rẹ ki olutupalẹ gba alaye pipe nipa awọn aye akojọpọ ti gbogbo awọn faili ti n ṣayẹwo.
Bibẹẹkọ, aṣayan yii ni apadabọ pataki - iwọ yoo nilo lati ṣe itọpa kikọ ni kikun ti gbogbo iṣẹ akanṣe ni gbogbo igba ti o ba ṣiṣẹ, eyiti funrararẹ tako imọran ti ṣayẹwo ni iyara kan. Tabi, ti o ba kaṣe abajade itọpa funrararẹ, awọn ṣiṣe atẹle ti olutupalẹ le jẹ pe ti eto igbẹkẹle ti awọn faili orisun ba yipada lẹhin itọpa naa (fun apẹẹrẹ, #include tuntun ti ṣafikun si ọkan ninu awọn faili orisun).
Nitorinaa, a ko ṣeduro lilo ipo ayẹwo atokọ faili pẹlu akọọlẹ itọpa lati ṣayẹwo awọn adehun tabi fa awọn ibeere. Ni ọran ti o le ṣe itumọ ti afikun nigbati o ba ṣayẹwo ifaramọ kan, ronu nipa lilo ipo naa
Atokọ awọn faili orisun fun itupalẹ ti wa ni fipamọ sinu faili ọrọ ati ki o kọja si oluyanju nipa lilo paramita naa -S:
pvs-studio-analyzer analyze ... -f build/compile_commands.json -S check-list.txt
Faili yii ṣe alaye ojulumo tabi awọn ọna pipe si awọn faili, ati pe faili tuntun kọọkan gbọdọ wa lori laini tuntun. O jẹ itẹwọgba lati pato kii ṣe awọn orukọ faili nikan fun itupalẹ, ṣugbọn ọpọlọpọ ọrọ tun. Oluyanju yoo rii pe eyi kii ṣe faili ati pe yoo foju laini naa. Eyi le wulo fun asọye ti awọn faili ba jẹ pato pẹlu ọwọ. Bibẹẹkọ, nigbagbogbo atokọ ti awọn faili yoo ṣe ipilẹṣẹ lakoko itupalẹ ni CI, fun apẹẹrẹ, iwọnyi le jẹ awọn faili lati ifaramo tabi fa ibeere.
Bayi, ni lilo ipo yii, o le yara ṣayẹwo koodu tuntun ṣaaju ki o to wọle si ẹka idagbasoke akọkọ. Lati rii daju wipe awọn Antivirus eto idahun si analyzer ikilo, awọn IwUlO plog-iyipada flag kun --tọkasi-ikilo:
plog-converter ... --indicate-warnings ... -o /path/to/report.tasks ...
Pẹlu asia yii, oluyipada yoo da koodu ti kii ṣe odo pada ti awọn ikilọ ba wa ninu ijabọ atunnkanka. Lilo koodu ipadabọ, o le dènà kio precommit kan, ṣe, tabi fa ibeere, ati ijabọ atunnkanka ti ipilẹṣẹ le ṣe afihan, pin, tabi firanṣẹ nipasẹ imeeli.
Akiyesi. Nigbati o ba kọkọ bẹrẹ itupalẹ atokọ ti awọn faili, gbogbo iṣẹ akanṣe yoo ṣe itupalẹ, nitori oluyẹwo nilo lati ṣe agbekalẹ faili kan ti awọn igbẹkẹle ti awọn faili orisun ise agbese lori awọn faili akọsori. Eyi jẹ ẹya ti itupalẹ awọn faili C ati C ++. Ni ọjọ iwaju, faili igbẹkẹle le jẹ cache ati pe yoo ṣe imudojuiwọn laifọwọyi nipasẹ olutupalẹ. Anfani ti ṣiṣe ayẹwo nigba lilo ipo iṣayẹwo atokọ faili lori lilo ipo itupalẹ afikun ni pe o nilo lati kaṣe faili yẹn nikan kii ṣe awọn faili ohun.
Gbogbogbo agbekale ti fa ìbéèrè onínọmbà
Ṣiṣayẹwo gbogbo iṣẹ akanṣe gba akoko pupọ, nitorinaa o jẹ oye lati ṣayẹwo apakan kan nikan. Iṣoro naa ni pe o nilo lati ya awọn faili tuntun kuro lati iyoku awọn faili iṣẹ akanṣe.
Jẹ ki a wo apẹẹrẹ ti igi ti o ni awọn ẹka meji:
Jẹ ki a fojuinu ifọkansi yẹn A1 ni kan iṣẹtọ tobi iye koodu ti a ti ni idanwo tẹlẹ. Diẹ diẹ sẹyin a ṣe ẹka kan lati ifaramọ A1 o si yipada diẹ ninu awọn faili.
Iwọ, dajudaju, ṣe akiyesi pe lẹhin A1 Awọn iṣe meji miiran tun ṣẹlẹ, ṣugbọn iwọnyi tun jẹ idapọ ti awọn ẹka miiran, nitori a ko ṣe titunto si. Ati nisisiyi akoko ti de nigbati hotfix setan. Ti o ni idi kan fa ìbéèrè fun awọn àkópọ han B3 и A3.
Nitoribẹẹ, yoo ṣee ṣe lati ṣayẹwo gbogbo abajade ti iṣọpọ wọn, ṣugbọn eyi yoo gba akoko pupọ ati aibikita, nitori pe awọn faili diẹ ti yipada. Nitorinaa, o munadoko diẹ sii lati ṣe itupalẹ awọn ti o yipada nikan.
Lati ṣe eyi, a gba iyatọ laarin awọn ẹka, ti o wa ni ori ti eka ti a fẹ lati dapọ si oluwa:
git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list
$MERGE_BASE a yoo wo ni kikun nigbamii. Otitọ ni pe kii ṣe gbogbo iṣẹ CI pese alaye pataki nipa ibi ipamọ data fun sisọpọ, nitorinaa ni gbogbo igba ti o ni lati wa awọn ọna tuntun lati gba data yii. Eyi yoo ṣe apejuwe ni awọn alaye ni isalẹ ni ọkọọkan awọn iṣẹ wẹẹbu ti ṣapejuwe.
Nitorinaa, a ni iyatọ laarin awọn ẹka, tabi dipo, atokọ ti awọn orukọ faili ti o yipada. Bayi a nilo lati fun faili naa .pvs-pr.akojọ (a darí àbájáde lókè sí i) sí olùtúpalẹ̀:
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
-S .pvs-pr.list
Lẹhin itupalẹ, a nilo lati yi faili log pada (PVS-Studio.log) sinu ọna kika rọrun lati ka:
plog-converter -t errorfile PVS-Studio.log --cerr -w
Aṣẹ yii yoo ṣe atokọ awọn aṣiṣe ninu
Nikan ni bayi a nilo ko ṣe afihan awọn aṣiṣe nikan, ṣugbọn tun sọ fun iṣẹ wa fun apejọ ati idanwo nipa wiwa awọn iṣoro. Fun idi eyi, asia kan ti wa ni afikun si oluyipada -W (--tọkasi-ikilo). Ti o ba wa ni o kere ju ikilọ oluyanju kan, koodu ipadabọ ohun elo plog-iyipada yoo yipada si 2, eyiti yoo sọ fun iṣẹ CI nipa wiwa awọn aṣiṣe ti o pọju ninu awọn faili ibeere fa.
Travis C.I.
Iṣeto ni a ṣe bi faili kan .travis.yml. Fun irọrun, Mo gba ọ ni imọran lati fi ohun gbogbo sinu iwe afọwọkọ bash lọtọ pẹlu awọn iṣẹ ti yoo pe lati faili naa .travis.yml (bash script_name.sh function_name).
A yoo ṣafikun koodu pataki si iwe afọwọkọ ni Basi, ni ọna yii a yoo gba iṣẹ-ṣiṣe diẹ sii. Ni apakan fi sori ẹrọ jẹ ki a kọ nkan wọnyi:
install:
- bash .travis.sh travis_install
Ti o ba ni awọn ilana eyikeyi, o le gbe wọn sinu iwe afọwọkọ, yọ awọn hyphen kuro.
Jẹ ki a ṣii faili naa .travis.sh ki o si fi eto itupale kun si iṣẹ naa travis_install():
travis_install() {
wget -q -O - https://files.viva64.com/etc/pubkey.txt
| sudo apt-key add -
sudo wget -O /etc/apt/sources.list.d/viva64.list
https://files.viva64.com/etc/viva64.list
sudo apt-get update -qq
sudo apt-get install -qq pvs-studio
}
Bayi jẹ ki a fi si apakan akosile ṣiṣe itupalẹ:
script:
- bash .travis.sh travis_script
Ati ninu iwe afọwọkọ bash:
travis_script() {
pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY
if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then
git diff --name-only origin/HEAD > .pvs-pr.list
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
-S .pvs-pr.list
--disableLicenseExpirationCheck
else
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
--disableLicenseExpirationCheck
fi
plog-converter -t errorfile PVS-Studio.log --cerr -w
}
Koodu yii nilo lati ṣiṣẹ lẹhin kikọ iṣẹ akanṣe, fun apẹẹrẹ, ti o ba ni kikọ lori CMake:
travis_script() {
CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
cmake $CMAKE_ARGS CMakeLists.txt
make -j8
}
Yoo jade bi eleyi:
travis_script() {
CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
cmake $CMAKE_ARGS CMakeLists.txt
make -j8
pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY
if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then
git diff --name-only origin/HEAD > .pvs-pr.list
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
-S .pvs-pr.list
--disableLicenseExpirationCheck
else
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
--disableLicenseExpirationCheck
fi
plog-converter -t errorfile PVS-Studio.log --cerr -w
}
O ti ṣe akiyesi tẹlẹ awọn oniyipada ayika $TRAVIS_PULL_REQUEST и $TRAVIS_BRANCH. Travis CI sọ wọn ni ominira:
- $TRAVIS_PULL_REQUEST tọjú awọn fa ìbéèrè nọmba tabi èké, ti eyi ba jẹ ẹka deede;
- $ TRAVIS_REPO_SLUG tọjú awọn orukọ ti awọn ibi ipamọ ise agbese.
Algorithm fun iṣẹ yii:
Travis CI ṣe idahun si awọn koodu ipadabọ, nitorinaa wiwa awọn ikilọ yoo sọ fun iṣẹ naa lati samisi iṣẹ naa bi awọn aṣiṣe ti o ni ninu.
Bayi jẹ ki a ṣe akiyesi diẹ sii ni ila ti koodu yii:
git diff --name-only origin/HEAD > .pvs-pr.list
Otitọ ni pe Travis CI dapọ awọn ẹka laifọwọyi lakoko ti o ṣe itupalẹ ibeere fa kan:
Nitorina a ṣe itupalẹ A4sugbon ko B3->A3. Nitori ẹya yii, a nilo lati ṣe iṣiro iyatọ pẹlu A3, eyi ti o jẹ gbọgán oke ti eka lati Oti.
Alaye pataki kan wa ti o kù - fifipamọ awọn igbẹkẹle ti awọn faili akọsori lori awọn ẹya itumọ akojọpọ (*.c, *.cc, *.cpp, ati bẹbẹ lọ). Oluyanju ṣe iṣiro awọn igbẹkẹle wọnyi nigbati o kọkọ ṣe ifilọlẹ ni ipo ti ṣayẹwo atokọ ti awọn faili ati lẹhinna fi wọn pamọ sinu itọsọna PVS-Studio. Travis CI gba ọ laaye lati kaṣe awọn folda, nitorinaa a yoo fipamọ data liana naa .PVS-Studio/:
cache:
directories:
- .PVS-Studio/
Koodu yii nilo lati ṣafikun si faili naa .travis.yml. Liana yii tọju ọpọlọpọ awọn data ti a gba lẹhin itupalẹ, eyiti yoo yara ni pataki awọn ṣiṣe ṣiṣe atẹle ti itupalẹ atokọ faili tabi itupalẹ afikun. Ti eyi ko ba ṣe, lẹhinna oluyẹwo yoo ṣe itupalẹ gbogbo awọn faili ni gbogbo igba.
Buddy
Bii Travis CI,
Ni akọkọ, a nilo lati ṣafikun iṣe tuntun si laini apejọ:
Jẹ ki a ṣe afihan olupilẹṣẹ ti a lo lati kọ iṣẹ naa. Ṣe akiyesi apoti docker ti o ti fi sii ni iṣẹ yii. Fun apẹẹrẹ, apoti pataki kan wa fun GCC:
Bayi jẹ ki a fi PVS-Studio sori ẹrọ ati awọn ohun elo pataki:
Jẹ ki a ṣafikun awọn ila wọnyi si olootu:
apt-get update && apt-get -y install wget gnupg jq
wget -q -O - https://files.viva64.com/etc/pubkey.txt | apt-key add -
wget -O /etc/apt/sources.list.d/viva64.list
https://files.viva64.com/etc/viva64.list
apt-get update && apt-get -y install pvs-studio
Bayi jẹ ki a lọ si Ṣiṣe taabu (aami akọkọ) ki o ṣafikun koodu atẹle si aaye olootu ti o baamu:
pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY
if [ "$BUDDY_EXECUTION_PULL_REQUEST_NO" != '' ]; then
PULL_REQUEST_ID="pulls/$BUDDY_EXECUTION_PULL_REQUEST_NO"
MERGE_BASE=`wget -qO -
https://api.github.com/repos/${BUDDY_REPO_SLUG}/${PULL_REQUEST_ID}
| jq -r ".base.ref"`
git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
--disableLicenseExpirationCheck
-S .pvs-pr.list
else
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
--disableLicenseExpirationCheck
fi
plog-converter -t errorfile PVS-Studio.log --cerr -w
Ti o ba ka apakan lori Travs-CI, lẹhinna koodu yii ti mọ ọ tẹlẹ, sibẹsibẹ, ni bayi ipele tuntun wa:
Otitọ ni pe ni bayi a ṣe itupalẹ kii ṣe abajade ti iṣọpọ, ṣugbọn ORI ti ẹka lati eyiti o ti ṣe ibeere fa:
Nitorinaa a wa ni adehun ni àídájú B3 ati pe a nilo lati gba iyatọ lati A3:
PULL_REQUEST_ID="pulls/$BUDDY_EXECUTION_PULL_REQUEST_NO"
MERGE_BASE=`wget -qO -
https://api.github.com/repos/${BUDDY_REPO_SLUG}/${PULL_REQUEST_ID}
| jq -r ".base.ref"`
git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list
Fun ipinnu A3 Jẹ ki a lo GitHub API:
https://api.github.com/repos/${USERNAME}/${REPO}/pulls/${PULL_REQUEST_ID}
A lo awọn oniyipada wọnyi ti Buddy pese:
- $BUDDY_EXECUTION_PULL_REQEUST_NO - fa nọmba ìbéèrè;
- $BUDDY_REPO_SLUG - apapo orukọ olumulo ati ibi ipamọ (fun apẹẹrẹ max/idanwo).
Bayi jẹ ki a fi awọn ayipada pamọ nipa lilo bọtini isalẹ ki o mu itupalẹ ibeere fa:
Ko dabi Travis CI, a ko nilo lati pato .pvs-isise fun caching, niwon Buddy laifọwọyi caches gbogbo awọn faili fun ọwọ awọn ifilọlẹ. Nitorinaa, ohun ikẹhin ti o kù ni lati ṣafipamọ iwọle ati ọrọ igbaniwọle fun PVS-Studio ni Buddy. Lẹhin fifipamọ awọn ayipada, a yoo mu wa pada si Pipeline. A nilo lati tẹsiwaju lati ṣeto awọn oniyipada ati fifi iwọle ati bọtini kun fun PVS-Studio:
Lẹhin eyi, ifarahan ti ibeere fifa tuntun tabi ifaramọ yoo fa atunyẹwo naa. Ti adehun kan ba ni awọn aṣiṣe ninu, Ọrẹ yoo tọka si eyi lori oju-iwe ibeere fa.
AppVeyor
Ṣiṣeto AppVeyor jẹ iru si Buddy, nitori ohun gbogbo n ṣẹlẹ ni wiwo wẹẹbu ati pe ko si iwulo lati ṣafikun faili * .yml kan si ibi ipamọ iṣẹ akanṣe naa.
Jẹ ki a lọ si Eto taabu ni Akopọ ise agbese:
Jẹ ki a yi lọ si isalẹ oju-iwe yii ki o mu fifipamọ kaṣe ṣiṣẹ fun gbigba awọn ibeere fa:
Bayi jẹ ki a lọ si taabu Ayika, nibiti a ti ṣalaye aworan fun apejọ ati awọn oniyipada ayika pataki:
Ti o ba ti ka awọn apakan ti tẹlẹ, o mọ pupọ pẹlu awọn oniyipada meji wọnyi - PVS_KEY и PVS_USERNAME. Ti kii ba ṣe bẹ, jẹ ki n leti pe wọn ṣe pataki lati jẹrisi iwe-aṣẹ ti olutupalẹ PVS-Studio. A yoo rii wọn lẹẹkansi ni awọn iwe afọwọkọ Bash ni ọjọ iwaju.
Ni oju-iwe kanna ni isalẹ a tọka folda fun caching:
Ti a ko ba ṣe eyi, a yoo ṣe itupalẹ gbogbo iṣẹ akanṣe dipo awọn faili meji, ṣugbọn a yoo gba abajade lati awọn faili ti a ti sọ tẹlẹ. Nitorina, o jẹ pataki lati tẹ awọn ti o tọ liana orukọ.
Bayi o to akoko fun iwe afọwọkọ lati ṣe idanwo. Ṣii taabu Awọn idanwo ki o yan Akosile:
O nilo lati lẹẹ koodu atẹle yii sinu fọọmu yii:
sudo apt-get update && sudo apt-get -y install jq
wget -q -O - https://files.viva64.com/etc/pubkey.txt
| sudo apt-key add -
sudo wget -O /etc/apt/sources.list.d/viva64.list
https://files.viva64.com/etc/viva64.list
sudo apt-get update && sudo apt-get -y install pvs-studio
pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY
PWD=$(pwd -L)
if [ "$APPVEYOR_PULL_REQUEST_NUMBER" != '' ]; then
PULL_REQUEST_ID="pulls/$APPVEYOR_PULL_REQUEST_NUMBER"
MERGE_BASE=`wget -qO -
https://api.github.com/repos/${APPVEYOR_REPO_NAME}/${PULL_REQUEST_ID}
| jq -r ".base.ref"`
git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
--disableLicenseExpirationCheck
--dump-files --dump-log pvs-dump.log
-S .pvs-pr.list
else
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
--disableLicenseExpirationCheck
fi
plog-converter -t errorfile PVS-Studio.log --cerr -w
Jẹ ki a san ifojusi si apakan atẹle ti koodu naa:
PWD=$(pwd -L)
if [ "$APPVEYOR_PULL_REQUEST_NUMBER" != '' ]; then
PULL_REQUEST_ID="pulls/$APPVEYOR_PULL_REQUEST_NUMBER"
MERGE_BASE=`wget -qO -
https://api.github.com/repos/${APPVEYOR_REPO_NAME}/${PULL_REQUEST_ID}
| jq -r ".base.ref"`
git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
--disableLicenseExpirationCheck
--dump-files --dump-log pvs-dump.log
-S .pvs-pr.list
else
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
--disableLicenseExpirationCheck
fi
Iṣẹ iyansilẹ pato ti iye ti aṣẹ pwd si oniyipada ti o yẹ ki o tọju iye aiyipada yii dabi ajeji ni wiwo akọkọ, sibẹsibẹ, Emi yoo ṣalaye ohun gbogbo ni bayi.
Lakoko ti o ṣeto atunnkanka ni AppVeyor, Mo pade ihuwasi ajeji pupọ ti olutupalẹ. Ni apa kan, ohun gbogbo ṣiṣẹ ni deede, ṣugbọn itupalẹ ko bẹrẹ. Mo lo akoko pupọ lati ṣe akiyesi pe a wa ninu / ile / appveyor / awọn iṣẹ akanṣe / testcalc / liana, ati pe olutupalẹ jẹ daju pe a wa ni / ijade / appveyor / kọ-aṣoju /. Lẹhinna Mo rii pe oniyipada $PWD n parọ diẹ. Fun idi eyi, Mo ṣe imudojuiwọn iye rẹ pẹlu ọwọ ṣaaju ki o to bẹrẹ itupalẹ naa.
Ati lẹhinna ohun gbogbo jẹ bi iṣaaju:
Bayi ro nkan wọnyi:
PULL_REQUEST_ID="pulls/$APPVEYOR_PULL_REQUEST_NUMBER"
MERGE_BASE=`wget -qO -
https://api.github.com/repos/${APPVEYOR_REPO_NAME}/${PULL_REQUEST_ID}
| jq -r ".base.ref"`
Ninu rẹ a gba iyatọ laarin awọn ẹka lori eyiti a ti kede ibeere fa. Lati ṣe eyi a nilo awọn oniyipada ayika wọnyi:
- $APPVEYOR_PULL_REQUEST_NUMBER — fa nọmba ìbéèrè;
- $APPVEYOR_REPO_NAME - orukọ olumulo ati ibi ipamọ iṣẹ akanṣe.
ipari
Nitoribẹẹ, a ko gbero gbogbo awọn iṣẹ iṣọpọ lemọlemọfún ti o ṣeeṣe, sibẹsibẹ, gbogbo wọn ni awọn pato iṣẹ ṣiṣe ti o jọra pupọ si ara wọn. Ayafi ti caching, iṣẹ kọọkan ṣe “keke” tirẹ, nitorinaa ohun gbogbo yatọ nigbagbogbo.
Ibikan, bi ni Travis-CI, a tọkọtaya ti ila ti koodu ati caching ṣiṣẹ flawlessly; ibikan, bi ni AppVeyor, o kan nilo lati pato awọn folda ninu awọn eto; ṣugbọn nibikan o nilo lati ṣẹda awọn bọtini alailẹgbẹ ati gbiyanju lati parowa fun eto naa lati fun ọ ni aye lati kọ ajẹkù ti a fi pamọ. Nitorinaa, ti o ba fẹ ṣeto igbekale ti awọn ibeere fifa lori iṣẹ iṣọpọ igbagbogbo ti a ko jiroro loke, lẹhinna rii daju pe iwọ kii yoo ni awọn iṣoro pẹlu caching.
Mo dupe fun ifetisile re. Ti nkan ko ba ṣiṣẹ, lero ọfẹ lati kọ si wa ni
Ti o ba fẹ pin nkan yii pẹlu awọn olugbo ti o sọ Gẹẹsi, jọwọ lo ọna asopọ itumọ: Maxim Zvyagintsev.
orisun: www.habr.com