Permalink
Browse files

Fixes current CI failures and allows tree shaking of native dev suppo…

…rt code.

Summary:
* The dev support code moved into a `DevSupport` subspec, meaning that only if the subspec is specified in the user’s Podfile will the packager client, dev menu, etc be included. This is mainly done through checks for header availability.

  It also improves the weird situation where you had to specify the `RCTWebSocket` subspec if you wanted to be able to use the packager client during development.

* I removed hardcoding the release version in the podspec on release, because the podspec still relies on `package.json` when evaluating, so there’s no real point in not also getting the version number from there. This should remove any requirement to perform maintenance of the OSS release script regarding the podspec.
Closes #12602

Differential Revision: D4621021

Pulled By: ericvicenti

fbshipit-source-id: 6c208371fc40ea607809a6ab05dd3714ed9980cf
  • Loading branch information...
alloy authored and facebook-github-bot committed Feb 27, 2017
1 parent 24a7665 commit 19caaba1d50df84463c7349e49ce5d58a0d100f4
View
@@ -1,10 +1,19 @@
require "json"
package = JSON.parse(File.read(File.join(__dir__, "package.json")))
version = package['version']
source = { :git => 'https://github.com/facebook/react-native.git' }
if version == '1000.0.0'
# This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in.
source[:commit] = `git rev-parse HEAD`.strip
else
source[:tag] = "v#{version}"
end
Pod::Spec.new do |s|
s.name = "React"
s.version = package["version"]
s.version = version
s.summary = package["description"]
s.description = <<-DESC
React Native apps are built using the React JS
@@ -22,7 +31,7 @@ Pod::Spec.new do |s|
s.homepage = "http://facebook.github.io/react-native/"
s.license = package["license"]
s.author = "Facebook"
s.source = { :git => "https://github.com/facebook/react-native.git", :tag => "v#{s.version}" }
s.source = source
s.default_subspec = "Core"
s.requires_arc = true
s.platform = :ios, "8.0"
@@ -34,11 +43,17 @@ Pod::Spec.new do |s|
ss.dependency "Yoga", "#{package["version"]}.React"
ss.dependency "React/cxxreact"
ss.source_files = "React/**/*.{c,h,m,mm,S}"
ss.exclude_files = "**/__tests__/*", "IntegrationTests/*", "React/**/RCTTVView.*", "ReactCommon/yoga/*", "React/Cxx*/*"
ss.exclude_files = "**/__tests__/*", "IntegrationTests/*", "React/DevSupport/*", "React/Modules/RCTDev{LoadingView,Menu}.*", "React/**/RCTTVView.*", "ReactCommon/yoga/*", "React/Cxx*/*"
ss.framework = "JavaScriptCore"
ss.libraries = "stdc++"
end
s.subspec "DevSupport" do |ss|
ss.dependency "React/Core"
ss.dependency "React/RCTWebSocket"
ss.source_files = "React/DevSupport/*", "React/Modules/RCTDev{LoadingView,Menu}.*"
end
s.subspec "tvOS" do |ss|
ss.dependency "React/Core"
ss.source_files = "React/**/RCTTVView.{h, m}"
@@ -14,7 +14,6 @@
#import "RCTBridge.h"
#import "RCTBridgeMethod.h"
#import "RCTConvert.h"
#import "RCTDevLoadingView.h"
#import "RCTDisplayLink.h"
#import "RCTJSCExecutor.h"
#import "RCTJavaScriptLoader.h"
@@ -25,6 +24,10 @@
#import "RCTRedBox.h"
#import "RCTUtils.h"
#if RCT_DEV && __has_include("RCTDevLoadingView.h")
#import "RCTDevLoadingView.h"
#endif
#define RCTAssertJSThread() \
RCTAssert(![NSStringFromClass([self->_javaScriptExecutor class]) isEqualToString:@"RCTJSCExecutor"] || \
[[[NSThread currentThread] name] isEqualToString:RCTJSCThreadName], \
@@ -116,7 +119,7 @@ - (void)start
sourceCode = source;
dispatch_group_leave(initModulesAndLoadSource);
} onProgress:^(RCTLoadingProgress *progressData) {
#ifdef RCT_DEV
#if RCT_DEV && __has_include("RCTDevLoadingView.h")
RCTDevLoadingView *loadingView = [weakSelf moduleForClass:[RCTDevLoadingView class]];
[loadingView updateProgress:progressData];
#endif
@@ -24,7 +24,6 @@
#import "RCTAssert.h"
#import "RCTBridge+Private.h"
#import "RCTDefines.h"
#import "RCTDevMenu.h"
#import "RCTDevSettings.h"
#import "RCTJSCErrorHandling.h"
#import "RCTJSCProfiler.h"
@@ -34,6 +33,10 @@
#import "RCTProfile.h"
#import "RCTUtils.h"
#if (RCT_PROFILE || RCT_DEV) && __has_include("RCTDevMenu.h")
#import "RCTDevMenu.h"
#endif
NSString *const RCTJSCThreadName = @"com.facebook.react.JavaScript";
NSString *const RCTJavaScriptContextCreatedNotification = @"RCTJavaScriptContextCreatedNotification";
RCT_EXTERN NSString *const RCTFBJSContextClassKey = @"_RCTFBJSContextClassKey";
@@ -167,6 +170,7 @@ @implementation RCTJSCExecutor
#if RCT_DEV
static void RCTInstallJSCProfiler(RCTBridge *bridge, JSContextRef context)
{
#if __has_include("RCTDevMenu.h")
__weak RCTBridge *weakBridge = bridge;
__weak RCTDevSettings *devSettings = bridge.devSettings;
if (RCTJSCProfilerIsSupported()) {
@@ -186,6 +190,7 @@ static void RCTInstallJSCProfiler(RCTBridge *bridge, JSContextRef context)
}
}]];
}
#endif
}
#endif
@@ -396,18 +401,21 @@ - (void)setUp
// Add toggles for JSC's sampling profiler, if the profiler is enabled
if (JSC_JSSamplingProfilerEnabled(context.JSGlobalContextRef)) {
// Mark this thread as the main JS thread before starting profiling.
JSC_JSStartSamplingProfilingOnMainJSCThread(context.JSGlobalContextRef);
// Mark this thread as the main JS thread before starting profiling.
JSC_JSStartSamplingProfilingOnMainJSCThread(context.JSGlobalContextRef);
// Allow to toggle the sampling profiler through RN's dev menu
__weak JSContext *weakContext = self->_context.context;
#if __has_include("RCTDevMenu.h")
// Allow to toggle the sampling profiler through RN's dev menu
[self->_bridge.devMenu addItem:[RCTDevMenuItem buttonItemWithTitle:@"Start / Stop JS Sampling Profiler" handler:^{
RCTJSCExecutor *strongSelf = weakSelf;
if (!strongSelf.valid || !weakContext) {
return;
}
[weakSelf.bridge.devSettings toggleJSCSamplingProfiler];
}]];
#endif
// Allow for the profiler to be poked from JS code as well
// (see SamplingProfiler.js for an example of how it could be used with the JSCSamplingProfiler module).
@@ -18,13 +18,9 @@
#import "JSCSamplingProfiler.h"
#import "RCTBridge+Private.h"
#import "RCTBridgeModule.h"
#import "RCTDevMenu.h"
#import "RCTEventDispatcher.h"
#import "RCTLog.h"
#import "RCTPackagerClient.h"
#import "RCTProfile.h"
#import "RCTReloadPackagerMethod.h"
#import "RCTSamplingProfilerPackagerMethod.h"
#import "RCTUtils.h"
NSString *const kRCTDevSettingProfilingEnabled = @"profilingEnabled";
@@ -42,6 +38,11 @@
NSString *const kRCTDevSettingsUserDefaultsKey = @"RCTDevMenu";
#if RCT_DEV
#if __has_include("RCTPackagerClient.h")
#import "RCTPackagerClient.h"
#import "RCTReloadPackagerMethod.h"
#import "RCTSamplingProfilerPackagerMethod.h"
#endif
@interface RCTDevSettingsUserDefaultsDataSource : NSObject <RCTDevSettingsDataSource>
@@ -459,6 +460,9 @@ - (void)jsLoaded:(NSNotification *)notification
- (NSURL *)packagerURL
{
#if !__has_include("RCTWebSocketObserver.h")
return nil;
#else
NSString *host = [_bridge.bundleURL host];
NSString *scheme = [_bridge.bundleURL scheme];
if (!host) {
@@ -471,6 +475,7 @@ - (NSURL *)packagerURL
port = @8081; // Packager default port
}
return [NSURL URLWithString:[NSString stringWithFormat:@"%@://%@:%@/message?role=ios-rn-rctdevmenu", scheme, host, port]];
#endif
}
// TODO: Move non-UI logic into separate RCTDevSettings module
@@ -483,6 +488,7 @@ - (void)connectPackager
return;
}
#if __has_include("RCTPackagerClient.h")
// The jsPackagerClient is a static map that holds different packager clients per the packagerURL
// In case many instances of DevMenu are created, the latest instance that use the same URL as
// previous instances will override given packager client's method handlers
@@ -505,6 +511,7 @@ - (void)connectPackager
[packagerClient addHandler:[[RCTSamplingProfilerPackagerMethod alloc] initWithBridge:_bridge]
forMethod:@"pokeSamplingProfiler"];
[packagerClient start];
#endif
}
@end
@@ -16,7 +16,6 @@
#import <mach/mach.h>
#import "RCTBridge.h"
#import "RCTDevMenu.h"
#import "RCTDevSettings.h"
#import "RCTFPSGraph.h"
#import "RCTInvalidating.h"
@@ -27,6 +26,10 @@
#import "RCTUIManager.h"
#import "RCTBridge+Private.h"
#if __has_include("RCTDevMenu.h")
#import "RCTDevMenu.h"
#endif
static NSString *const RCTPerfMonitorCellIdentifier = @"RCTPerfMonitorCellIdentifier";
static CGFloat const RCTPerfMonitorBarHeight = 50;
@@ -74,11 +77,11 @@ static vm_size_t RCTGetResidentMemorySize(void)
return info.resident_size;
}
@class RCTDevMenuItem;
@interface RCTPerfMonitor : NSObject <RCTBridgeModule, RCTInvalidating, UITableViewDataSource, UITableViewDelegate>
#if __has_include("RCTDevMenu.h")
@property (nonatomic, strong, readonly) RCTDevMenuItem *devMenuItem;
#endif
@property (nonatomic, strong, readonly) UIPanGestureRecognizer *gestureRecognizer;
@property (nonatomic, strong, readonly) UIView *container;
@property (nonatomic, strong, readonly) UILabel *memory;
@@ -93,7 +96,9 @@ @interface RCTPerfMonitor : NSObject <RCTBridgeModule, RCTInvalidating, UITableV
@end
@implementation RCTPerfMonitor {
#if __has_include("RCTDevMenu.h")
RCTDevMenuItem *_devMenuItem;
#endif
UIPanGestureRecognizer *_gestureRecognizer;
UIView *_container;
UILabel *_memory;
@@ -142,14 +147,17 @@ - (void)setBridge:(RCTBridge *)bridge
{
_bridge = bridge;
#if __has_include("RCTDevMenu.h")
[_bridge.devMenu addItem:self.devMenuItem];
#endif
}
- (void)invalidate
{
[self hide];
}
#if __has_include("RCTDevMenu.h")
- (RCTDevMenuItem *)devMenuItem
{
if (!_devMenuItem) {
@@ -173,6 +181,7 @@ - (RCTDevMenuItem *)devMenuItem
return _devMenuItem;
}
#endif
- (UIPanGestureRecognizer *)gestureRecognizer
{
@@ -11,7 +11,7 @@
/**
* This script bumps a new version for open source releases.
* It updates the version in podspec/json/gradle files and makes sure they are consistent between each other
* It updates the version in json/gradle files and makes sure they are consistent between each other
* After changing the files it makes a commit and tags it.
* All you have to do is push changes to remote and CI will make a new build.
*/
@@ -54,17 +54,11 @@ if (sed(`-i`, /^VERSION_NAME=.*/, `VERSION_NAME=${version}`, `ReactAndroid/gradl
exit(1);
}
// - change React.podspec
if (sed(`-i`, /s\.version\s*=.*/, `s.version = \"${version}\"`, `React.podspec`).code) {
echo(`Couldn't update version for React.podspec`);
exit(1);
}
// verify that files changed, we just do a git diff and check how many times version is added across files
let numberOfChangedLinesWithNewVersion = exec(`git diff -U0 | grep '^[+]' | grep -c ${version} `, {silent: true})
.stdout.trim();
if (+numberOfChangedLinesWithNewVersion !== 3) {
echo(`Failed to update all the files. React.podspec, package.json and gradle.properties must have versions in them`);
if (+numberOfChangedLinesWithNewVersion !== 2) {
echo(`Failed to update all the files. package.json and gradle.properties must have versions in them`);
echo(`Fix the issue, revert and try again`);
exec(`git diff`);
exit(1);

1 comment on commit 19caaba

@hramos

This comment has been minimized.

Show comment
Hide comment
@hramos

hramos Feb 28, 2017

Contributor

Thanks for this!

Contributor

hramos commented on 19caaba Feb 28, 2017

Thanks for this!

Please sign in to comment.