美文网首页
cocoapods-prefer解析

cocoapods-prefer解析

作者: jackyshan | 来源:发表于2021-06-25 16:31 被阅读0次

    hook cocoapods的类

    podfile

    在podfile.rb文件实现在podfile调用的函数,传递参数给PreferConfig

      def prefer_source_pod(name = nil, *requirements)
        pod(name, *requirements)
    
        Pod::PreferConfig.instance.prefer_pod(name)
      end
    
    

    cocoapods_plugin

    • source_provider

    在cocoapods_plugin.rb中,实现把在podfile添加的prefer-source,通过hook source_provider传给context。

    Pod::HooksManager.register('cocoapods-prefer', :source_provider) do |context, user_options|
        Pod::PreferConfig.instance.prefer_sources().each { |e, source| 
          context.add_source(source)
        }
    end
    
    
    • pre_install

    hook pre_install来初始化podfile指定的prefer_source

    def prefer_source_options(user_options)
          dislike = user_options[:dislike_sources]
          unless dislike.nil? || dislike.empty? || !dislike.is_a?(Hash)
            dislike.each { |source_name, url|
              dislike_source(source_name, url)
            }
          end
    
          sources = user_options[:prefer_sources]
          unless sources.nil? || sources.empty? || !sources.is_a?(Hash)
            sources.each { |source_name, url|
              prefer_source(source_name, url)
            }
          end
    end
    
    
    • post_install

    hook post_install来做一些report打印操作,过滤出prefer_source不存在的pod

        def report
          report_lock_result()
          if installed?
            locked_result_pods = locked_pods()
            result = lock_file_result().reject { |pod_name, url| 
              locked_result_pods.include?(pod_name)
            }
    
            prefer_urls = prefer_source_urls.values
            prefer_pod_names = prefer_pods()
    
            result.select { |pod_name, url| 
              prefer_pod_names.include?(pod_name) && !prefer_urls.include?(url)
            }.each do |pod_name, url|
              UI.puts "#{pod_name} using #{url} not in preferred sources".yellow
            end
    
            dislike_urls = dislike_source_urls.values
            dislike_pod_names = dislike_pods()
    
            result.select { |pod_name, url| 
              dislike_pod_names.include?(pod_name) && dislike_urls.include?(url)
            }.each do |pod_name, url|
              UI.puts "#{pod_name} using #{url} in disliked sources".yellow
            end
          end
        end
    
    

    resolver

    在resolver.rb重写Resolver的search_for(dependency)方法,查找spec依赖的source,根据prefer-source,优先返回设置prefer source。

    • 对原先的search_for设置别名
    alias perfer_search_for search_for
    
    
    • 先执行原来的search_for,得到specifications,然后执行prefer_specifications_filter,得到prefer source
    alias perfer_search_for search_for
    ## Specification
    ## return preferred source if meet requirement 
    def search_for(dependency)
      # install_script_phases_for_dependency(dependency.root_name)
      specifications = perfer_search_for(dependency)
    
      pod_name = dependency.root_name
      specifications = dislike_lock_specifications_filter(pod_name, specifications)
      specifications = prefer_lock_specifications_filter(pod_name, specifications)
    
      specifications = dislike_specifications_filter(pod_name, specifications)
      specifications = prefer_specifications_filter(pod_name, specifications)
      specifications
    end
    
    

    相关文章

      网友评论

          本文标题:cocoapods-prefer解析

          本文链接:https://www.haomeiwen.com/subject/ylbokltx.html