Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/grab/cocoapods-binary-cache
https://github.com/grab/cocoapods-binary-cache
Last synced: about 1 month ago
JSON representation
- Host: GitHub
- URL: https://github.com/grab/cocoapods-binary-cache
- Owner: grab
- License: mit
- Created: 2020-01-07T08:37:42.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2023-06-23T20:22:09.000Z (about 1 year ago)
- Last Synced: 2024-07-27T18:49:37.716Z (about 2 months ago)
- Language: Ruby
- Size: 1.67 MB
- Stars: 473
- Watchers: 22
- Forks: 69
- Open Issues: 35
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
Awesome Lists containing this project
README
# CocoaPods binary cache
[![Test](https://img.shields.io/github/workflow/status/grab/cocoapods-binary-cache/test)](https://img.shields.io/github/workflow/status/grab/cocoapods-binary-cache/test)
[![License](https://img.shields.io/badge/license-MIT-green.svg?style=flat&color=blue)](https://github.com/grab/cocoapods-binary-cache/blob/master/LICENSE)
[![Gem](https://img.shields.io/gem/v/cocoapods-binary-cache.svg?style=flat&color=blue)](https://rubygems.org/gems/cocoapods-binary-cache)A plugin that helps to reduce the build time of Xcode projects which use CocoaPods by prebuilding pod frameworks and cache them in a remote repository to share across multiple machines.
## Installation
Requirements
- Ruby: >= 2.4
- CocoaPods: >= 1.5.0### Via [Bundler](https://bundler.io/)
Add the gem `cocoapods-binary-cache` to the `Gemfile` of your project.
```rb
gem "cocoapods-binary-cache", :git => "https://github.com/grab/cocoapods-binary-cache.git", :tag => "0.1.11"
```Then, run `bundle install` to install the added gem.
In case you're not familiar with [`bundler`](https://bundler.io/), take a look at [Learn how to set it up here](https://www.mokacoding.com/blog/ruby-for-ios-developers-bundler/).
### Via [RubyGems](https://rubygems.org/)
```sh
$ gem install cocoapods-binary-cache
```## How it works
Check out the [documentation on how it works](/docs/how_it_works.md) for more information.
## Usage
### 1. Configure cache repo
First of all, create a git repo that will be used as a storage of your prebuilt frameworks. Make sure this git repo is accessible via `git clone` and `git fetch`. Specify this cache repo in the following section.
### 2. Configure Podfile
**2.1. Load the `cocoapods-binary-cache` plugin.**
Add the following line at the beginning of Podfile:
```rb
plugin "cocoapods-binary-cache"
```**2.2. Configure `cocoapods-binary-cache`**
```rb
config_cocoapods_binary_cache(
cache_repo: {
"default" => {
"remote" => "git@cache_repo.git",
"local" => "~/.cocoapods-binary-cache/prebuilt-frameworks"
}
},
prebuild_config: "Debug"
)
```
For details about options to use with the `config_cocoapods_binary_cache` function, check out [our guidelines on how to configure `cocoapods-binary-cache`](/docs/configure_cocoapods_binary_cache.md).**2.3. Declare pods as prebuilt pods**
To declare a pod as a prebuilt pod (sometimes referred to as *binary pod*), add the option `:binary => true` as follows:
```rb
pod "Alamofire", "5.2.1", :binary => true
```NOTE:
- Dependencies of a prebuilt pod will be automatically treated as prebuilt pods.\
For example, if `RxCocoa` is declared as a prebuilt pod using the `:binary => true` option, then `RxSwift`, one of its dependencies, is also treated as a prebuilt pod.### 3. CLI
We provided some command line interfaces (CLI):
- Fetch from cache repo
```sh
$ bundle exec pod binary fetch
```
- Prebuild binary pods
```sh
$ bundle exec pod binary prebuild [--push]
```
- Push the prebuilt pods to the cache repo
```sh
$ bundle exec pod binary push
```For each command, you can run with option `--help` for more details about how to use each:
```sh
$ bundle exec pod binary fetch --help
```### 4. A trivial workflow
A trivial workflow when using this plugin is to fetch from cache repo, followed by a pod installation, as follows:
```sh
$ bundle exec pod binary fetch
$ bundle exec pod install
```For other usages, check out the [best practices docs](/docs/best_practices.md).
## Benchmark
We created a project to benchmark how much of the improvements we gain from this plugin. The demo project is using the following pods:
```
AFNetworking
SDWebImage
Alamofire
MBProgressHUD
Masonry
SwiftyJSON
SVProgressHUD
MJRefresh
CocoaLumberjack
Realm
SnapKit
Kingfisher
```Below is the result we recorded:
Hardware specs of the above benchmark:
```
MacBook Pro (15-inch, 2018)
Mac OS 10.14.6
Processor 2.6 GHz Intel Core i7
Memory 16 GB 2400 MHz DDR4
```You can also try it out on your local:
```sh
$ cd PodBinaryCacheExample
$ sh BuildBenchMark.sh
```In our real project with around 15% of swift/ObjC code from vendor pods. After applying this technique, we notice a reduction of around 10% in build time.
## Known issues and roadmap
### Exporting IPA with Bitcode
- When exporting an IPA with Bitcode, remember to disable the _rebuild from bitcode_ option. Refer to https://github.com/grab/cocoapods-binary-cache/issues/24.### Pods with headers only
- By default, pods with empty sources (ie. pods with header files only) will be automatically excluded and they will be later integrated as normal. For now, we rely on the `source_files` patterns declared in podspec to heuristically detect empty-sources pods.
- However, there are cases in which the `source_files` of a pod looks like non-empty sources (ex. `s.source_files = "**/*.{c,h,m,mm,cpp}"`) despite having header files only. For those cases, you need to manually add them to the `excluded_pods` option.## Best practices
Check out our [Best practices](/docs/best_practices.md) for for information.
## Troubleshooting
Check out our [Troubleshooting guidelines](/docs/troubleshooting_guidelines.md) for more information.
## Contribution
Check out [CONTRIBUTING.md](CONTRIBUTING.md) for more information on hw to contribute to this repo.
## License
The cocoapods-binary-cache plugin is available as open-source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
It uses [cocoapods-rome](https://github.com/CocoaPods/Rome) and [cocoapods-binary](https://github.com/leavez/cocoapods-binary) internally, which are also under MIT License.