# cocoapods-tdfire-binary

A description of cocoapods-tdfire-binary.

## Installation

    $ gem install cocoapods-tdfire-binary
    
    
## TODO

1. 拥有 Subspec 的组件二进制依赖方式
2. 本地 Lint 二进制

## Usage

```

Usage:

    $ pod binary COMMAND

      2Dfire 二进制工具库,提供打包、lint、推送、拉取、发布等命令

Commands:

    + lint      对本地二进制进行 Lint
    + package   二进制打包
    + publish   正式发布二进制组件
    + pull      下载二进制 zip 包
    + push      推送二进制 zip 包

```

### For .gitignore

```
...

*.framework
*.zip
```

> For Podfile

```
...
plugin 'cocoapods-tdfire-binary'

tdfire_use_binary!
tdfire_use_source_pods ['AFNetworking']

use_frameworks!

...

```

### For podspec

```
...

tdfire_source_configurator = lambda do |s|
    # source configuration
    # s.source_files = 'PodA/Classes/**/*'
    # s.resource_bundles = {
    #   'PodA' => ['PodA/Assets/*']
    # }
end

unless %w[tdfire_set_binary_download_configurations tdfire_source tdfire_binary].reduce(true) { |r, m| s.respond_to?(m) & r }
    
  tdfire_source_configurator.call s
else
  s.tdfire_source tdfire_source_configurator
  s.tdfire_binary tdfire_source_configurator
  s.tdfire_set_binary_download_configurations
end

```

- tdfire_source_proc
  - 配置源码依赖

- tdfire_binary
  - 配置二进制依赖,其中 `vendored_framework` 、`source_files`、`public_header_files` 内部设置成如下路径
    
  ```
  s.vendored_framework = "#{s.name}.framework"
  #
  # 这两句 framework 不需要,cocoapods-packager 插件生成的 framework 中, Headers 是一个软连接 ,所以即使设置了也不生效
  # 这样就需要使用者都以 < > 的形式引用头文件了,而且需要是 umbrella 头文件,否则会出现警告 
  # s.source_files = "#{s.name}.framework/Headers/*"
  # s.public_header_files = "#{s.name}.framework/Headers/*"
  ```
  - 提取 subspec 中的依赖、frameworks、 libraries、 weak_frameworks,至二进制组件对应属性中
  - 在组件源码依赖有 subspec 的情况下,插件会在二进制依赖时,动态创建 default subspec `TdfireBinary`,以及源码依赖时的 subspec ,并且让后者的所有 subspec 依赖 `TdfireBinary`
  - 由于此方案对二进制中的 subspec 并**不做区分**,统一打包成一个二进制文件,所以如果在使用二进制依赖时,依赖了 subspec ,插件还是会去下载完整的二进制文件,并且从最终生成的结果看,目录中只有 `TdfireBinary` subspec
  - 此插件不支持嵌套 subspec 场景,如
  
  ```ruby
  Pod::Spec.new do |s|
    s.name = 'Root'
    s.subspec 'Level_1' do |sp|
      sp.subspec 'Level_2' do |ssp|
      end
    end
  end
  ``` 
   
- tdfire_set_binary_download_configurations
  - 强制设置 static_framework 为 true,规避使用 use_frameworks! 时,动态库依赖链(动态库依赖静态库问题)、影响启动时间问题
  - 设置 preserve_paths,让 cache 保留源码、资源、二进制全部文件
    - preserve_paths 由组件,子组件的源码、资源路径,以及 Framework 路径组成
  - 设置下载 prepare_command,未发布组件将会略过这一步骤

### For Lib Env

> Warning: 在发布二进制组件前,走二进制依赖流程,无法下载到对应 framework


- Env Key
  - tdfire_use_binary
    - 使用二进制依赖,确认值 1
  - tdfire_unpublished_pods 
    - 未发布的组件,用 `|` 隔开 (如 PodA|PodB, 一般只有一个,即当前开发组件),设置后对应组件走源码依赖流程。
    - 二进制 lint 时,无法通过 Podfile 的 plugin 获取当前的 development pod (即当前开发组件) ,在发布对应二进制版本前,走二进制依赖流程,是下不到对应二进制版本的,所以需要自己设置当前开发组件名,对这一部分进行源码依赖。
  - tdfire_force_use_source
    - 强制使用源码依赖,确认值 1
    - 源码 lint 、未发布二进制组件前 CI 中 pod install / update (优先级比 Podfile 中的设置高) 时可使用 
  - tdfire_force_use_binary
    - 强制使用二进制依赖,确认值 1
    - 基本无用,在验证当前版本是否有对应二进制版本时可使用
  

例子:

```
env tdfire_use_binary=1 tdfire_unpublished_pods=PodA pod lib lint xxxx
env tdfire_force_use_source=1 pod install
```