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-cliIf running from RubyGems, please make sure these packages are installed:
brew install yarnnpm install -g react-native-clior
brew install react-native-cli
Installation
[sudo] gem install react_native_utilInstall from Homebrew tap
brew install jdee/tap/react_native_utilInclude react-native-cli from Homebrew:
brew install jdee/tap/react_native_util --with-react-native-cliGemfile
gem 'react_native_util'Fastlane
See https://github.com/jdee/fastlane-plugin-react_native_util
fastlane add_plugin react_native_utilUsage
react_native_util -h
rn -h
rn react_pod -hreact_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 installThen use the Rake task
bundle exec rake react_podor the CLI.
cd examples/TestApp
bundle exec rn react_podFinally see the changes.
git statusTypical 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
[✔] react-native unlink react-native-webview success in 0.7 s
2019-05-15T19:48:48-07:00 Generating ios/Podfile
2019-05-15T19:48:48-07:00 Removing Libraries from TestApp
2019-05-15T19:48:48-07:00 Removing libRCTBlob.a
2019-05-15T19:48:48-07:00 Removing libRCTAnimation.a
2019-05-15T19:48:48-07:00 Removing libReact.a
2019-05-15T19:48:48-07:00 Removing libRCTActionSheet.a
2019-05-15T19:48:48-07:00 Removing libRCTGeolocation.a
2019-05-15T19:48:48-07:00 Removing libRCTImage.a
2019-05-15T19:48:48-07:00 Removing libRCTLinking.a
2019-05-15T19:48:48-07:00 Removing libRCTNetwork.a
2019-05-15T19:48:48-07:00 Removing libRCTSettings.a
2019-05-15T19:48:48-07:00 Removing libRCTText.a
2019-05-15T19:48:48-07:00 Removing libRCTVibration.a
2019-05-15T19:48:48-07:00 Removing libRCTWebSocket.a
2019-05-15T19:48:48-07:00 Removing Libraries from TestAppTests
2019-05-15T19:48:48-07:00 Removing libReact.a
2019-05-15T19:48:48-07:00 Removing Libraries from TestApp-tvOS
2019-05-15T19:48:48-07:00 Removing libReact.a
2019-05-15T19:48:48-07:00 Removing libRCTAnimation.a
2019-05-15T19:48:48-07:00 Removing libRCTImage-tvOS.a
2019-05-15T19:48:48-07:00 Removing libRCTLinking-tvOS.a
2019-05-15T19:48:48-07:00 Removing libRCTNetwork-tvOS.a
2019-05-15T19:48:48-07:00 Removing libRCTSettings-tvOS.a
2019-05-15T19:48:48-07:00 Removing libRCTText-tvOS.a
2019-05-15T19:48:48-07:00 Removing libRCTWebSocket-tvOS.a
2019-05-15T19:48:48-07:00 Removing Libraries from TestApp-tvOSTests
2019-05-15T19:48:48-07:00 Removing libReact.a
2019-05-15T19:48:48-07:00 Removing RCTAnimation.xcodeproj from Libraries group.
2019-05-15T19:48:48-07:00 Removing React.xcodeproj from Libraries group.
2019-05-15T19:48:48-07:00 Removing RCTActionSheet.xcodeproj from Libraries group.
2019-05-15T19:48:48-07:00 Removing RCTBlob.xcodeproj from Libraries group.
2019-05-15T19:48:48-07:00 Removing RCTGeolocation.xcodeproj from Libraries group.
2019-05-15T19:48:48-07:00 Removing RCTImage.xcodeproj from Libraries group.
2019-05-15T19:48:48-07:00 Removing RCTLinking.xcodeproj from Libraries group.
2019-05-15T19:48:48-07:00 Removing RCTNetwork.xcodeproj from Libraries group.
2019-05-15T19:48:48-07:00 Removing RCTSettings.xcodeproj from Libraries group.
2019-05-15T19:48:48-07:00 Removing RCTText.xcodeproj from Libraries group.
2019-05-15T19:48:48-07:00 Removing RCTVibration.xcodeproj from Libraries group.
2019-05-15T19:48:48-07:00 Removing RCTWebSocket.xcodeproj from Libraries group.
2019-05-15T19:48:48-07:00 Removing Libraries group.
2019-05-15T19:48:48-07:00 Linking dependencies
[✔] react-native link react-native-webview success in 0.5 s
2019-05-15T19:48:48-07:00 Generating Pods project and ios/TestApp.xcworkspace
2019-05-15T19:48:48-07:00 Once pod install is complete, your project will be part of this workspace.
2019-05-15T19:48:48-07:00 From now on, you should build the workspace with Xcode instead of the project.
2019-05-15T19:48:48-07:00 Always add the workspace and Podfile.lock to SCM.
2019-05-15T19:48:48-07:00 It is common practice also to add the Pods directory.
2019-05-15T19:48:48-07:00 The workspace will be automatically opened when pod install completes.
[✔] pod install success in 10.6 s
2019-05-15T19:48:59-07:00 Conversion complete ✅
2019-05-15T19:48:59-07:00 $ open ios/TestApp.xcworkspace
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.newCustomize:
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_podUpdate converted project:
rake react_pod:updateRuby 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
endDocumentation
Hosted Yard documentation available at https://www.rubydoc.info/gems/react_native_util.