cocoapods-fix-react-native 2018.04.28.09 → 2018.05.03.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +59 -39
- data/lib/cocoapods-fix-react-native/fix_with_context.rb +91 -0
- data/lib/cocoapods-fix-react-native/issues/react_dependency_version.rb +14 -0
- data/lib/cocoapods-fix-react-native/versions/{0_54_2.rb → 0_54_2-post.rb} +0 -0
- data/lib/cocoapods-fix-react-native/versions/{0_54_4.rb → 0_54_4-post.rb} +0 -0
- data/lib/cocoapods_plugin.rb +13 -13
- metadata +6 -5
- data/lib/cocoapods-fix-react-native/version_resolver.rb +0 -27
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9e61ae67e2d6bd5f2e0327bb13bde287c03507fcc1bea282563cb68fee5f62c5
|
4
|
+
data.tar.gz: e6b3aef3de1f2a673b2246a344b67154e444059f43b4f9149babafd80866e0a9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ed78330f5a4a09f5088e57525c16236f58ef9d0cb82d0e93aa9eef7f064357a14429343b381c0e9ea348e596508b107dba055254ca993d11010780f719ae3502
|
7
|
+
data.tar.gz: 71a807a28d9c5c953d82a7a8635709b12d8ddcbd8ce93eb607f08d37f03a4e64b2549245e28dd5717383274adabaf051d550a04781ff0b28dd4763ba80ceddc7
|
data/README.md
CHANGED
@@ -1,22 +1,27 @@
|
|
1
|
-
Hi there! This a CocoaPods plugin that **we, the community**, can use to plug
|
2
|
-
support.
|
1
|
+
Hi there! This a CocoaPods plugin that **we, the community**, can use to plug
|
2
|
+
the holes in React Native's CocoaPods support.
|
3
3
|
|
4
|
-
CocoaPods allows you to add code to run at the end of the Podfile via
|
5
|
-
|
6
|
-
|
4
|
+
CocoaPods allows you to add code to run before and at the end of the Podfile via
|
5
|
+
installation hooks. You probably already have some custom code in there. This
|
6
|
+
plugin allows all that code to be centralized and reasoned about in a single
|
7
|
+
place per React Native version.
|
7
8
|
|
8
9
|
## Why Does This Need To Exist?
|
9
10
|
|
10
|
-
React Native is a pragmatic project, it's great Facebook open sources it, but if
|
11
|
-
use - the onus is on you to make sure it
|
12
|
-
|
13
|
-
|
11
|
+
React Native is a pragmatic project, it's great Facebook open sources it, but if
|
12
|
+
you want to work with a flow they don't use - the onus is on you to make sure it
|
13
|
+
continues to work. Facebook have a big mono-repo, and so they don't need to use
|
14
|
+
CocoaPods, and they also use static compilation because they don't use Swift.
|
15
|
+
Meaning if you want to use CocoaPods and Swift, you're pretty far from their
|
16
|
+
workflow.
|
14
17
|
|
15
|
-
In order to get it working for just your app you scour, like, a million issues
|
16
|
-
[artsy/eigen][eigen]) to get it compiling on your
|
18
|
+
In order to get it working for just your app you scour, like, a million issues
|
19
|
+
on React Native (or go look at [artsy/eigen][eigen]) to get it compiling on your
|
20
|
+
setup. Again, not optimal.
|
17
21
|
|
18
|
-
This plugin _tries_ to fix this by centralizing the code needed to modify React
|
19
|
-
|
22
|
+
This plugin _tries_ to fix this by centralizing the code needed to modify React
|
23
|
+
Native. This means makes it easy to update your versions of React Native,
|
24
|
+
because you can update the gem at the same time.
|
20
25
|
|
21
26
|
## Installation
|
22
27
|
|
@@ -24,57 +29,71 @@ Lazy way (bad, but ok if 1 engineer):
|
|
24
29
|
|
25
30
|
$ gem install cocoapods-fix-react-native
|
26
31
|
|
27
|
-
Correct way, edit
|
32
|
+
Correct way, edit
|
33
|
+
[`your Gemfile`](http://www.mokacoding.com/blog/ruby-for-ios-developers-bundler/)
|
34
|
+
to be:
|
28
35
|
|
29
36
|
gem "cocoapods"
|
30
37
|
gem "cocoapods-fix-react-native"
|
31
38
|
|
32
|
-
Then remove any React Native related `post_install` code, and
|
39
|
+
Then remove any React Native related `pre_install` and `post_install` code, and
|
40
|
+
add this to the top level of your `Podfile`:
|
33
41
|
|
34
42
|
plugin 'cocoapods-fix-react-native'
|
35
43
|
|
36
|
-
For the first time you do this, I'd recommend running `rm -rf Pods; bundle exec
|
37
|
-
`bundle exec pod install` like normal.
|
44
|
+
For the first time you do this, I'd recommend running `rm -rf Pods; bundle exec
|
45
|
+
pod install`. After that you can `bundle exec pod install` like normal.
|
38
46
|
|
39
47
|
## How do I Update This?
|
40
48
|
|
41
|
-
|
49
|
+
bundle update cocoapods-fix-react-native
|
42
50
|
|
43
|
-
This project is auto-deployed after every merged PR, so it's should always be
|
51
|
+
This project is auto-deployed after every merged PR, so it's should always be
|
52
|
+
up-to-date.
|
44
53
|
|
45
54
|
## How Does This Work?
|
46
55
|
|
47
|
-
A CocoaPods plugin can register
|
48
|
-
|
56
|
+
A CocoaPods plugin can register hooks before and after installation, just like
|
57
|
+
you can in your `Podfile`. This hook will first look at what version of React
|
58
|
+
Native is installed, and will then run a corresponding scripts to make changes
|
59
|
+
to the environment.
|
49
60
|
|
50
61
|
## Contributing Back
|
51
62
|
|
52
|
-
You'll note that this repo has issues disabled, I'm not going to make the time
|
53
|
-
fixes to this. I have a lot of projects,
|
54
|
-
|
63
|
+
You'll note that this repo has issues disabled, I'm not going to make the time
|
64
|
+
to support questions and requests for fixes to this. I have a lot of projects,
|
65
|
+
and only so much time. However, I'm happy to handle the mainainance and upkeep
|
66
|
+
from code people submit. If you want a change, you'll need to do so yourself, so
|
67
|
+
let's cover how you do that:
|
55
68
|
|
56
|
-
This project is very specific about what versions of React Native it supports,
|
69
|
+
This project is very specific about what versions of React Native it supports,
|
70
|
+
you can see them in the folder
|
57
71
|
[`lib/cocoapods-fix-react-native/versions/`][versions]:
|
58
72
|
|
59
73
|
```
|
60
74
|
~/dev/projects/react-native/cocoapods-fix-react-native master*
|
61
75
|
❯ tree lib/cocoapods-fix-react-native/versions/
|
62
76
|
lib/cocoapods-fix-react-native/versions/
|
63
|
-
└── 0_54_4.rb
|
77
|
+
└── 0_54_4-post.rb
|
64
78
|
```
|
65
79
|
|
66
|
-
There's likely more than just one by the time you read this, but if you want to
|
67
|
-
then you're going to want to copy the
|
68
|
-
|
80
|
+
There's likely more than just one by the time you read this, but if you want to
|
81
|
+
use a version that isn't supported yet, then you're going to want to copy the
|
82
|
+
most recent into a new file. The files are named by converting dots to
|
83
|
+
underscores. E.g. `0.54.4` -> `0_54_4-pre.rb`/`0_54_4-post.rb`.
|
69
84
|
|
70
|
-
The scripts itself should be entirely self contained, so that it's easy to
|
85
|
+
The scripts itself should be entirely self contained, so that it's easy to
|
86
|
+
understand without learning the project.
|
71
87
|
|
72
|
-
The biggest change you'd need to make from the sort of code you can find inside
|
73
|
-
|
74
|
-
`
|
88
|
+
The biggest change you'd need to make from the sort of code you can find inside
|
89
|
+
the issues is that it needs to support many different potential roots. So
|
90
|
+
instead of just `Pods/React/*` - this plugin will also handle
|
91
|
+
`node_modules/react-native/*` and `../node_modules/react-native/*`. Basically,
|
92
|
+
your dev repo, and your prod app.
|
75
93
|
|
76
94
|
This can be done by removing `'Pods/React'` from the path and wrapping it with a
|
77
|
-
`File.join(root, 'Path/InReactLib.js')`. You'll see this in the current
|
95
|
+
`File.join($root, 'Path/InReactLib.js')`. You'll see this in the current
|
96
|
+
scripts.
|
78
97
|
|
79
98
|
### Getting Setup To Improve
|
80
99
|
|
@@ -86,18 +105,19 @@ cd cocoapods-fix-react-native
|
|
86
105
|
bundle install
|
87
106
|
```
|
88
107
|
|
89
|
-
You want to use a `:path` based gem in your project's Gemfile to point to the
|
90
|
-
`Gemfile` something like this:
|
108
|
+
You want to use a `:path` based gem in your project's Gemfile to point to the
|
109
|
+
cloned repo. Make you to your App's `Gemfile` something like this:
|
91
110
|
|
92
111
|
```ruby
|
93
112
|
gem 'cocoapods', '~> 1.4.0'
|
94
113
|
gem 'cocoapods-fix-react-native', path: "../../../../react-native/cocoapods-fix-react-native"
|
95
114
|
```
|
96
115
|
|
97
|
-
Then when you run `bundle exec pod install` in that project, it will use the the
|
116
|
+
Then when you run `bundle exec pod install` in that project, it will use the the
|
117
|
+
code from your cloned copy.
|
98
118
|
|
99
|
-
As `use_frameworks!` is more strict than static libraries, I'd recommend working
|
100
|
-
frameworks.
|
119
|
+
As `use_frameworks!` is more strict than static libraries, I'd recommend working
|
120
|
+
on this project using a repo that has frameworks.
|
101
121
|
|
102
122
|
[eigen]: https://github.com/artsy/eigen/
|
103
123
|
[versions]: https://github.com/orta/cocoapods-fix-react-native/tree/master/lib/cocoapods-fix-react-native/versions
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'molinillo/dependency_graph'
|
2
|
+
|
3
|
+
class CocoaPodsFixReactNative
|
4
|
+
def post_fix_with_context(context)
|
5
|
+
# Get the current version of React Native in your app
|
6
|
+
react_spec = nil
|
7
|
+
context.umbrella_targets.each do |target|
|
8
|
+
react = target.specs.find { |s| s.name == 'React' || s.name.start_with?('React/') }
|
9
|
+
next if react.nil?
|
10
|
+
react_spec = react
|
11
|
+
end
|
12
|
+
|
13
|
+
if react_spec.nil?
|
14
|
+
Pod::UI.warn "No React dependency found"
|
15
|
+
return
|
16
|
+
end
|
17
|
+
|
18
|
+
version = react_spec.version.to_s
|
19
|
+
|
20
|
+
unless patch_exist?(version)
|
21
|
+
Pod::UI.warn "CP-Fix-React-Native does not support #{version} yet, please send " +
|
22
|
+
'PRs to https://github.com/orta/cocoapods-fix-react-native'
|
23
|
+
return
|
24
|
+
end
|
25
|
+
|
26
|
+
path_to_fix = version_file(version)
|
27
|
+
|
28
|
+
if File.exist? path_to_fix
|
29
|
+
Pod::UI.section "Patching React Native #{version}" do
|
30
|
+
require(path_to_fix)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def pre_fix_with_context(context)
|
36
|
+
# Get the current version of React Native in your app
|
37
|
+
locked_dependencies = Molinillo::DependencyGraph.new
|
38
|
+
context.lockfile.dependencies.each do |dependency|
|
39
|
+
locked_dependencies.add_vertex(dependency.name, dependency, true)
|
40
|
+
end
|
41
|
+
|
42
|
+
sources = context.podfile.sources.map do |source|
|
43
|
+
Pod::Config.instance.sources_manager.source_with_name_or_url(source)
|
44
|
+
end
|
45
|
+
|
46
|
+
resolver = Pod::Resolver.new(context.sandbox, context.podfile, locked_dependencies, sources, true)
|
47
|
+
target_definitions = resolver.resolve
|
48
|
+
|
49
|
+
react_spec = nil
|
50
|
+
|
51
|
+
target_definitions.each do |(definition, dependencies)|
|
52
|
+
next if definition.name == 'Pods'
|
53
|
+
|
54
|
+
react = dependencies.find { |d| d.spec.name == 'React' || d.spec.name.start_with?('React/') }
|
55
|
+
next if react.nil?
|
56
|
+
react_spec = react.spec
|
57
|
+
end
|
58
|
+
|
59
|
+
return if react_spec.nil?
|
60
|
+
|
61
|
+
version = react_spec.version.to_s
|
62
|
+
|
63
|
+
# There will probably always be a neeed for the post, but a pre can be ignored
|
64
|
+
return unless patch_exist?(version)
|
65
|
+
|
66
|
+
path_to_fix = version_file(version, 'pre')
|
67
|
+
|
68
|
+
if File.exist? path_to_fix
|
69
|
+
Pod::UI.section "Patching React Native #{version}" do
|
70
|
+
require(path_to_fix)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
private
|
76
|
+
|
77
|
+
def patch_exist?(version)
|
78
|
+
version_file_name = version.tr('.', '_')
|
79
|
+
patches = Dir.glob(File.join(versions_path, "#{version_file_name}-*"))
|
80
|
+
patches.present?
|
81
|
+
end
|
82
|
+
|
83
|
+
def version_file(version, suffix = 'post')
|
84
|
+
file_to_parse = version.tr('.', '_') + "-#{suffix}.rb"
|
85
|
+
File.join(versions_path, file_to_parse)
|
86
|
+
end
|
87
|
+
|
88
|
+
def versions_path
|
89
|
+
File.expand_path('../versions', __FILE__)
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
class ReactDependencyVersion
|
2
|
+
def fix_with_context(context)
|
3
|
+
all_pods_targets = context.pods_project.targets
|
4
|
+
all_pods_targets.each do |t|
|
5
|
+
deployment_target = t.build_configurations.first.build_settings['IPHONEOS_DEPLOYMENT_TARGET']
|
6
|
+
has_react_dep = t.dependencies.find { |dep| dep.name == 'React' }
|
7
|
+
|
8
|
+
if has_react_dep && deployment_target == '4.3'
|
9
|
+
raise 'You have a Pod which has a deployment target of 4.3, and a dependency on React.' \
|
10
|
+
"\nIn order for React Native to compile you need to give the Podspec for #{t.name} a version like `s.platform = :ios, '9.0'`.\n"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
File without changes
|
File without changes
|
data/lib/cocoapods_plugin.rb
CHANGED
@@ -1,20 +1,20 @@
|
|
1
|
-
require 'cocoapods-fix-react-native/
|
1
|
+
require 'cocoapods-fix-react-native/fix_with_context'
|
2
|
+
require 'cocoapods-fix-react-native/issues/react_dependency_version'
|
3
|
+
|
4
|
+
Pod::HooksManager.register('cocoapods-fix-react-native', :pre_install) do |context|
|
5
|
+
# The pre-fix resolver, usually for modifying Podspecs
|
6
|
+
fixer = CocoaPodsFixReactNative.new
|
7
|
+
fixer.pre_fix_with_context(context)
|
8
|
+
end
|
9
|
+
|
2
10
|
|
3
11
|
Pod::HooksManager.register('cocoapods-fix-react-native', :post_install) do |context|
|
4
|
-
|
5
12
|
# Check that the min version of iOS has been set right for CocoaPods
|
6
13
|
# This happens when a pod has a lower than iOS 6 deployment target.
|
7
|
-
|
8
|
-
|
9
|
-
deployment_target = t.build_configurations.first.build_settings['IPHONEOS_DEPLOYMENT_TARGET']
|
10
|
-
has_react_dep = t.dependencies.find { |dep| dep.name == "React" }
|
11
|
-
|
12
|
-
if has_react_dep && deployment_target == '4.3'
|
13
|
-
raise 'You have a Pod which has a deployment target of 4.3, and a dependency on React.' +
|
14
|
-
"\nIn order for React Native to compile you need to give the Podspec for #{t.name} a version like `s.platform = :ios, '9.0'`.\n"
|
15
|
-
end
|
16
|
-
end
|
14
|
+
dep_version = ReactDependencyVersion.new
|
15
|
+
dep_version.fix_with_context(context)
|
17
16
|
|
17
|
+
# The post-fix resolver, for editing the RN source code after it's been installed
|
18
18
|
fixer = CocoaPodsFixReactNative.new
|
19
|
-
fixer.
|
19
|
+
fixer.post_fix_with_context(context)
|
20
20
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cocoapods-fix-react-native
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2018.
|
4
|
+
version: 2018.05.03.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Orta Therox
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-05-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -53,10 +53,11 @@ files:
|
|
53
53
|
- Rakefile
|
54
54
|
- cocoapods-fix-react-native.gemspec
|
55
55
|
- lib/cocoapods-fix-react-native.rb
|
56
|
-
- lib/cocoapods-fix-react-native/
|
56
|
+
- lib/cocoapods-fix-react-native/fix_with_context.rb
|
57
|
+
- lib/cocoapods-fix-react-native/issues/react_dependency_version.rb
|
57
58
|
- lib/cocoapods-fix-react-native/versions/0_53_3.rb
|
58
|
-
- lib/cocoapods-fix-react-native/versions/0_54_2.rb
|
59
|
-
- lib/cocoapods-fix-react-native/versions/0_54_4.rb
|
59
|
+
- lib/cocoapods-fix-react-native/versions/0_54_2-post.rb
|
60
|
+
- lib/cocoapods-fix-react-native/versions/0_54_4-post.rb
|
60
61
|
- lib/cocoapods_plugin.rb
|
61
62
|
- spec/command/native_spec.rb
|
62
63
|
- spec/spec_helper.rb
|
@@ -1,27 +0,0 @@
|
|
1
|
-
class CocoaPodsFixReactNative
|
2
|
-
def fix_with_context(context)
|
3
|
-
# Get the current version of React Native in your app
|
4
|
-
react = nil
|
5
|
-
context.umbrella_targets.each do |target|
|
6
|
-
react_spec = target.specs.find { |s| s.name == 'React' || s.name.start_with?('React/') }
|
7
|
-
react = react_spec if react_spec
|
8
|
-
end
|
9
|
-
|
10
|
-
# 0.44.1 -> 0_44_1
|
11
|
-
version = react.version.to_s
|
12
|
-
file_to_parse = version.tr('.', '_')
|
13
|
-
path_to_fix = File.join(File.dirname(__FILE__), 'versions', file_to_parse + '.rb')
|
14
|
-
|
15
|
-
# require 'pry'
|
16
|
-
# binding.pry
|
17
|
-
|
18
|
-
if File.exist? path_to_fix
|
19
|
-
Pod::UI.section "Patching React Native #{version}" do
|
20
|
-
require(path_to_fix)
|
21
|
-
end
|
22
|
-
else
|
23
|
-
Pod::UI.warn "CP-Fix-React-Native does not support #{version} yet, please send " +
|
24
|
-
'PRs to https://github.com/orta/cocoapods-fix-react-native'
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|