$ pod install
[!] Automatically assigning platform ‘ios’ with version ‘8.0’ because no platform was specified. [!] Your target overrides the ‘OTHER_LDFLAGS’ build settings defined in xcconfig. This can lead to problems with the CocoaPods installation.
[!] The dependency ‘Alamofire’ is not used in any concrete target. [!] Pods written in Swift can only be integrated as frameworks
[!] Unable to find a specification for ‘Alamofire’.
[!] CocoaPods could not find compatible versions for pod ‘Alamofire’: Transport depends on Alamofire (~> 1.0) Mapper depends on Alamofire (~> 2.0)
[!] There is a circular dependency between Transport and Mapper Pod installation complete! There are 2 dependencies from the Podfile and 4 total pods installed. $ git log —numstat e123123 83 0 project project.pbxproj commit e123123ccde12313c123e Когда наконец поставил pod-ы Package manager — это не просто curl
Иван Вавилов [email protected] Агенда
Разновидности менеджеров зависимостей (МЗ)
Схема проекта с использованием МЗ
Алгоритм работы МЗ
Redmadrobot Агенда
Разновидности менеджеров зависимостей (МЗ)
Схема проекта с использованием МЗ
Алгоритм работы МЗ
Redmadrobot Разновидности МЗ
Операционной системы (системные)
Языка
Проекта
Redmadrobot Как это работает или все зло в деталях
Redmadrobot Агенда
Разновидности менеджеров зависимостей (МЗ)
Схема проекта с использованием МЗ
Алгоритм работы МЗ
Redmadrobot Схема проекта с использованием Package Manager
Код Код проекта Manifest-файл Lock-файл зависимостей
Redmadrobot Схема проекта с использованием Package Manager
Код Код проекта Manifest-файл Lock-файл зависимостей
import Alamofire
Redmadrobot Схема проекта с использованием Package Manager
Код Код проекта Manifest-файл Lock-файл зависимостей
Валидируется статическим анализатором, редактируется пользователем. Redmadrobot Схема проекта с использованием Package Manager
Код Код проекта Manifest-файл Lock-файл зависимостей
Генерируется из Manifest-файла
Redmadrobot Схема проекта с использованием Package Manager
Код Код проекта Manifest-файл Lock-файл зависимостей
Получаем на основе Lock-файла
Redmadrobot Схема проекта с использованием Package Manager
Код Код проекта Manifest-файл Lock-файл зависимостей
Redmadrobot Схема проекта с использованием Package Manager
Код Компилятор/ Код проекта Manifest-файл Lock-файл зависимостей Интерпретатор
Redmadrobot Схема проекта с использованием Package Manager
Компилятор/ Интерпретатор История коммитов
Redmadrobot Схема проекта с использованием Package Manager
Создает пользователь Генерируется
Код проекта Manifest-файл Lock-файл Код зависимостей
Redmadrobot Агенда
Разновидности менеджеров зависимостей (МЗ)
Схема проекта с использованием МЗ
Алгоритм работы МЗ
Redmadrobot Работа МЗ
1. Валидация проекта и среды (Analyzer)
2. Построение графа (Resolver)
3. Скачивание зависимостей
4. Интеграция зависимостей
5. Обновление зависимостей
Redmadrobot Валидация проекта и среды окружения
Redmadrobot RVM > cocoapods
Build Settings Код проекта OS X
Manifest-файл
Redmadrobot source 'https://github.com/CocoaPods/Specs.git' source 'https://github.com/RedMadRobot/cocoapods-specs' platform :ios, '10.0' use_frameworks! project 'Project.xcodeproj' workspace 'Project.xcworkspace' target 'Project' do project 'Project.xcodeproj'
pod 'Alamofire' pod 'Fabric' pod 'GoogleMaps' end
Redmadrobot source 'https://github.com/CocoaPods/Specs.git' source 'https://github.com/RedMadRobot/cocoapods-specs' platform :ios, '10.0' use_frameworks! project 'Project.xcodeproj' workspace 'Project.xcworkspace' target 'Project' do project 'Project.xcodeproj'
pod 'Alamofire' pod 'Fabric' pod 'GoogleMaps' end
Redmadrobot source 'https://github.com/CocoaPods/Specs.git' source 'https://github.com/RedMadRobot/cocoapods-specs' platform :ios, '10.0' use_frameworks! project 'Project.xcodeproj' workspace 'Project.xcworkspace' target 'Project' do project 'Project.xcodeproj'
pod 'Alamofire' pod 'Fabric' pod 'GoogleMaps' end
Redmadrobot source 'https://github.com/CocoaPods/Specs.git' source 'https://github.com/RedMadRobot/cocoapods-specs' platform :ios, '10.0' use_frameworks! project 'Project.xcodeproj' workspace 'Project.xcworkspace' target 'Project' do project 'Project.xcodeproj'
pod 'Alamofire' pod 'Fabric' pod 'GoogleMaps' end
Redmadrobot source 'https://github.com/CocoaPods/Specs.git' source 'https://github.com/RedMadRobot/cocoapods-specs' platform :ios, '10.0' use_frameworks! project 'Project.xcodeproj' workspace 'Project.xcworkspace' target 'Project' do project 'Project.xcodeproj'
pod 'Alamofire' pod 'Fabric' pod 'GoogleMaps' end
Redmadrobot Построение графа зависимостей
Redmadrobot Ориентированный ацикличный граф
C A B E G D F
Redmadrobot Алгоритм!!1
Сводится к задаче топологической сортировки
Кан – перебор вершин
Тарьян - поиск в глубину
Демукрон – поиск в ширину
Redmadrobot Алгоритм!!1
NP-полная задача
Решается за полиномиальное время
При общих зависимостях могут использоваться различные стратегии
Алгоритм так же используется в компиляторах, AI, ML
Redmadrobot Результат решения
Manifest-файл Lock-файл
Redmadrobot Зависимости наших зависимостей — наши зависимости
Redmadrobot Project
A B E
C F
D
Redmadrobot Общая зависимость �
Project Diamond problem A B E
C F
D
Redmadrobot Стратегия №1
Project
A B <=1.0.3 =1.1.1
C-1.0.3 C-1.1.1
Redmadrobot [!] CocoaPods could not find compatible versions for pod ‘Alamofire’: Transport depends on Alamofire (~> 1.0) Mapper depends on Alamofire (~> 2.0) Стратегия №2
Project
A B >=1.0.2 1.x
C-1.2.0
Redmadrobot Project
A B E
C F
D
Redmadrobot [!] There is a circular dependency between B and D
Redmadrobot Зависимости наших зависимостей — наши зависимости
Redmadrobot Возможные оптимизации?
� Параллельные алгоритмы
Redmadrobot Возможные оптимизации?
� O(log^2(n))*
*При использовании полиномиального количества процессоров
Redmadrobot Построение графа зависимостей
Carthage
SwiftPM
Redmadrobot Построение графа зависимостей в Carthage
typealias DependencyGraph = [Dependency: Set
case gitHub(Server, Repository) case git(GitURL) case binary(URL)
}
bit.ly/2FGnZln Redmadrobot Построение графа зависимостей в Carthage
typealias DependencyGraph = [Dependency: Set
case gitHub(Server, Repository) case git(GitURL) case binary(URL)
}
bit.ly/2FGnZln Redmadrobot Построение графа зависимостей в Carthage
protocol ResolverProtocol {
init(versions, dependencies, gitReference)
func resolve(dependencies, lastResolved, dependenciesToUpdate)
}
bit.ly/2IyxpNB Redmadrobot Построение графа зависимостей в SwiftPM struct PackageGraph {
public let rootPackages: [ResolvedPackage] public let packages: [ResolvedPackage] public let reachableTargets: Set
}
bit.ly/2GBaKzK Redmadrobot Построение графа зависимостей в SwiftPM
bit.ly/2DyLNBW Redmadrobot Lock зависимостей
Manifest-файл Lock-файл
Redmadrobot Lock-файл
PODS: - Alamofire (4.7.0) - Fabric (1.7.5) - GoogleMaps (2.6.0): - GoogleMaps/Maps (= 2.6.0) - GoogleMaps/Base (2.6.0) - GoogleMaps/Maps (2.6.0): - GoogleMaps/Base
SPEC CHECKSUMS: Alamofire: 907e0a98eb68cdb7f9d1f541a563d6ac5dc77b25 Fabric: ae7146a5f505ea370a1e44820b4b1dc8890e2890 GoogleMaps: 42f91c68b7fa2f84d5c86597b18ceb99f5414c7f
PODFILE CHECKSUM: 5294972c5dd60a892bfcc35329cae74e46aac47b
COCOAPODS: 1.4.0
Redmadrobot Lock-файл
PODS: - Alamofire (4.7.0) - Fabric (1.7.5) - GoogleMaps (2.6.0): - GoogleMaps/Maps (= 2.6.0) - GoogleMaps/Base (2.6.0) - GoogleMaps/Maps (2.6.0): - GoogleMaps/Base
SPEC CHECKSUMS: Alamofire: 907e0a98eb68cdb7f9d1f541a563d6ac5dc77b25 Fabric: ae7146a5f505ea370a1e44820b4b1dc8890e2890 GoogleMaps: 42f91c68b7fa2f84d5c86597b18ceb99f5414c7f
PODFILE CHECKSUM: 5294972c5dd60a892bfcc35329cae74e46aac47b
COCOAPODS: 1.4.0
Redmadrobot Lock-файл
PODS: - Alamofire (4.7.0) - Fabric (1.7.5) - GoogleMaps (2.6.0): - GoogleMaps/Maps (= 2.6.0) - GoogleMaps/Base (2.6.0) - GoogleMaps/Maps (2.6.0): - GoogleMaps/Base
SPEC CHECKSUMS: Alamofire: 907e0a98eb68cdb7f9d1f541a563d6ac5dc77b25 Fabric: ae7146a5f505ea370a1e44820b4b1dc8890e2890 GoogleMaps: 42f91c68b7fa2f84d5c86597b18ceb99f5414c7f
PODFILE CHECKSUM: 5294972c5dd60a892bfcc35329cae74e46aac47b
COCOAPODS: 1.4.0
Redmadrobot Lock-файл
PODS: - Alamofire (4.7.0) - Fabric (1.7.5) - GoogleMaps (2.6.0): - GoogleMaps/Maps (= 2.6.0) - GoogleMaps/Base (2.6.0) - GoogleMaps/Maps (2.6.0): - GoogleMaps/Base
SPEC CHECKSUMS: Alamofire: 907e0a98eb68cdb7f9d1f541a563d6ac5dc77b25 Fabric: ae7146a5f505ea370a1e44820b4b1dc8890e2890 GoogleMaps: 42f91c68b7fa2f84d5c86597b18ceb99f5414c7f
PODFILE CHECKSUM: 5294972c5dd60a892bfcc35329cae74e46aac47b
COCOAPODS: 1.4.0
Redmadrobot Lock-файл
PODS: - Alamofire (4.7.0) - Fabric (1.7.5) - GoogleMaps (2.6.0): - GoogleMaps/Maps (= 2.6.0) - GoogleMaps/Base (2.6.0) - GoogleMaps/Maps (2.6.0): - GoogleMaps/Base
SPEC CHECKSUMS: Alamofire: 907e0a98eb68cdb7f9d1f541a563d6ac5dc77b25 Fabric: ae7146a5f505ea370a1e44820b4b1dc8890e2890 GoogleMaps: 42f91c68b7fa2f84d5c86597b18ceb99f5414c7f
PODFILE CHECKSUM: 5294972c5dd60a892bfcc35329cae74e46aac47b
COCOAPODS: 1.4.0
Redmadrobot Скачивание зависимостей
Код Lock-файл Зависимостей
Redmadrobot Скачивание зависимостей
Безопасность
Централизация
Redmadrobot Скачивание зависимостей
Безопасность
Централизация
Redmadrobot Безопасность
Redmadrobot Homebrew
HOMEBREW_NO_INSECURE_REDIRECT Проверка устаревшей версии curl (OS X ≤ 10.8) Хэш SHA256 для файла по http
bit.ly/2pph45i bit.ly/2GKUKLP Redmadrobot Carthage
guard binaryURL.scheme == "file" || binaryURL.scheme == "https" else { return .failure(BinaryJSONError.nonHTTPSURL(binaryURL)) }
bit.ly/2FQQTzi
Redmadrobot Swift Package Manager
Механизм подписи пакетов
Механизм валидации пакетов по цепочке
bit.ly/2FWTX94
Redmadrobot Swift Package Manager
Redmadrobot Swift Package Manager
AddTrust RSA CA Root
COMODO RSA Certification Authority
COMODO RSA Domain Validation Secure Server CA
www.example.com
Redmadrobot Cocoapods
return if url.scheme == 'https' || url.scheme == 'file' warning('http', "The URL (`#{url}`) doesn't use the encrypted HTTPs protocol. Please update the URL to use https.')
Trusting iOS SDKs by Felix Krause
bit.ly/2u4qKrA (by KrauseFx)
Redmadrobot Скачивание зависимостей
Безопасность
Централизация
Redmadrobot Централизация vs Децентрализация
Redmadrobot Developer
Developer Developer
Redmadrobot Developer Developer
Developer
Redmadrobot Интеграция зависимостей
Автоматическая �
Ручная �
Redmadrobot Автоматическая
$ git log —numstat e123123 83 0 project project.pbxproj commit e123123ccde12313c123e
Redmadrobot Ручная
Redmadrobot Обновление зависимостей Обновление зависимостей
Versions – полный контроль (при допущении, что автор знает правила версионирования) Branches – обновления ветки Revisions – нет
Redmadrobot Версионирование
Петя: У нас что-то не все тесты работают. Маша: Блин, вчера все работало. Петя: Да, опять с парсингом что-то. Маша: Ок, я посмотрю сейчас. (спустя несколько часов) Петя: Я думаю, что-то в библиотеке парсера. Маша: Какая у тебя версия? Петя: 2.0.1.
Маша: Они как раз с утра обновились с 2.0.0 �
Redmadrobot source 'https://github.com/CocoaPods/Specs.git' source 'https://github.com/RedMadRobot/cocoapods-specs' platform :ios, '10.0' use_frameworks! project 'Project.xcodeproj' workspace 'Project.xcworkspace' target 'Project' do project 'Project.xcodeproj'
pod 'Parser', '~> 2.0.0’ pod 'Alamofire' pod 'Fabric' pod 'GoogleMaps' end
Redmadrobot Версионирование Версионирование
Cocoapods: ‘= 0.1’ Carthage: ‘== 1.0’ SwiftPM: exact(“1.0.8”)
Redmadrobot Заключение
Знай алгоритмы Знай свои зависимости Не забывай про безопасность (Де)централизируй Автоматизируй или делай руками Фиксируйте версии
Redmadrobot Всем спасибо! Иван Вавилов [email protected]