$ pod install

[!] Automatically assigning platform ‘’ 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. $ log —numstat e123123 83 0 project project.pbxproj commit e123123ccde12313c123e Когда наконец поставил pod-ы — это не просто 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] public enum Dependency {

case gitHub(Server, Repository) case git(GitURL) case binary(URL)

}

bit.ly/2FGnZln Redmadrobot Построение графа зависимостей в Carthage

typealias DependencyGraph = [Dependency: Set] enum Dependency {

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 public let reachableProducts: Set public let allTargets: Set public var allProducts: 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]