Иван Вавилов Package Manager
Total Page:16
File Type:pdf, Size:1020Kb
$ 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<Dependency>] public enum Dependency { case gitHub(Server, Repository) case git(GitURL) case binary(URL) } bit.ly/2FGnZln Redmadrobot Построение графа зависимостей в Carthage typealias DependencyGraph = [Dependency: Set<Dependency>] 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<ResolvedTarget> public let reachableProducts: Set<ResolvedProduct> public let allTargets: Set<ResolvedTarget> public var allProducts: Set<ResolvedProduct> } 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 {