react_native_util gem
Work in progress
Community utility CLI for React Native projects.
Converts a project created with react-native init to use CocoaPods with the
React pod from node_modules. This preserves compatibility with
react-native link. A converted project will still start the Metro packager
automatically via a Run Script build phase in the Xcode project. This is an
alternative to performing manual surgery on a project in Xcode.
Prerequisites
macOS & Xcode required
The react_pod command requires yarn from Homebrew and the react-native-cli.
If installing react_native_util from the Homebrew tap, yarn will be
automatically installed if not present. The react-native-cli may also be
installed from Homebrew if desired:
brew install jdee/tap/react_native_util --with-react-native-cli
If running from RubyGems, please make sure these packages are installed:
brew install yarn
npm install -g react-native-cli
or
brew install react-native-cli
Installation
[sudo] gem install react_native_util
Install from Homebrew tap
brew install jdee/tap/react_native_util
Include react-native-cli from Homebrew:
brew install jdee/tap/react_native_util --with-react-native-cli
Gemfile
gem 'react_native_util'
Fastlane
See https://github.com/jdee/fastlane-plugin-react_native_util
fastlane add_plugin react_native_util
Usage
react_native_util -h
rn -h
rn react_pod -h
react_pod command
Converts a React Native Xcode project to use the React pod from node_modules
instead of the projects in the Libraries group. This makes it easier to manage
native dependencies while preserving compatibility with react-native link.
The command looks for your app's package.json in the current directory and
expects your Xcode project to be located under the ios subdirectory and have
the name specified for your app in package.json. If a Podfile is found in the
ios subdirectory, the conversion will fail.
The React.xcodeproj in the Libraries group of a project created by
react-native init automatically starts the Metro packager via a Run Script
build phase. When the react_pod command removes the Libraries group from your
app project, it adds an equivalent build phase to your app project so that the
packager will automatically be started when necessary by Xcode.
Use the -u or --update option to update the packager script after
updating React Native, in case the packager script on the React.xcodeproj changes
after it's removed from your project.
Options
| option | description | env. var. |
|---|---|---|
| -h, --help | Print command help | |
| -t, --trace | Print a stack trace in case of error | |
| -u, --update | Update a previously converted project | |
| --[no-]repo-update | Don't update the local podspec repo | REACT_NATIVE_UTIL_REPO_UPDATE |
Try it out
Convert examples/TestApp.
First install dependencies.
bundle check || bundle install
Then use the Rake task
bundle exec rake react_pod
or the CLI.
cd examples/TestApp
bundle exec rn react_pod
Finally see the changes.
git status
Typical command output:
2019-05-15T19:48:43-07:00 react_native_util react_pod v0.6.0
2019-05-15T19:48:46-07:00 Darwin 18.5.0 x86_64
2019-05-15T19:48:46-07:00 Ruby 2.6.3: ~/.rvm/rubies/ruby-2.6.3/bin/ruby
2019-05-15T19:48:46-07:00 RubyGems 3.0.3: ~/.rvm/rubies/ruby-2.6.3/bin/gem
2019-05-15T19:48:46-07:00 Bundler 2.0.1: ~/.rvm/gems/ruby-2.6.3/bin/bundle
2019-05-15T19:48:46-07:00 react-native-cli: ~/.nvm/versions/node/v10.15.0/bin/react-native
2019-05-15T19:48:46-07:00 react-native-cli: 2.0.1
2019-05-15T19:48:46-07:00 react-native: 0.59.8
2019-05-15T19:48:46-07:00 yarn 1.16.0: /usr/local/bin/yarn
2019-05-15T19:48:47-07:00 cocoapods 1.6.2: ~/.rvm/gems/ruby-2.6.3/bin/pod
2019-05-15T19:48:47-07:00 cocoapods-core: 1.6.2
2019-05-15T19:48:47-07:00 package.json:
2019-05-15T19:48:47-07:00 app name: "TestApp"
2019-05-15T19:48:47-07:00 Found Xcode project at ~/github/$USER/react_native_util/examples/TestApp/ios/TestApp.xcodeproj
2019-05-15T19:48:47-07:00 Dependencies:
2019-05-15T19:48:47-07:00 react-native-webview
2019-05-15T19:48:47-07:00 Unlinking dependencies
[
Convert your own app with Rake
From this repo:
bundle exec rake react_pod[/path/to/your/app]
Rake task
Add to Rakefile:
require 'react_native_util/rake'
ReactNativeUtil::Rake::ReactPodTask.new
Customize:
require 'react_native_util/rake'
ReactNativeUtil::Rake::ReactPodTask.new(
:react_pod, # task name
'Convert project to use React pod', # description
'Update project', # description for :update task
chdir: '/path/to/rn/project', # path to project package.json
repo_update: true # optionally disable pod repo update
)
Override chdir at the command line:
rake react_pod[/path/to/another/rn/project]
Convert project:
rake react_pod
Update converted project:
rake react_pod:update
Ruby script
require 'react_native_util/converter'
Dir.chdir '/path/to/rn/project' do
begin
converter = ReactNativeUtil::Converter.new(repo_update: true)
# Convert a project to use the React pod
converter.convert_to_react_pod!
# Update a converted project
converter.update_project!
rescue ReactNativeUtil::BaseException => e
puts "Error from ReactNativeUtil::Converter: #{e.message}"
end
end
Documentation
Hosted Yard documentation available at https://www.rubydoc.info/gems/react_native_util.