How to handle different CLI versions
emin93 opened this issue ยท 11 comments
Introduction
The new RN CLI will have an updated template feature which is incompatible with the current one. As the current CLI won't go anywhere soon, we have to support both versions for a while.
I created a new branch (cli-v2) with the changes for the new CLI.
Question
How should we handle the support for both versions?
Proposals
- Maintain two separate branches (e.g.
masterandmaster-cli-v2) and release the CLI v2 compatible template with thenexttag. - Integrate a detection in the post install script and handle the differences there. This would allow us to have only one branch but it will make things a bit messy.
Both templates can live next to each other and published together:
root/
...old-template-files
template.config.js
template/
I don't think extra branching is necessary.
You'll need, however, to release a major version with every RN upgrade, because in new init the template is responsible for everything inside (ios/ and android/ will be included and they change with every RN major bump) โ the project will be copied mostly "as is" (with small templateName replacements).
While I agree that we can solve it by having everything in the same branch, I have some "concerns" / "things we should keep in mind" with it:
- The v1 template files would live in the root folder, while v2 is in the template subfolder. After setup with the v1 CLI, we'd need to remove the v2 files in the post install script as they will get copied over as well. We could solve this also by not bundling the v2 files when npm publishing the v1 template. But that won't work when developing the template locally.
- The post install script for v1 runs as an npm post install script, therefore it would also be executed in v2. This means we'd have to detect which CLI version is in use and do the according post install work.
(v1 and v2 relate to the CLI versions and not the template)
Let me know if I misunderstood something.
In v2 you can use postInitScript in template.config.js
Yes, but in v1 we use npm postinstall which will also execute in v2, correct?
Ah yea, that's true
As the shorthand syntax will be removed in the upcoming CLI version (react-native-community/cli#483 (comment)), I'd vote for releasing a new package under a new shorter name for the new CLI.
The template works completely different and is independent from the one for the old CLI, so this would make even more sense. So there is no need for using @next tag anymore.
/edit
For now it is solved by using the @next tag for the new CLI. If someone feels like picking up the topic, feel free ๐!
@emin93 is master-cli-v2 already working? i tried to run npx react-native init MyApp --template react-native-template-typescript@next and i'm getting the following error on CocoaPods
Fetching podspec for `DoubleConversion` from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`
Fetching podspec for `Folly` from `../node_modules/react-native/third-party-podspecs/Folly.podspec`
Fetching podspec for `React` from `../node_modules/react-native/`
Fetching podspec for `React-Core` from `../node_modules/react-native/React`
Fetching podspec for `React-DevSupport` from `../node_modules/react-native/React`
Fetching podspec for `React-RCTActionSheet` from `../node_modules/react-native/Libraries/ActionSheetIOS`
Fetching podspec for `React-RCTAnimation` from `../node_modules/react-native/Libraries/NativeAnimation`
Fetching podspec for `React-RCTBlob` from `../node_modules/react-native/Libraries/Blob`
Fetching podspec for `React-RCTImage` from `../node_modules/react-native/Libraries/Image`
Fetching podspec for `React-RCTLinking` from `../node_modules/react-native/Libraries/LinkingIOS`
Fetching podspec for `React-RCTNetwork` from `../node_modules/react-native/Libraries/Network`
Fetching podspec for `React-RCTSettings` from `../node_modules/react-native/Libraries/Settings`
Fetching podspec for `React-RCTText` from `../node_modules/react-native/Libraries/Text`
Fetching podspec for `React-RCTVibration` from `../node_modules/react-native/Libraries/Vibration`
Fetching podspec for `React-RCTWebSocket` from `../node_modules/react-native/Libraries/WebSocket`
Fetching podspec for `React-cxxreact` from `../node_modules/react-native/ReactCommon/cxxreact`
Fetching podspec for `React-fishhook` from `../node_modules/react-native/Libraries/fishhook`
Fetching podspec for `React-jsi` from `../node_modules/react-native/ReactCommon/jsi`
Fetching podspec for `React-jsiexecutor` from `../node_modules/react-native/ReactCommon/jsiexecutor`
Fetching podspec for `React-jsinspector` from `../node_modules/react-native/ReactCommon/jsinspector`
Fetching podspec for `glog` from `../node_modules/react-native/third-party-podspecs/glog.podspec`
Fetching podspec for `yoga` from `../node_modules/react-native/ReactCommon/yoga`
Downloading dependencies
Installing DoubleConversion (1.1.6)
Installing Folly (2018.10.22.00)
Installing React (0.60.0)
Installing React-Core (0.60.0)
Installing React-DevSupport (0.60.0)
Installing React-RCTActionSheet (0.60.0)
Installing React-RCTAnimation (0.60.0)
Installing React-RCTBlob (0.60.0)
Installing React-RCTImage (0.60.0)
Installing React-RCTLinking (0.60.0)
Installing React-RCTNetwork (0.60.0)
Installing React-RCTSettings (0.60.0)
Installing React-RCTText (0.60.0)
Installing React-RCTVibration (0.60.0)
Installing React-RCTWebSocket (0.60.0)
Installing React-cxxreact (0.60.0)
Installing React-fishhook (0.60.0)
Installing React-jsi (0.60.0)
Installing React-jsiexecutor (0.60.0)
Installing React-jsinspector (0.60.0)
Installing boost-for-react-native (1.63.0)
Installing glog (0.3.5)
[!] /bin/bash -c
set -e
#!/bin/bash
# Copyright (c) Facebook, Inc. and its affiliates.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
set -e
PLATFORM_NAME="${PLATFORM_NAME:-iphoneos}"
CURRENT_ARCH="${CURRENT_ARCH}"
if [ -z "$CURRENT_ARCH" ] || [ "$CURRENT_ARCH" == "undefined_arch" ]; then
# Xcode 10 beta sets CURRENT_ARCH to "undefined_arch", this leads to incorrect linker arg.
# it's better to rely on platform name as fallback because architecture differs between simulator and device
if [[ "$PLATFORM_NAME" == *"simulator"* ]]; then
CURRENT_ARCH="x86_64"
else
CURRENT_ARCH="armv7"
fi
fi
export CC="$(xcrun -find -sdk $PLATFORM_NAME cc) -arch $CURRENT_ARCH -isysroot $(xcrun -sdk $PLATFORM_NAME --show-sdk-path)"
export CXX="$CC"
# Remove automake symlink if it exists
if [ -h "test-driver" ]; then
rm test-driver
fi
./configure --host arm-apple-darwin
# Fix build for tvOS
cat << EOF >> src/config.h
/* Add in so we have Apple Target Conditionals */
#ifdef __APPLE__
#include <TargetConditionals.h>
#include <Availability.h>
#endif
/* Special configuration for AppleTVOS */
#if TARGET_OS_TV
#undef HAVE_SYSCALL_H
#undef HAVE_SYS_SYSCALL_H
#undef OS_MACOSX
#endif
/* Special configuration for ucontext */
#undef HAVE_UCONTEXT_H
#undef PC_FROM_UCONTEXT
#if defined(__x86_64__)
#define PC_FROM_UCONTEXT uc_mcontext->__ss.__rip
#elif defined(__i386__)
#define PC_FROM_UCONTEXT uc_mcontext->__ss.__eip
#endif
EOF
# Prepare exported header include
EXPORTED_INCLUDE_DIR="exported/glog"
mkdir -p exported/glog
cp -f src/glog/log_severity.h "$EXPORTED_INCLUDE_DIR/"
cp -f src/glog/logging.h "$EXPORTED_INCLUDE_DIR/"
cp -f src/glog/raw_logging.h "$EXPORTED_INCLUDE_DIR/"
cp -f src/glog/stl_logging.h "$EXPORTED_INCLUDE_DIR/"
cp -f src/glog/vlog_is_on.h "$EXPORTED_INCLUDE_DIR/"
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for arm-apple-darwin-strip... no
checking for strip... strip
checking for a thread-safe mkdir -p... ./install-sh -c -d
checking for gawk... no
checking for mawk... no
checking for nawk... no
checking for awk... awk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for arm-apple-darwin-gcc... /Library/Developer/CommandLineTools/usr/bin/cc -arch armv7 -isysroot
checking whether the C compiler works... no
xcrun: error: SDK "iphoneos" cannot be located
xcrun: error: SDK "iphoneos" cannot be located
xcrun: error: SDK "iphoneos" cannot be located
xcrun: error: unable to lookup item 'Path' in SDK 'iphoneos'
/Users/fecabianchi/Library/Caches/CocoaPods/Pods/External/glog/2263bd123499e5b93b5efe24871be317-1f3da/missing: Unknown `--is-lightweight' option
Try `/Users/fecabianchi/Library/Caches/CocoaPods/Pods/External/glog/2263bd123499e5b93b5efe24871be317-1f3da/missing --help' for more information
configure: WARNING: 'missing' script is too old or missing
configure: error: in `/Users/fecabianchi/Library/Caches/CocoaPods/Pods/External/glog/2263bd123499e5b93b5efe24871be317-1f3da':
configure: error: C compiler cannot create executables
See `config.log' for more details
โ Installing CocoaPods dependencies (this make take a few minutes)
error Error: Failed to install CocoaPods dependencies for iOS project, which is required by this template.
Please try again manually: "cd ./MyApp/ios && pod install".
CocoaPods documentation: https://cocoapods.org/
This shouldn't be happening (unfortunately I can't reproduce it), but can you please open up a new issue?