ГенерацияXcode-проекта

讲解

project.pbxproj的Решениепроблемыmerge-конфликтов

是iOS上的“Наверняка”,是“резолва”的merge-конфликтов。 Есликонфликтуютизменениявисходныхфайлах,тотутнетособойболи,всезакономерно。 Xcode-проектаproject.pbxproj中的Другоедело,когдаконфликты,ведьихсложнеерешатьиони。 Носамаябольшаядосадавтом,чтотакиеконфликтынеоправданы,ведьзачастуюонипоявляютсяприпростомдобавленииилиперемещениифайловвсливаемыхветках。

Вчемпроблема?

使用project.pbxproj васлантельбазойданныхислишкоммногонасебяберет:

  • структурупроекта
  • настройкипроекта
  • настройкикаждоготаргета
  • индексациюфайловисходников

Ковсемупрочему, project.pbxproj属性列表(NeXTSTEP)тере

Такимобразом,индексацияисходныхфайловвproject.pbxprojприводиткконфликтам,которыеневозоое

РазфайлыXcode-проектатакиепроблемные,топорабыихудалитьипрописатьв.gitignore。 Нетпроекта–нетпроблем!

Акактогдадолжнобыть?

Намноголучшеиметьотдельныйфайлдлянастроекпроектасболееудобнымдляредактированияформатомивозможностьюуказатьпапку,иерархияфайловвкоторойиявляласьбыиерархиейисходников。

Ноневсетакпросто:Xcodeничегонезнаетоструктуретакогопроекта,и,соответственно,несможет。 在CocoaPods和Fastlane上创建project.pbxproj

Поэтомувыхододин–генерироватьэфемерныйXcode-проектисключительнонавремяразработкиисборки。

Ксчастью,естьготовыерешения,которыекакразудовлетворяютэтимтребованиям:XcodeGen, 结构,Xcake。 Самымпопулярнымсрединих,GitHub的судяпорейтингу, XcodeGen ,евомыиразберемнапримере。

XcodeGen吗?

XcodeGen – XcodeGen –Xcode-проектаинструменткоманднойстроки,

  xcodegen生成 

Котораяпринимаетследующиепараметры:

  • --spec :опциональныйпутькфайлуспецификациипроекта。 По-умолчаниюиспользуетсяproject.yml。
  • --project :опциональныйпутькпапке,вкоторойбудетсгенерированпроект。 По-умолчаниюиспользуетсяпапка,在которойнаходитсяспецификация。
  • --use-cache :флагиспользованиякэшадляпредотвращениягенерациипроектавслучае,еслиниси
  • --cache-path :опциональныйпутькфайлукэша。 По-умолчаниюиспользуется〜 ~/.xcodegen/cache/{PROJECT_SPEC_PATH_HASH}

Чтотакоеспецификация?

Спецификация–этодокумент,вкоторомописанывсепараметрыпроекта:конфигурации,настройкисбор。

XcodeGen的XAML代码:YAML和JSON。 YAMLЛучшевыбратьпонесколькимпричинам:

  • XcodeGen的XcodeGen或используетсяипримерахспецификаций
  • используетсявомножестведругихинструментовiOS-разработки(SwiftLint,Jazzy,TravisCI,CircleCI,Codecovит.д.)。
  • прощечитаетсяиредактируется

Какустановить?

УстановитьXcodeGen注释:

  • 薄荷: mint install yonaskolb/xcodegen
  • спомощьюменеджерапакетов自制软件: brew install xcodegen
  • вручную,скачавzip-архивсвежегорелизаизрепозитория

Имеетсмыслрассмотретьпоследнийвариантвслучае,есливпроектеиспользуетсясивот。 Длялокальнойжегенерацииподойдетлюбойспособ。

КакгенерироватьXcode-проект?

ДлядемонстрациишаговинтеграцииXcodeGen的代码

  git clone https://github.com/almazrafi/XcodeGenDemo.git 

Далее,откройтепроектиознакомьтесьсегоструктурой。

Онсостоитизодногоэкрана,ноимеетнепростуюконфигурацию,чтопозволитнамзахватитекакоонн

墨西哥

Параметрыпроекта

