rambler.ios #6 - Не рычите на pbxproj

Post on 22-Jan-2017

286 Views

Category:

Mobile

8 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Не рычите на 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

top related