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' require_relative '../helper/prebuild_installer' # 如果是Pod::JxedtPrebuildSandbox类则直接返回 return if @installer_context.sandbox.is_a?(Pod::JxedtPrebuildSandbox) # 获取原始的installer对象,必须先获取对象 original_installer = ObjectSpace.each_object(Pod::Installer).first prebuild_sandbox = Pod::JxedtPrebuildSandbox.from_standard_sandbox(@installer_context.sandbox) source_installer = Pod::JxedtPrebuildInstaller.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" # 统计需要prebuild的targets prebuild_pods = Jxedt::Prebuild.new(source_installer).targets_to_prebuild.map(&:pod_name) binary_hash = prebuild_pods.reduce({}) do |hash, name| checksum = prebuild_sandbox.source_lockfile.spec_checksums_hash_key(name) hash.update(name => checksum) end require 'cocoapods-jxedt/git_helper/cache_fetcher' binary_dir = @installer_context.sandbox.standard_sandbox_root + Jxedt.config.binary_dir Jxedt::CacheFetcher.sync(binary_hash, binary_dir) end # prebuild_job 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.standard_sandbox_root + Jxedt.config.binary_dir Jxedt::CachePucher.push(output_dir, build_targets, false) end end source_installer.generate_pods_index_project! 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