Делаем патч для Pods библиотеки
Приветствую друзья на связи автор телеграм канала ReactNative - info, недавно столкнулся с одной интересной проблемой, сборка архива для iOS приложения постоянно завершалась такой ошибкой:
error: Abort trap: 6 (in target 'iOSPhotoEditor' from project 'Pods')
В то время как локальные сборки на эмуляторы и устройства собирались корректно.
Проблема оказалась в файле CropView.swift который лежал в директории Pods, нужно было подкорректировать один блок if(), заменив в нем вызов функции UI_USER_INTERFACE_IDIOM() на UIDevice.current.userInterfaceIdiom.
После этих правок архив собрался успешно, но эти изменения нужно было как-то сохранить, иначе после повторной установки подов их там уже не будет.
На GitHub давно висит issue с этой ошибкой и фиксом на нее, делать новый pull request смысла нет. Создавать свой форк и заливать его на GitHub/CocoaPods показалось бессмысленно ради одной строчки кода. Пришел к выводу что нужно сделать локальный патч который бы применялся после каждой установки подов.
Итак, приступим. Полазив на просторах Google нашел утилиту которая выполняет всю рутину за вас, но у меня ее запустить так и не удалось, но на всякий случай оставлю ссылку (cocoapods-patch).
Также есть второй минус у этого инструмента, его нужно будет установить всем разработчикам в вашем проекте, мой способ ниже позволит избежать этого.
Для начала необходимо сгенерировать diff изменений в проблемном файле. Чтобы это сделать необходимо дублировать наш файл и сделать в нем необходимые правки. Новый файл я назвал CropViewPatched.swift.
Далее из папки iOS проекта в терминале я выполнил следущую команду:
git diff -u ./Pods/iOSPhotoEditor/Photo\ Editor/Photo\ Editor/CropView.swift ./Pods/iOSPhotoEditor/Photo\ Editor/Photo\ Editor/CropViewPatched.swift > iOSPhotoEditor.patch
Давайте разберемся что тут происходит:
- параметр -u генерирует diff патч;
- вторым аргументом идет путь к оригинальному файлу CropView.swift;
- третьим аргументом идет путь к измененному файлу CropViewPatched.swift;
- далее идет такая конструкция > iOSPhotoEditor.patch она позволяет сохранить полученный diff изменений в файл iOSPhotoEditor.patch в той директории откуда вы запустили данную команду;
Полученный файл (iOSPhotoEditor.patch) будет выглядеть примерно так:
Далее в папке iOS я создал папку patches чтобы в дальнейшем хранить там все патчи если это потребуется и поместил туда полученный iOSPhotoEditor.patch.
Остался финальный шаг, необходимо найти в вашем Podfile секцию post_install
post_install do |installer| ... end
Если таковой нет то создайте ее в конце вашего файла. Обратите внимание на то что данная секция может быть только одна в вашем Podfile.
Теперь в конце этой секции необходимо вставить следующую инструкцию:
post_install do |installer| ... puts '🟢 Патчим iOSPhotoEditor' %x(patch './Pods/iOSPhotoEditor/Photo\ Editor/Photo\ Editor/CropView.swift' < './patches/iOSPhotoEditor.patch') end
Давайте разберемся что тут происходит:
- puts – позволяет нам вывести лог при выполнении команды pod install
- с помощью %x(...) можно выполнить какую-либо shell команду вашем Podfile.
- patch – применяет полученный патч файл к проблемому файлу
- вторым аргументом для patch идет путь к проблемному файлу относительно вашего Podfile (обратите внимание на то что путь взят в одинарные кавычки и перед пробельным символом стоит \)
- третьим аргументом после < идет путь к вашему патч файлу относительно вашего Podfile
Вот и все, теперь после выполнения команды pod install к вашему проблемному файлу будет применятся ваш патч.