Rambler.iOS #6 - Не рычите на pbxproj
-
Upload
rambler-ios -
Category
Mobile
-
view
284 -
download
8
Transcript of Rambler.iOS #6 - Не рычите на pbxproj
Не рычите на pbxproj
Дима Журавленко Architech NYC
План• Пример.
• Структура .pbxproj.
• Причины конфликтов и их виды.
• Вариант решения проблемы.
• Другие решения.
• Статистика реального проекта.
Bob & Alice
VIPER TODOBy Jeff Gilbert
and Conrad Stoll
https://github.com/objcio/issue-13-viper
a lot of files…
weekOverview
develop
Добавим фичу
develop
weekOverview
Опс…
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.
WTF?
WTF?develop working copy feature
Структура pbxproj
•
XCVersionGroupXCConfigurationListXCBuildConfigurationPBXVariantGroupPBXTargetDependencyPBXSourcesBuildPhasePBXResourcesBuildPhasePBXProjectPBXNativeTargetPBXGroupPBXFrameworksBuildPhasePBXFileReferencePBXContainerItemProxyPBXBuildFile
PBXFileReference
PBXFileReference557C64D6192A782C008AF5BA /* main.m */ = {
isa = PBXFileReference;
lastKnownFileType = sourcecode.c.objc;
path = main.m; sourceTree = "<group>";
};
PBXBuildFile
PBXBuildFile557C64D6192A782C008AF5BA /* main.m in Sources */ = {
isa = PBXBuildFile;
fileRef = BA557C64D6192A782C008AF5 /*main.m*/;
settings = {COMPILER_FLAGS = "-Weverything"; };
};
PBXGroupReference
PBXGroupReferenceF5557C64D1192A782C008ABA /* Supporting Files */ = {
isa = PBXGroup; children = (
6ABA5EB61C3867AF0038F408/*Warnings.xcconfig*/, 557C64D6192A782C008AF5BA /* main.m */,
); name = "Supporting Files";
};
Дерево проекта
Что произойдёт?PBXFileRef
PBXGroupRef
PBXBuildFile
Синдром последней строкиPBXFileRef Section
Разделяй и …559998DA192E71040093721B TODO.xcdatamodeld
559998DB192E71040093721B VTDCoreDataStore.m
559998DE192E71460093721B VTDTodoItem.m
6ABA5E961C3862760038F408 VTDOverviewPresenter.m
6ABA5E991C3862760038F408 VTDOverviewDismissalTransition.m
6ABA5E9C1C3862760038F408 VTDOverviewPresentationTransition.m
Разделяй и …PBXFileRef Section
WTF?develop working copy feature
Конфликт в FileRef
Конфликт в PBXGroup
Group conflict example
xUnique
1. Вычислить полный путь
PBXFileReference[ PBXGroup[
PBXGroup[ PBXGroup[
VIPER TODO.xcodeproj/PBXRootGroup ]
/VIPER TODO] /Supporting Files]
/main.m]
2. Посчитать новый UUID6BD2096FFF62E3584F570869C74C172 /* main.m */ = {
isa = PBXFileReference;
lastKnownFileType = sourcecode.c.objc;
path = main.m; sourceTree = "<group>";
};
md5 ( <Full path> )
3.Отсортировать
A → Z
Слитьdevelop featureworking copy
Интеграция
Post action
xunique “${PROJECT_FILE_PATH}/project.pbxproj”
Git pre-commit hook
#!/bin/bashxunique -c “path/to/your/project.pbxproj
Другие варианты
• SOCK (pysock)
• стратегия слияния git “union”
• pbxmerge
• генерация 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
СтатистикаДо
52%
10%
39%
конфликты pbxprojдругие конфликтынормальное слияние
После
6%2%
92%
Вот так-то лучше
develop
weekOverview
develop
develop
weekOverview
merge
rebase