Sobes.tech
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: Վերջին միջոցառմամբ, կարող եք ներառել խնդրահարույց կախվածության աղբյուրային կոդը ուղղակի նախագծում, բայց դա շատ ցանկալի չէ:

Վերոնշյալ խնդիրները պահանջում են ուշադիր կառավարում և պարբերական աուդիտներ։