Middle
Ինչպե՞ս կարող է առաջանալ տարբերակների առաջնահերթությունների խնդիր:
sobes.tech AI
Պատասխան AI-ից
iOS զարգացման մեջ տարբերակների առաջնահերթության խնդիրը (որը հայտնի է որպես "վերացանկային մոգություն") կարող է առաջանալ, երբ նախագիծը կախված է մի քանի գրադարաններից կամ շրջանակներից, որոնք ունեն ընդհանուր կախվածություններ, բայց տարբեր պահանջվող տարբերակներով:
Պատճառներ:
- Տրանսիտիվ կախվածություններ: Գրադարան A-ն կախված է C գրադարանի տարբերակից 1.0, իսկ գրադարան B-ն կախված է C-ի տարբերակից 2.0: Եթե նախագիծը օգտագործում է երկու գրադարանները A և B, կախվածությունների կառավարիչը (օրինակ, CocoaPods, Carthage, Swift Package Manager) պետք է ընտրի, թե որ տարբերակը C գրադարանի ներգրավի:
- Անհամատեղելի API-ներ: Տարբեր տարբերակները նույն գրադարանի կարող են ունենալ անհամատեղելի փոփոխություններ API-ում: Եթե կախվածությունների կառավարիչը ընտրի ավելի նոր տարբերակ, բայց որոշ կախվածություններ նախագծից սպասում են հին տարբերակի API-ին, դա կհանգեցնի կոմպիլյացիայի կամ գործարկման սխալների:
- Կախվածությունների լուծում: Կախվածությունների կառավարիչը կարող է փորձել գտնել ընդհանուր կախվածության տարբերակ, որը բավարարում է բոլոր կախված գրադարանների պահանջները: Դա միշտ չէ, որ հնարավոր է, հատկապես եթե պահանջները հակասում են (օրինակ, մի գրադարան պահանջում է
>= 1.0, մյուսը< 2.0և< 1.5): - Տեղական (Carthage): Երբ օգտագործվում է Carthage-ը, որը հավաքում է կախվածությունները որպես շրջանակներ, յուրաքանչյուր կախվածություն կարող է հավաքվել իր տարբերակով ընդհանուր կախվածությունից: Դա կարող է հանգեցնել նույն գրադարանի տարբեր տարբերակների ներառմանը վերջնական բանդլում, ինչը կարող է առաջացնել սիմվոլների հակասություններ կամ անսպասելի վարքագիծ:
Անհատական նշաններ:
- Կոմպիլյացիայի սխալներ, որոնք կապված են բացակա սիմվոլների կամ անհամատեղելի տիպերի հետ:
- Գործարկման սխալներ, ինչպիսիք են
dyld: Library not loadedկամ սեգմենտացիայի սխալներ սիմվոլների հակասությունների պատճառով: - Անհասկանալի վարքագիծ ծրագրի, որը կարող է դժվար լինել հետևել:
Օրինակ (CocoaPods):
Ենթադրենք, ձեր Podfile-ը выглядел է այնպես.
# Podfile
platform :ios, '13.0'
use_frameworks!
target 'MyTarget' do
pod 'LibraryA', '~> 1.0' # LibraryA կախված է Alamofire ~> 5.0
pod 'LibraryB', '~> 2.0' # LibraryB կախված է Alamofire ~> 5.5
end
CocoaPods-ը փորձելու է գտնել Alamofire տարբերակը, որը բավարարում է երկու պահանջներին (~> 5.0 և ~> 5.5): Նա հավանաբար ընտրելու է ամենաբարձր համապատասխան տարբերակը (օրինակ, Alamofire 5.5), բայց եթե LibraryA-ն ամբողջությամբ համատեղ չէ Alamofire 5.5 API-ի հետ, կարող են առաջանալ խնդիրներ:
Ելք:
- Թարմացումներ կախվածություններից: Փորձեք թարմացնել բոլոր կախվածությունները վերջին տարբերակներին, որոնք միմյանց հետ համատեղելի են:
- Տեղեկատվության սահմանում: Սահմանել կախվածությունների տարբերակները խստորեն (օրինակ,
pod 'LibraryA', '= 1.0.0'): Դա կարող է օգտակար լինել, բայց դժվարացնում է հետագա թարմացումները: - Վերլուծություն կախվածություններից: Օգտագործել կախվածությունների կառավարիչների հրամաններ (
pod outdated,pod repo update)՝ հասկանալու ծառը և հայտնաբերելու հակասությունները: - Իզոլացիա (չ միշտ կիրառելի): Հետաքրքիր դեպքերում, կարող եք մտածել խնդրահարույց մասի առանձնացման մասին՝ օգտագործելով առանձին շրջանակներ, բայց դա բարդացնում է ճարտարապետությունը:
- SPM օգտագործում: Swift Package Manager-ը ավելի խիստ լուծում է տրամադրում և կարող է արագ հայտնաբերել հակասությունները:
- Vendorizing: Վերջին միջոցառմամբ, կարող եք ներառել խնդրահարույց կախվածության աղբյուրային կոդը ուղղակի նախագծում, բայց դա շատ ցանկալի չէ:
Վերոնշյալ խնդիրները պահանջում են ուշադիր կառավարում և պարբերական աուդիտներ։