Rambler.iOS #6 - Не рычите на pbxproj

37
Не рычите на pbxproj Дима Журавленко Architech NYC

Transcript of Rambler.iOS #6 - Не рычите на pbxproj

Page 1: Rambler.iOS #6 - Не рычите на pbxproj

Не рычите на pbxproj

Дима Журавленко Architech NYC

Page 2: Rambler.iOS #6 - Не рычите на pbxproj

План• Пример.

• Структура .pbxproj.

• Причины конфликтов и их виды.

• Вариант решения проблемы.

• Другие решения.

• Статистика реального проекта.

Page 3: Rambler.iOS #6 - Не рычите на pbxproj

Bob & Alice

Page 4: Rambler.iOS #6 - Не рычите на pbxproj

VIPER TODOBy Jeff Gilbert

and Conrad Stoll

https://github.com/objcio/issue-13-viper

a lot of files…

Page 5: Rambler.iOS #6 - Не рычите на pbxproj

weekOverview

develop

Добавим фичу

Page 6: Rambler.iOS #6 - Не рычите на pbxproj

develop

weekOverview

Опс…

Page 7: Rambler.iOS #6 - Не рычите на pbxproj

develop

X

Скидыщь!bash$ git merge --no-ff feature/weekOverview

Auto-merging VIPER TODO.xcodeproj/project.pbxproj

CONFLICT (content): Merge conflict in

VIPER TODO.xcodeproj/project.pbxproj

Automatic merge failed; fix conflicts and then commit the result.

Page 8: Rambler.iOS #6 - Не рычите на pbxproj

WTF?

Page 9: Rambler.iOS #6 - Не рычите на pbxproj

WTF?develop working copy feature

Page 10: Rambler.iOS #6 - Не рычите на pbxproj

Структура pbxproj

XCVersionGroupXCConfigurationListXCBuildConfigurationPBXVariantGroupPBXTargetDependencyPBXSourcesBuildPhasePBXResourcesBuildPhasePBXProjectPBXNativeTargetPBXGroupPBXFrameworksBuildPhasePBXFileReferencePBXContainerItemProxyPBXBuildFile

Page 11: Rambler.iOS #6 - Не рычите на pbxproj

PBXFileReference

Page 12: Rambler.iOS #6 - Не рычите на pbxproj

PBXFileReference557C64D6192A782C008AF5BA /* main.m */ = {

isa = PBXFileReference;

lastKnownFileType = sourcecode.c.objc;

path = main.m; sourceTree = "<group>";

};

Page 13: Rambler.iOS #6 - Не рычите на pbxproj

PBXBuildFile

Page 14: Rambler.iOS #6 - Не рычите на pbxproj

PBXBuildFile557C64D6192A782C008AF5BA /* main.m in Sources */ = {

isa = PBXBuildFile;

fileRef = BA557C64D6192A782C008AF5 /*main.m*/;

settings = {COMPILER_FLAGS = "-Weverything"; };

};

Page 15: Rambler.iOS #6 - Не рычите на pbxproj

PBXGroupReference

Page 16: Rambler.iOS #6 - Не рычите на pbxproj

PBXGroupReferenceF5557C64D1192A782C008ABA /* Supporting Files */ = {

isa = PBXGroup; children = (

6ABA5EB61C3867AF0038F408/*Warnings.xcconfig*/, 557C64D6192A782C008AF5BA /* main.m */,

); name = "Supporting Files";

};

Page 17: Rambler.iOS #6 - Не рычите на pbxproj

Дерево проекта

Page 18: Rambler.iOS #6 - Не рычите на pbxproj

Что произойдёт?PBXFileRef

PBXGroupRef

PBXBuildFile

Page 19: Rambler.iOS #6 - Не рычите на pbxproj

Синдром последней строкиPBXFileRef Section

Page 20: Rambler.iOS #6 - Не рычите на pbxproj

Разделяй и …559998DA192E71040093721B TODO.xcdatamodeld

559998DB192E71040093721B VTDCoreDataStore.m

559998DE192E71460093721B VTDTodoItem.m

6ABA5E961C3862760038F408 VTDOverviewPresenter.m

6ABA5E991C3862760038F408 VTDOverviewDismissalTransition.m

6ABA5E9C1C3862760038F408 VTDOverviewPresentationTransition.m

Page 21: Rambler.iOS #6 - Не рычите на pbxproj

Разделяй и …PBXFileRef Section

Page 22: Rambler.iOS #6 - Не рычите на pbxproj

WTF?develop working copy feature

Page 23: Rambler.iOS #6 - Не рычите на pbxproj

Конфликт в FileRef

Page 24: Rambler.iOS #6 - Не рычите на pbxproj

Конфликт в PBXGroup

Page 25: Rambler.iOS #6 - Не рычите на pbxproj

Group conflict example

Page 26: Rambler.iOS #6 - Не рычите на pbxproj

xUnique

Page 27: Rambler.iOS #6 - Не рычите на pbxproj

1. Вычислить полный путь

PBXFileReference[ PBXGroup[

PBXGroup[ PBXGroup[

VIPER TODO.xcodeproj/PBXRootGroup ]

/VIPER TODO] /Supporting Files]

/main.m]

Page 28: Rambler.iOS #6 - Не рычите на pbxproj

2. Посчитать новый UUID6BD2096FFF62E3584F570869C74C172 /* main.m */ = {

isa = PBXFileReference;

lastKnownFileType = sourcecode.c.objc;

path = main.m; sourceTree = "<group>";

};

md5 ( <Full path> )

Page 29: Rambler.iOS #6 - Не рычите на pbxproj

3.Отсортировать

A → Z

Page 30: Rambler.iOS #6 - Не рычите на pbxproj

Слитьdevelop featureworking copy

Page 31: Rambler.iOS #6 - Не рычите на pbxproj

Интеграция

Page 32: Rambler.iOS #6 - Не рычите на pbxproj

Post action

xunique “${PROJECT_FILE_PATH}/project.pbxproj”

Page 33: Rambler.iOS #6 - Не рычите на pbxproj

Git pre-commit hook

#!/bin/bashxunique -c “path/to/your/project.pbxproj

Page 34: Rambler.iOS #6 - Не рычите на pbxproj

Другие варианты

• SOCK (pysock)

• стратегия слияния git “union”

• pbxmerge

• генерация pbxproj

Page 35: Rambler.iOS #6 - Не рычите на pbxproj

Статистика

0

3

6

9

12

15

18

week number

22 23 24 25 26 27 28 29 30 31 32 33 34 35 36

нормальное слияниедругие конфликтыконфликты pbxproj

xUnique

Page 36: Rambler.iOS #6 - Не рычите на pbxproj

СтатистикаДо

52%

10%

39%

конфликты pbxprojдругие конфликтынормальное слияние

После

6%2%

92%

Page 37: Rambler.iOS #6 - Не рычите на pbxproj

Вот так-то лучше

develop

weekOverview

develop

develop

weekOverview

merge

rebase