Создайтевкорневойпапкепроектафайлproject.yml。

 名称:XcodeGenDemo 
 配置: 
生产:发布
分期:发布
调试:调试
 选项: 
minimumXcodeGenVersion:2.3.0
deploymentTarget:
iOS:10.0
defaultConfig:生产
groupSortPosition:顶部
语言:ru

Здесьопределеныпараметрыпроекта,разберемназначениекаждогоизних:

  • name :XcodeGenDemo,XcodeGenDemo,Xcode-проекта(.xcodeproj)。
  • configsProductionStagingDebug ; каждыйизкоторыхимеетопределенныйтипсборки( release илиdebug)。
  • options :дляперечисленныхопциипереопределяемповедениепо-умолчанию。 Всегоопцийгораздобольше,сполнымспискомможноознакомитьсяпопрямойссыылке。
  • minimumXcodeGenVersion :указываем,чтодлягенерациипроектатребуетсяXcodeGenверсиинениже2.3.0。
  • deploymentTarget :在iOS操作系统中将10.0到вотраничиваемпроекттолькоплатформой。
  • defaultConfigProduction (см。configs)的качествеконфигурациипо-умолчаниюдлясборкиизкоманднойстроки(xcode build xcodebuild build )。
  • groupSortPosition :указываем,чтовнавигаторепроектапапкидолжныбытьвверхусписка。
  • developmentLanguage :UI界面上的устанавливаемрусскийвкачествеязыкатекстов。

Теперьпопробуемсгенерироватьнашпроект,请使用xcodegen generate Xcodegen的XcodeGenSample.xcodeproj

Всеконфигурациинаместе,нонетниодноготаргета,донихмыдойдемпозже,сначаларазберемсяс。

Настройкисборки

Добавьтевконецфайлаproject.ymlследующиестроки:

 设置: 
基础:
SWIFT_VERSION:5.0
TARGETED_DEVICE_FAMILY:1
配置:
生产:
ENABLE_TESTABILITY:否
SWIFT_COMPILATION_MODE:整个模块
SWIFT_OPTIMIZATION_LEVEL:-O
VALIDATE_PRODUCT:是
分期:
ENABLE_TESTABILITY:否
SWIFT_ACTIVE_COMPILATION_CONDITIONS:定单
SWIFT_COMPILATION_MODE:整个模块
SWIFT_OPTIMIZATION_LEVEL:-O
VALIDATE_PRODUCT:是
调试:
ENABLE_TESTABILITY:是
SWIFT_COMPILATION_MODE:单个文件
SWIFT_OPTIMIZATION_LEVEL:-Onone
VALIDATE_PRODUCT:否

Это,пожалуй,самаяскучнаячастьспецификации,здесьопределенынастройкисборки,ихструктуратаков

  • base :базовыенастройкидлявсехконфигураций。
  • configs :наст​​ройки,специфичныедляперечисленныхконфигурацииProduction, Staging ,иDebug; онипереопределяютбазовыенастройки( base )。

Приэтомсаминастройкиобъявляютсяв“сыром”виде。 显示设置中的“名称 “设置”“设置”“设置”“设置”

,топозволитвидетьназванияизначениянастроеквтомвиде,以及которомихнеобходимоуказатьвспец。

Внимание :Нетнеобходимостипереноситьвсенастройки,навернякамногиеизнихимеютзначенияпо-умол。 Следуетперенеститолькоте,которыедействительноотличаютсявсгенерированноопроекте。

《构建设置参考》中的Еслипокаким-либонастройкамвозникаютвопросы,описаниекнимможнонайти。

Таргеты

Вотмыидобралисьдосамойинтереснойчастиспецификации,ктаргетам。 Всеониперечисляются的targets ,如которомключомявляетсяимятаргета,以及значениемегопарамете。

ДляспецификациинашеготаргетаApp,在project.yml добавьтевконец。

 目标: 
