Erk Ekin
Mach-O blog

Mach-O blog

iOS geli┼čtiricisinin metamorfozu: tuist

­čĹő pbxproj, xcodeproj, xcworkspace ­čĹő yallah gitignore'a

Erk Ekin's photo
Erk Ekin
┬ĚMay 22, 2022┬Ě

7 min read

iOS geli┼čtiricisinin metamorfozu: tuist

├çal─▒┼čt─▒─č─▒m ┼čirketlerde en ├žok dalga ge├žti─čimiz program bu ├žeki├ž logolu program oldu: internet 'meme'leri yapt─▒k payla┼čt─▒k, Slack'e garip ekran g├Âr├╝nt├╝leri g├Ânderdik, thread'lerde kah g├╝ld├╝k kah e─člendik. Visual Studio'ya ve Intellij'ci Android ya da backend yazan i┼č arkada┼člar─▒m─▒z─▒n b─▒y─▒k alt─▒ndan bak─▒┼člar─▒na hen├╝z hi├ž geri vole vuramad─▒k. Xcode update'lerinden umudu ├žoktan kestik, yeter ki daha ├žok bozulmas─▒n, elimizdekinden olmayal─▒m. S├╝rekli crash olan, kod kayb─▒ ya┼čatan, devasa b├╝y├╝k, xib'ten unarchive etmesi bile en az yar─▒m saatinizi alan hantal bir uygulama bu. Ha [AppCode]( AppCode: Smart Swift/Objective-C IDE for iOS & macOS ...jetbrains.com ÔÇ║ o... ) daha m─▒ iyi? Yok onu da denedik g├Ârd├╝k, ayn─▒s─▒n─▒n ba┼čka bir rengi. Ne yapal─▒m, zevk almaya bakaca─č─▒z. En az zararla kodumuzu yazabilirsek, o da iyi.

Xcode bu kadar k├Ât├╝ olunca, Xcode projeleri, yani o ├žift t─▒klay─▒p a├žt─▒─č─▒m─▒z .xcodeproj ya da .xcworkspace klas├Ârleri ve i├žindeki dosyalar─▒n yap─▒lar─▒ da bir garip olmu┼č tabii ki. Android'├žiler XML ile UI yap─▒yor diye dalga ge├žiyoruz, o zaman kendimize d├Ân├╝p koskoca projeyi b├Âyle standart olmayan bir formatta aya─ča kald─▒rmak nedir demek, ├žuvald─▒z─▒ biraz kendimize de bat─▒rmam─▒z gerekir.

A┼ča─č─▒da biraz sonra tuist ile olu┼čturaca─č─▒m projenin pbxproj dosyas─▒ndan bir ├Ârnek. ­čĄ«

/* Begin PBXBuildFile section */
        1F44150A659AA0555426C718 /* ProjemUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70CE45157BA22C3F39682339 /* ProjemUI.framework */; };
        4117A4AB964C06CD27106B77 /* ProjemTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 043163F177A27A253712F23C /* ProjemTests.swift */; };
        5193730CDE078B6405F2A976 /* Assets+Projem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 
{ ... }
{ ... }
        B2B4032F0086DB46D82FAAC3 /* ProjemKitTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BEC96509FC38E0CCF15225BB /* ProjemKitTests.swift */; };
        C8FA70ECEE39C955495655C4 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 01BD1BAB864AF3BE9C68D81D /* Assets.xcassets */; };
        FBB6AC91D22F871F1246666C /* ProjemApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = D786B0E0E85998BF253D881C /* ProjemApp.swift */; };
        FE4B22D8761B836D3CCF1B43 /* ProjemUI.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 70CE45157BA22C3F39682339 /* ProjemUI.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
/* End PBXBuildFile section */

Bu tip tan─▒nmayan bir formatla ├žal─▒┼čman─▒n herhalde en k├Ât├╝ taraf─▒, merge conflict'ler ya da Code Review s├╝recinde g├Ârd├╝─č├╝m├╝z garip rastgele kod de─či┼čiklikleridir. ─░┼č arkada┼č─▒n─▒zla proje dosyas─▒n─▒n birbirine yak─▒n yerlerini mi de─či┼čtiriyorsunuz, conflict ├ž─▒kmas─▒ ├žok olas─▒ ve bu conflict'i iyi ├ž├Âzemezsen proje a├ž─▒lmaz ├Âyle kal─▒rs─▒n, al bakal─▒m ┼čimdi o merge i┼člemini geri, ba┼čka bir rastgele ├ž├Âz├╝m dene, bunlar─▒ ya┼čad─▒k g├Ârd├╝k. Zaten bu y├╝zden vazge├žmedik mi yine XML formunda saklanan Storyboard'lardan, XIB'lerden?

