module Pod class Sandbox attr_accessor :source_lockfile end end module Jxedt class PreInstall include ObjectSpace def initialize(installer_context) @installer_context = installer_context end def run # check binary switch return unless Jxedt.config.binary_switch? unless Gem::Version.new(Pod::VERSION) >= Gem::Version.new('1.10.0') raise STDERR.puts "[!] cocoapods-jxedt binary plugin should use cocoapods version greater than '1.10.0'`".red end require_relative '../helper/prebuild_sandbox' # 如果是Pod::PrebuildSandbox类则直接返回 return if @installer_context.sandbox.is_a?(Pod::PrebuildSandbox) # 获取原始的installer对象,必须先获取对象 original_installer = ObjectSpace.each_object(Pod::Installer).first prebuild_sandbox = Pod::PrebuildSandbox.from_standard_sandbox(@installer_context.sandbox) source_installer = Pod::Installer.new(prebuild_sandbox, @installer_context.podfile, @installer_context.lockfile) # 设置原始的installer携带的参数 source_installer.update = original_installer.update source_installer.repo_update = original_installer.repo_update # 执行install source_installer.install! # 保存首次`pod install`的lockfile结果,用来验证二进制文件和后面做结果校验 @installer_context.sandbox.source_lockfile = prebuild_sandbox.source_lockfile = source_installer.lockfile require_relative '../helper/podfile_options' require_relative '../prebuild' # fetch cache and sync if Jxedt.config.cache_repo_enabled? && Jxedt.config.auto_fetch? log_section "🚗 Fetch git cache" pods = prebuild_sandbox.source_lockfile.internal_data["SPEC CHECKSUMS"].keys binary_hash = pods.reduce({}) do |hash, name| checksum = prebuild_sandbox.source_lockfile.spec_checksums_hash_key(name) hash.update(name => checksum) unless checksum.nil? end require 'cocoapods-jxedt/git_helper/cache_fetcher' binary_dir = @installer_context.sandbox.root + Jxedt.config.binary_dir Jxedt::CacheFetcher.sync(binary_hash, binary_dir) end # prebuild_job prebuild_sandbox.link_source_project! if Jxedt.config.prebuild_job? log_section "🚀 Prebuild frameworks" build_targets = Jxedt::Prebuild.new(source_installer).build # cache push if Jxedt.config.cache_repo_enabled? && Jxedt.config.auto_push? && build_targets && build_targets.size > 0 log_section "🚄 Push git cache" require 'cocoapods-jxedt/git_helper/cache_pucher' output_dir = prebuild_sandbox.root + Jxedt.config.binary_dir Jxedt::CachePucher.push(output_dir, build_targets, false) end end prebuild_sandbox.clean_source_project! log_section "🤖 Resume pod installation" require_relative '../targets/pod_target' require_relative '../Intergation' end def log_section(message) Pod::UI.puts "-----------------------------------------" Pod::UI.puts message Pod::UI.puts "-----------------------------------------" end end end