应用程式:
类型:应用
平台:iOS
deploymentTarget:10.0
资料来源:
-路径:App
不包括:
-Readme.txt
configFiles:
生产:App / Configuration / Production.xcconfig
登台:App / Configuration / Staging.xcconfig
调试:App / Configuration / Debug.xcconfig
设置:
基础:
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES:$(继承)
CODE_SIGN_IDENTITY:iPhone开发人员
CODE_SIGN_STYLE:自动
DEVELOPMENT_TEAM:LV744N3C27
DEFINES_MODULE:是
INFOPLIST_FILE:App / Info.plist
PRODUCT_BUNDLE_IDENTIFIER:com.self.XcodeGenDemo
TARGETED_DEVICE_FAMILY:1
XCODEGEN_STATE:是
配置:
生产:
ASSETCATALOG_COMPILER_APPICON_NAME:AppIcon
分期:
ASSETCATALOG_COMPILER_APPICON_NAME:AppIconStaging
调试:
ASSETCATALOG_COMPILER_APPICON_NAME:AppIconDebug
方案:
环境变量:
DYLD_PRINT_STATISTICS:1
postCompileScripts:
-脚本:|
如果哪个swiftlint> / dev / null; 然后
swiftlint-无缓存
科幻
名称:SwiftLint

Выглядитмассивно,нонасамомделевседостаточнопросто:

  • type :указываемтиппродукта–приложение。 .тополеопределяетнастройкисборкипо-умолчанию。
  • platform :ограничиваемтаргетцелевойплатформойiOS iOS 10.0ввыше。
  • sources :перечисляемпутикисходнымфайламтаргета。 УнастолькооднапапкаApp, path которуюмыуказываемвпо。 Чтобыисключитькакие-либофайлыизпроекта,перечисляемихотносительныепутивполе excludes ,在此显示。 Приэтом,еслипапкаоднаинетисключенийипрочихопций,тоэтуконструкциюможнооонносокраоио:
  • configFiles :указываемсоответствующиепутикфайлам.xcconfigдлякаждойконфигурации。
  • settings :переопределяемнастройкисборки。 ,тополеужезнакомонампоспецификациипроекта,然后在ниходнаитаже。
  • scheme :наст​​раиваемавто-генерируемуюсхемутаргета。 DYLD_PRINT_STATISTICS , Есливозможностейданногенедостаточно,对отдельноеполе schemes Подробнееоеговозможностяхможнопочитатьздесь。
  • postCompileScripts :перечисляемскрипты,выполняемыепослешагакомпиляцииисходников。 Унашегопроектатокьйскрипт–запускпроверкикодапосредствомSwiftLint, XcodeGen script path script

Наэтомспецификациязавершена。 Далее, xcodegen generate иоткройтеполучившийсяпроект。

Всеполностьюнастроеноиготовокработе,соберитеизапуститеприложение。

Убедившись,чтовсеработает,можносмелодобавитьфайл.xcodeproj或.gitignore -конфли。

Неужеливсе?

Такимобразом,мыдетальноразобралигенерациюпроектапосредствомXcodeGen。 ,тобезусловномощныйинструмент,возможностикоторогоневозможнопродемонстрироватьоднимпримером。

Отдельностоитотметить,чтоXcodeGenпостояннообновляетсяиактивноразвивается。 Запарунедельподготовкистатьи,从2.3.0到2.5.0。

Начтообратитьвнимание?

Теперь,когда的Xcode-проектсталявлениемвременнымилокальным,необходимопривыкнуть,чтоизменениенастроекпроектаследуетпроизводитьвфайлеспецификации。

Касательнофайловойструктурыпроекта,тутвсепо-старому:добавление,удалениеиперемещениефайловпроисходиткакобычно,таккактеперьихиндексациянеимеетзначения。

Чтосменеджерамизависимостей?

Командам,использующим迦太基,XcodeGenпридетсяособенноподушеиз-завозможноиинеобин Всеостальныешагибудутпроделаныавтоматическипригенерациипроекта。

С的CocoaPodsжесложнее,необходимовыполнятьпереустановкуподов( pod install )послекаждойгенерациипроекта,чтолегкорешаетсязаменойкоманды xcodegen generate накомандузапускапростогоскрипта:

  #!/ bin / sh 
xcodegen generate
pod install

Пока!

Еслиувасосталисьвопросы,будурадпомочьвкомментариях。 Спасибозавнимание。