2015'te, Apple, Swift Package Manager (SPM) projesini open source yap─▒nca t├╝m iOS'├žular kodu incelemeye ba┼člad─▒k, en az─▒ndan swift dilinin kendisi gibi c++ ile de─čil swift ile yaz─▒ld─▒─č─▒ i├žin biraz anl─▒yorduk, anlaman─▒n ├Âtesine gidenler projeye katk─▒ yapt─▒lar, projedeki baz─▒ inovasyonlar─▒ kendi projelerinde kulland─▒lar, o d├Ânem bir SPM dependency kambriyen patlamas─▒ ya┼čand─▒, binlerce SPM projesi ortaya ├ž─▒kt─▒ ve GitHub'da payla┼č─▒ld─▒. Bug├╝n bu repolar bir index'te toplan─▒yor.

Birka├ž merakl─▒ ekip SPM projesinin i├žerisinde, Xcode projesi olu┼čturan k─▒s─▒mla ilgilendi. Bildi─činiz gibi SPM package'lar─▒ bir Xcode projesine ihtiya├ž duymuyor. Xcode'dan Open Project diyip SPM projenizin klas├Âr├╝n├╝ g├Âsterince proje olmasa da Xcode'da a├žabiliyorsunuz. Ancak siz yine de proje ile ├žal─▒┼čaca─č─▒m derseniz o zaman --generate-project diyip o berbat pbxproj dosyas─▒n─▒ yarat─▒p Xcode'da eskisi gibi a├žabiliyorsunuz.

─░┼čte bahsetti─čim merakl─▒ ekip open source SPM projesindeki bu generator k─▒sm─▒n─▒ ald─▒ ve h─▒zl─▒ca yeni bir proje yaratt─▒lar. XcodeGen, xcake ve konumuz tuist b├Âylece hayata gelmi┼č oldu.

Di─čer alternatifleri ge├žiyorum, tuist k─▒saca, Cocoa projenizi Xcode projesi olmadan y├Ânetmenizi sa─čl─▒yor. Bunu Android'├žilerin y─▒llard─▒r a┼čina oldu─ču tarzda bir manifest dosyas─▒ ├╝zerinden yap─▒yor. Siz yaln─▒zca root klas├Âr├╝n├╝zde bir Project.swift dosyas─▒ yarat─▒yorsunuz, bunun i├žerisinde Xcode projesinde yapt─▒─č─▒n─▒z ayarlar─▒ giriyorsunuz ard─▒ndan $ tuist generate komutu ile Xcode projeniz olu┼čturuluyor, zaten bundan sonras─▒ ayn─▒ eskisi gibi, kodunuzu build ediyorsunuz ve aynen devam.

Bu durumda kar ediyorsunuz ├ž├╝nk├╝ art─▒k o bahsetti─čimiz .xcodeproj ya da .xcworkspace klas├Ârlerinizi .gitignore'a ekliyorsunuz, bu veda demek: art─▒k code review s├╝recinde bu sa├žma dosyan─▒n i├žeri─čini g├Ârmeyeceksiniz demek, i┼č arkada┼č─▒n─▒z h─▒zl─▒ca ge├žmek zorunda kalmayacak, yani art─▒k ba┼č a─čr─▒s─▒ yok. Her proje ayar─▒, zaten a┼čina oldu─čumuz, ustas─▒ oldu─čumuz swift diliyle yaz─▒l─▒yor. Zaten bu y├╝zden Cocoapods'tan da SPM'e ge├žmi┼čtik, ruby de neydi? ─░nsan─▒n evi gibi yoktu.

Bu noktadan sonras─▒ art─▒k yaparak ├Â─črenme. tuist'i kullanman─▒n birka├ž yolu var, biz binary'sini repomuzda sakl─▒yoruz, CI'da onu ├žal─▒┼čt─▒r─▒yoruz. Kodu clone'lad─▒─č─▒m─▒zda localimizde de bu binary'yi kullan─▒yoruz b├Âylece b├╝y├╝k bir ekipte herkesin ayn─▒ versiyonda oldu─čundan ve ayn─▒ binary'yi kulland─▒─č─▒ndan emin olabiliyoruz. Bu tip k─▒s─▒tlar b├╝y├╝k bir ekipte ├žal─▒┼čman─▒n en ├Ânemli ┼čart─▒ olabilir.

