majorsilence-migrate සමඟ WinForms යෙදුමක් සංක්රමණය කිරීම
මෙම පිටුව පරිවර්තනයකි. ඉංග්රීසි අනුවාදය සමඟ වෙනසක් ඇත්නම්, ඉංග්රීසි අනුවාදය නිවැරදි ලෙස සලකන්න. English
majorsilence-migrate යනු WinForms solution එකක් Majorsilence.Forms වෙත ගෙන යාම ස්වයංක්රීය කරන CLI මෙවලමයි. එහි කේන්ද්රීය සැලසුම් තීරණය පහසුවෙන් මගහැරිය හැකි නිසා එය පැහැදිලිව සඳහන් කිරීම වටී: එය syntax tree එකක් parse කිරීම හෝ symbols විසඳීම නොකරයි. එය අමු මූලාශ්ර පාඨය (raw source text) මත ක්රියා කරන බහු-අදියර (multi-pass) පාඨමය/regex නැවත ලියනයකි (rewriter) — තවද එය හිතාමතාම එසේ කර ඇත.
Roslyn නොව, පාඨමය වන්නේ ඇයි
මෙවලමේම මූලාශ්ර comment එකෙන්: “මෙය හිතාමතාම පාඨමය පරිවර්තනයකි — එය syntax tree එක parse නොකරයි — එමඟින් එය වේගවත්ව තබාගන්නා අතර දැනට compile නොවන ගොනු ද ඉවසයි.”
එම වෙළඳාම (trade-off) මඟින් symbol-දැනුවත් මෙවලමකට ලබා දිය නොහැකි දේවල් දෙකක් ලැබේ:
- එය බිඳුණු කේතය මත ක්රියා කරයි. අර්ධ වශයෙන් සංක්රමණය කළ solution එකක්, කිසිවෙකු තවමත් port නොකළ type එකක් reference කරන ගොනුවක්, reference එකක් අස්ථානගත වූ project එකක් — මේ කිසිවක් නැවත ලියනය නතර නොකරයි, මන්ද කේතය compile වීම හෝ සම්පූර්ණයෙන් parse වීම පවා එයට කිසිදා අවශ්ය නොවේ. සැබෑ symbol විසඳීමක් සහිත Roslyn-පාදක මෙවලමක් project එක build වන තුරු එය ස්පර්ශ කිරීම ප්රතික්ෂේප කරනු ඇත; එය පැරණි codebase එකක් මත පළමු වටයක අරමුණම පරාජය කරයි.
- එය වේගවත්ය. Compilation නැත,
MSBuildWorkspaceනැත, project graph පූරණය කිරීමක් නැත — එය දහස් ගණනක ගොනු තත්පර කිහිපයකින් සකසයි.
මිල: සැබෑ cross-project symbol විසඳීමක් නැත. හිස් Panel reference එකක් යනු System.Windows.Forms.Panel ද නැතහොත් එම නමින්ම ඇති ඔබේම class එකක් ද යන්න නැවත ලියනයට සෑම විටම කිව නොහැක — ඒ වෙනුවට එය namespace-prefix සහ using/Imports සන්දර්භය මත රඳා පවතී. ප්රායෝගිකව මෙය කලාතුරකින් අපැහැදිලි වේ (WinForms සහ Telerik type නම් සුවිශේෂී ය), තවද එය හඳුනා නොගන්නා ඕනෑම දෙයක් නිහඬව අනුමාන කරනවා වෙනුවට අතින් සමාලෝචනය සඳහා සලකුණු කරනු ලැබේ.
විකල්ප Roslyn engine එක
සැබවින්ම අපැහැදිලි අවස්ථාව සඳහා — එකම ගොනුවේ WinForms/GDI+ type එකක් සමඟ හිස් නමක් බෙදා ගන්නා අභිරුචි type එකක් — ඔබ විසින් තෝරා ගත යුතු (opt-in) දෙවන engine එකක් ඇත: --engine roslyn. එය regexes වෙනුවට MSBuildWorkspace සහ සැබෑ symbol විසඳීම භාවිත කරයි; එය පාඨමය engine එක ප්රතිස්ථාපනය කරනවා වෙනුවට එය මතට ස්තරයක් ලෙස එක් වේ; Roslyn ප්රකාරයේදී පවා අදියර කිහිපයක් පාඨමයව පවතී, මන්ද ඒවා කිසිදා symbol-විසඳීමේ ගැටලු නොවූ බැවිනි.
වෙළඳාම් පෙරනිමි engine එකට ප්රතිවිරුද්ධ දිශාවට ක්රියා කරයි: MSBuild හරහා සැබවින්ම පූරණය වන solution එකක් හෝ project එකක් එයට අවශ්ය වේ (හිස් directory එකක් හෝ තනි ගොනුවක් අනතුරු ඇඟවීමක් සමඟ text engine එකට ආපසු යයි), MSBuild ඇගයීම ධාවනයේ වැඩි කාලයක් ගන්නා බැවින් එය විශාලත්ව ගණනාවකින් (orders of magnitude) මන්දගාමී වේ, තවද එක් project එකක් පූරණය වීමට අසමත් වුවහොත්, එම project එකේ ගොනු පමණක් text engine එකට ආපසු යයි — ධාවනය නවතා නොදමයි. MSBuild සොයාගැනීමටම නොහැකි නම්, නිහඬව පහත් මට්ටමකට මාරු වනවා වෙනුවට සම්පූර්ණ ධාවනය දැඩි ලෙස අසාර්ථක වේ.
එය භාවිත කළ යුත්තේ කවදාද: පෙරනිමි --engine text සමඟ පළමු වටයකින් පසුව, දැනටමත් පිරිසිදුව පූරණය වන project එකක, diff එකේ නිශ්චිත, තහවුරු කළ නාම-ගැටුම් (name-collision) අවස්ථාවක් ඔබ දකින්නේ නම්. විශාල, සමහරවිට අර්ධ වශයෙන් බිඳුණු පැරණි codebase එකක් මත මූලික වටය සඳහා, පෙරනිමි පාඨමය engine එක තවමත් නිවැරදි මෙවලමයි.
ඊළඟට කුමක්ද
සම්පූර්ණ අදියරෙන්-අදියර විස්තරය සඳහා repository එකේ MIGRATION.md ද, ඔබේ සංක්රමණය කළ කේතය compile වූ පසු සැබවින්ම ක්රියාත්මක කර ඇත්තේ මොනවාද යන්න සඳහා COMPATIBILITY_MATRIX.md ද බලන්න.