tuist'in nas─▒l kurulaca─č─▒n─▒ burada yazmayaca─č─▒m, ├ž├╝nk├╝ zaten README'sinde yaz─▒yor. Sadece ilk projenizi aya─ča kald─▒rman─▒z─▒ sa─člayaca─č─▒m, ard─▒ndan aradan ├žekilece─čim.

tuist'i lokal mac'inize kurduktan sonra, terminalinizden Desktop'a gidin ve a┼ča─č─▒daki komutlar─▒ ├žal─▒┼čt─▒r─▒n.

mkdir Projem
cd Projem
tuist init --platform ios --template swiftui
tuist generate --no-open

Bu komutlar taze Projem klas├Âr├╝n├╝zde bir Xcode projesi olu┼čturacakt─▒r. Ben ┼ču anda 3.4.0 versiyonunday─▒m, bu versiyonda, Projem klas├Âr├╝nde a┼ča─č─▒daki Project.swift dosyas─▒ olu┼čtu (commentleri att─▒m).

import ProjectDescription
import ProjectDescriptionHelpers
import MyPlugin

let localHelper = LocalHelper(name: "MyPlugin")
let project = Project.app(name: "Projem",
                          platform: .iOS,
                          additionalTargets: ["ProjemKit", "ProjemUI"])

Farkedildi─či ├╝zere burada Projem ad─▒nda bir iOS projesi yarat─▒l─▒p alt─▒na ProjemKit ve ProjemUI ad─▒nda iki adet target eklenmi┼č durumda. Yeni bir target eklemek i├žin ["ProjemKit", "ProjemUI"] array'ine bir┼čey ekleyin ve tuist generate komutunu tekrar ├žal─▒┼čt─▒r─▒n.

Burada biraz trick yap─▒lm─▒┼č, yani ilk kullan─▒c─▒ etkilensin diye bir├žok ┼čey abstract edilmi┼č. As─▒l target'lar─▒n olu┼čturuldu─ču yere gidelim.

open Tuist/ProjectDescriptionHelpers/Project+Templates.swift

Buradaki commentleri ve kodu inceleyin, fikir verecektir.

Ekstralar: Herhangi bir tuist alt komutunun yan─▒na -h yazarak alt komutla ilgili yard─▒m alabilirsiniz.

tuist -h
tuist generate -h
tuist cache -h

Halihaz─▒rdaki bir projeyi tuistÔÇÖe ├ževirmek

Bir├žo─čunuzun senaryosu bu olacakt─▒r. Bizim 30-40 featureÔÇÖl├╝, 15 dkÔÇÖda build olan projemizi tamamen tuistÔÇÖe ge├žirmek birka├ž ay─▒m─▒z─▒ ald─▒. ─░┼čin g├╝zel yan─▒ proje mod├╝ler olunca mod├╝l mod├╝l ilerliyorsunuz bu da migrationÔÇÖ─▒ kolayla┼čt─▒r─▒yor.

Migration i├žin en iyi ba┼člang─▒├ž, XcodeÔÇÖda el ile yapt─▒─č─▒n─▒z ayarlar─▒ xcconfig dosyalar─▒na ├ževirmek. D├Âk├╝mantasyonda bu i┼člem de anlat─▒lm─▒┼č, tuist migration toolÔÇÖu gayet i┼č g├Âr├╝yor, yetmedi─či yerlerde i┼č ba┼ča d├╝┼č├╝yor ama olacak o kadar.

tuist i├žin open source contributor olmak

tuist open source projesinin readme'sini incelerseniz orada ismimi g├Âr├╝rs├╝n├╝z. Buraya girmek i├žin ger├žekten hi├ž ├žaba sarfetmedim. ├çal─▒┼čt─▒─č─▒m ┼čirketin projesine tuist'in cache ve test ├Âzelliklerini eklemek i├žin u─čra┼čt─▒─č─▒mda, bu komutlar─▒n bizim projemizde ├žal─▒┼čmad─▒─č─▒n─▒ farkettim. Ard─▒ndan ara┼čt─▒rmaya ba┼člad─▒m, ilk yapt─▒─č─▒m i┼č tuist'i lokalime klonlamak ve ayn─▒ komutlar─▒ ├žal─▒┼čt─▒r─▒rken tuist'i debug etmek oldu. Bu a┼čamada birka├ž bug buldum. Hemen GitHub issue's├╝ a├žmak yerine problemi ├ž├Âzmeye ├žal─▒┼čt─▒m. Birka├ž tanesini ├ž├Âz├╝nce bunlar─▒ Pull Request'ler a├ž─▒p ekiple payla┼čt─▒m. Slack gruplar─▒na girdim tart─▒┼čt─▒m, derken birka├ž PR'─▒m merge oldu ve beni eklediler.

Projeye katk─▒ yaparken zorland─▒─č─▒m konu Xcode ve tuist versiyonlar─▒ aras─▒ndaki uyumsuzluk oldu, ayr─▒ca tuist'i debug modda aya─ča kald─▒rmak i├žin yine ayn─▒ ekip taraf─▒ndan geli┼čtirilip tuist repo i├žine koyulan fourier adl─▒ ruby scriptini de ├žal─▒┼čt─▒rmak gerekti. Ruby'nin kendisini ve gem'lerini kurmak bir i┼čkence zaten, ├Âzellikle proxy arkas─▒ndaysan─▒z. Bunu da komuta --http-proxy arg├╝man─▒yla ilgili proxy'nin linkini vererek ├ž├Âzd├╝m.

Bu yaz─▒da yaln─▒zca Xcode'un proje dosyas─▒ndan dem vurarak sizi motive etmeye ├žal─▒┼čt─▒m ancak projeyi tuist'e ta┼č─▒man─▒n ├žok fazla art─▒ taraf─▒ var. Bunlardan benim i├žin en ├Ânemlisi ise tuist cache. E─čer projenizi mod├╝lerle┼čtirdiyseniz her mod├╝l├╝ izole bir bi├žimde generate edebiliyorsunuz, bununla da kalm─▒yor bu mod├╝l├╝n dependency'lerini cache'leyip build zamanlar─▒n─▒ dramatik ├Âl├ž├╝de k─▒saltabiliyorsunuz. ├ľrne─čin 10 dk s├╝ren bir incremental build oluyor sana 15 sn. Tabii deneyimli okuyucu Computer Science'─▒n en b├╝y├╝k iki probleminden ikincisinin cache y├Ânetimi oldu─čunu biliyor olacakt─▒r.

Di─čeri tuist test. Bu da projedeki t├╝m testleri bir kez ├žal─▒┼čt─▒rd─▒ktan sonra, e─čer herhangi bir mod├╝l├╝n i├žindeki dosyaya ve dependency'lerine dokunmad─▒ysan─▒z o mod├╝l├╝n testlerini atl─▒yor b├Âylece yine zaman tasarrufu sa─čl─▒yorsunuz.

E─čer mikro architecture (╬╝Feature) yap─▒s─▒ndan yararlan─▒yorsan─▒z, tuist yeni feature eklemeniz i├žin scaffold ├Âzelli─čiyle bir ├žok boilerplate kodu kendi yarat─▒yor size de sadece Project.swift dosyalar─▒n─▒ modifiye etmek kal─▒yor. Bunu biz ekibimizde ├žok kullan─▒yoruz.

Bir ba┼čka baba ├Âzellik ise tuist graph. Projenin yap─▒s─▒n─▒ grafik halinde ├ž─▒kt─▒ veriyor. A┼ča─č─▒da benim oyunumun ├ž─▒kt─▒s─▒ndan bir ├Ârnek.

graph.png

Bu kadar bilgiden sonra okuyucuyu tuist'in d├Âk├╝mantasyonuna y├Ânlendirece─čim. Pek sa─člam bir docs say─▒lmaz ancak baya fikir veriyor. Docs i├žinde ├Âzellikle ╬╝Feature k─▒sm─▒n─▒ her iOS developer'a tavsiye ederim.

Sevgili dostlar, bu tip trendleri takip etmenin hep yarar─▒n─▒ g├Ârd├╝m. Belki baz─▒n─▒za bunlar overengineering gibi gelecektir. Evet ├Âzellikle k├╝├ž├╝k bir projede ger├žekten ├Âyle ama i┼člerin b├╝y├╝yece─či g├╝n buna ge├žmeniz projenin sustainability'si a├ž─▒s─▒ndan kesin yararl─▒ olacakt─▒r. Ben yeni projelerime size'lar─▒ndan ba─č─▒ms─▒z tuist ile ba┼čl─▒yorum, hem familiarity a├ž─▒s─▒ndan hem de ekip en son hangi ├Âzelli─či eklemi┼č ├Â─črenmek a├ž─▒s─▒ndan hep yarar─▒n─▒ g├Ârd├╝m.

E─čer kendi ekibinize tuist dersi vermemi isterseniz bana LinkedIn'den ula┼č─▒n─▒z, yard─▒m ederim.

Referanslar

Did you find this article valuable?

Support Erk Ekin by becoming a sponsor. Any amount is appreciated!

Learn more about Hashnode Sponsors
 
Share this