Skip to content

Commit 5d175c6

Browse files
cipolleschifacebook-github-bot
authored andcommitted
Break Circular Dependency between React-Codegen and React-Fabric (#36210)
Summary: Pull Request resolved: #36210 One of the circular dependencies we have in OSS was between React-Codegen and React-Fabric. React-Codegen generates component which has to depends on React-Fabric because they need to use the files contained in the `react/renderer/view` folder. React-Fabric contains some components that depends on RNCore, which was generated inside the React-Codegen folder. This change generates the RNCore components inside the `ReactCommon/react/renderer/components/rncore` folder, breaking the dependency as `rncore` folder is now contained by React-Fabric itself. **Fun Fact:** That's how it always should have been. There was already a line in the `.gitignore` to exclude the content of `ReactCommon/react/renderer/components/rncore` folder. I guess that with some of the refactoring/previous projects on Codegen, this requirements has slipped. ## Changelog: [iOS][Breaking] - generates RNCore components inside the ReactCommon folder and create a new pod for platform-specific ImageManager classes Reviewed By: sammy-SC, dmytrorykun Differential Revision: D43304641 fbshipit-source-id: ebb5033ce73dbcd03f880c3e204511fdce04b816
1 parent 6d34952 commit 5d175c6

File tree

16 files changed

+130
-38
lines changed

16 files changed

+130
-38
lines changed

React/React-RCTFabric.podspec

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ if ENV['USE_FRAMEWORKS']
3939
header_search_paths << "\"${PODS_CONFIGURATION_BUILD_DIR}/React-Fabric/React_Fabric.framework/Headers/react/renderer/imagemanager/platform/ios\""
4040
header_search_paths << "\"${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers\""
4141
header_search_paths << "\"${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers/react/renderer/graphics/platform/ios\""
42+
header_search_paths << "\"${PODS_CONFIGURATION_BUILD_DIR}/React-ImageManager/React_ImageManager.framework/Headers\""
4243
end
4344

4445
Pod::Spec.new do |s|
@@ -66,6 +67,7 @@ Pod::Spec.new do |s|
6667
s.dependency "React-Core", version
6768
s.dependency "React-Fabric", version
6869
s.dependency "React-RCTImage", version
70+
s.dependency "React-ImageManager"
6971
s.dependency "RCT-Folly/Fabric", folly_version
7072

7173
s.test_spec 'Tests' do |test_spec|

ReactCommon/React-Fabric.podspec

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ Pod::Spec.new do |s|
8181
header_search_path = [
8282
"\"$(PODS_ROOT)/boost\"",
8383
"\"$(PODS_TARGET_SRCROOT)/ReactCommon\"",
84-
"\"$(PODS_ROOT)/RCT-Folly\""
84+
"\"$(PODS_ROOT)/RCT-Folly\"",
8585
]
8686

8787
if ENV['USE_FRAMEWORKS']
@@ -161,13 +161,19 @@ Pod::Spec.new do |s|
161161
sss.header_dir = "react/renderer/components/modal"
162162
end
163163

164+
ss.subspec "rncore" do |sss|
165+
sss.dependency folly_dep_name, folly_version
166+
sss.compiler_flags = folly_compiler_flags
167+
sss.source_files = "react/renderer/components/rncore/**/*.{m,mm,cpp,h}"
168+
sss.header_dir = "react/renderer/components/rncore"
169+
end
170+
164171
ss.subspec "root" do |sss|
165172
sss.dependency folly_dep_name, folly_version
166173
sss.compiler_flags = folly_compiler_flags
167174
sss.source_files = "react/renderer/components/root/**/*.{m,mm,cpp,h}"
168175
sss.exclude_files = "react/renderer/components/root/tests"
169176
sss.header_dir = "react/renderer/components/root"
170-
171177
end
172178

173179
ss.subspec "safeareaview" do |sss|
@@ -243,13 +249,9 @@ Pod::Spec.new do |s|
243249
end
244250

245251
s.subspec "imagemanager" do |ss|
246-
ss.dependency "React-RCTImage", version
247252
ss.dependency folly_dep_name, folly_version
248253
ss.compiler_flags = folly_compiler_flags
249-
ss.source_files = "react/renderer/imagemanager/**/*.{m,mm,cpp,h}"
250-
ss.exclude_files = "react/renderer/imagemanager/tests",
251-
"react/renderer/imagemanager/platform/android",
252-
"react/renderer/imagemanager/platform/cxx"
254+
ss.source_files = "react/renderer/imagemanager/*.{m,mm,cpp,h}"
253255
ss.header_dir = "react/renderer/imagemanager"
254256
end
255257

ReactCommon/React-rncore.podspec

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,5 +37,6 @@ Pod::Spec.new do |s|
3737
:js_srcs_dir => "#{react_native_path}/Libraries",
3838
:library_name => "rncore",
3939
:library_type => "components",
40+
:output_dir => "#{react_native_path}/../ReactCommon"
4041
})
4142
end
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
# Copyright (c) Meta Platforms, Inc. and affiliates.
2+
#
3+
# This source code is licensed under the MIT license found in the
4+
# LICENSE file in the root directory of this source tree.
5+
6+
require "json"
7+
8+
package = JSON.parse(File.read(File.join(__dir__, "..", "..", "..", "..", "..", "..", "package.json")))
9+
version = package['version']
10+
11+
source = { :git => 'https://github.com/facebook/react-native.git' }
12+
if version == '1000.0.0'
13+
# This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in.
14+
source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
15+
else
16+
source[:tag] = "v#{version}"
17+
end
18+
19+
folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32'
20+
boost_compiler_flags = '-Wno-documentation'
21+
22+
Pod::Spec.new do |s|
23+
source_files = "**/*.{m,mm,cpp,h}"
24+
header_search_paths = [
25+
"\"$(PODS_ROOT)/boost\"",
26+
"\"$(PODS_TARGET_SRCROOT)/../../../\"",
27+
"\"$(PODS_TARGET_SRCROOT)\"",
28+
"\"$(PODS_ROOT)/RCT-Folly\"",
29+
]
30+
31+
s.name = "React-ImageManager"
32+
s.version = version
33+
s.summary = "Fabric for React Native."
34+
s.homepage = "https://reactnative.dev/"
35+
s.license = package["license"]
36+
s.author = "Meta Platforms, Inc. and its affiliates"
37+
s.platforms = { :ios => "12.4" }
38+
s.source = source
39+
s.compiler_flags = folly_compiler_flags + ' ' + boost_compiler_flags
40+
s.source_files = source_files
41+
s.header_dir = "react/renderer/imagemanager"
42+
43+
if ENV['USE_FRAMEWORKS']
44+
s.module_name = "React_ImageManager"
45+
s.header_mappings_dir = "./"
46+
header_search_paths = header_search_paths + [
47+
"\"${PODS_CONFIGURATION_BUILD_DIR}/React-Fabric/React_Fabric.framework/Headers\"",
48+
"\"$(PODS_ROOT)/DoubleConversion\"",
49+
"\"${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers\"",
50+
"\"${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers/react/renderer/graphics/platform/ios\"",
51+
]
52+
end
53+
54+
s.pod_target_xcconfig = {
55+
"USE_HEADERMAP" => "NO",
56+
"HEADER_SEARCH_PATHS" => header_search_paths.join(" "),
57+
"CLANG_CXX_LANGUAGE_STANDARD" => "c++17"
58+
}
59+
60+
s.dependency "RCT-Folly/Fabric"
61+
s.dependency "React-Fabric"
62+
s.dependency "React-Core/Default"
63+
s.dependency "React-RCTImage"
64+
end

ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/ImageManager.mm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
* LICENSE file in the root directory of this source tree.
66
*/
77

8-
#include "ImageManager.h"
8+
#import <react/renderer/imagemanager/ImageManager.h>
99

1010
#import <React/RCTImageLoaderWithAttributionProtocol.h>
1111
#import <React/RCTUtils.h>

ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/ImageRequest.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
* LICENSE file in the root directory of this source tree.
66
*/
77

8-
#include "ImageRequest.h"
8+
#include <react/renderer/imagemanager/ImageRequest.h>
99

1010
namespace facebook {
1111
namespace react {

ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTImageManager.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
#import <UIKit/UIKit.h>
99

10-
#import <RCTImageManagerProtocol.h>
10+
#import "RCTImageManagerProtocol.h"
1111

1212
NS_ASSUME_NONNULL_BEGIN
1313

ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTSyncImageManager.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
#import <UIKit/UIKit.h>
99

10-
#import <RCTImageManagerProtocol.h>
10+
#import "RCTImageManagerProtocol.h"
1111

1212
NS_ASSUME_NONNULL_BEGIN
1313

packages/rn-tester/Podfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ end
1919
def pods(target_name, options = {}, use_flipper: !IN_CI && !USE_FRAMEWORKS)
2020
project 'RNTesterPods.xcodeproj'
2121

22-
fabric_enabled = true
22+
fabric_enabled = ENV['USE_FRAMEWORKS'] == 'dynamic' ? false : true
2323

2424
# Hermes is now enabled by default.
2525
# The following line will only disable Hermes if the USE_HERMES envvar is SET to a value other than 1 (e.g. USE_HERMES=0).

packages/rn-tester/Podfile.lock

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ PODS:
127127
- RCTRequired
128128
- RCTTypeSafety
129129
- React-Core
130+
- React-Fabric
130131
- React-graphics
131132
- React-jsi
132133
- React-jsiexecutor
@@ -398,6 +399,7 @@ PODS:
398399
- React-Fabric/components/inputaccessory (= 1000.0.0)
399400
- React-Fabric/components/legacyviewmanagerinterop (= 1000.0.0)
400401
- React-Fabric/components/modal (= 1000.0.0)
402+
- React-Fabric/components/rncore (= 1000.0.0)
401403
- React-Fabric/components/root (= 1000.0.0)
402404
- React-Fabric/components/safeareaview (= 1000.0.0)
403405
- React-Fabric/components/scrollview (= 1000.0.0)
@@ -449,6 +451,14 @@ PODS:
449451
- React-jsi (= 1000.0.0)
450452
- React-jsiexecutor (= 1000.0.0)
451453
- ReactCommon/turbomodule/core (= 1000.0.0)
454+
- React-Fabric/components/rncore (1000.0.0):
455+
- RCT-Folly/Fabric (= 2021.07.22.00)
456+
- RCTRequired (= 1000.0.0)
457+
- RCTTypeSafety (= 1000.0.0)
458+
- React-graphics (= 1000.0.0)
459+
- React-jsi (= 1000.0.0)
460+
- React-jsiexecutor (= 1000.0.0)
461+
- ReactCommon/turbomodule/core (= 1000.0.0)
452462
- React-Fabric/components/root (1000.0.0):
453463
- RCT-Folly/Fabric (= 2021.07.22.00)
454464
- RCTRequired (= 1000.0.0)
@@ -545,7 +555,6 @@ PODS:
545555
- React-graphics (= 1000.0.0)
546556
- React-jsi (= 1000.0.0)
547557
- React-jsiexecutor (= 1000.0.0)
548-
- React-RCTImage (= 1000.0.0)
549558
- ReactCommon/turbomodule/core (= 1000.0.0)
550559
- React-Fabric/leakchecker (1000.0.0):
551560
- RCT-Folly/Fabric (= 2021.07.22.00)
@@ -629,6 +638,7 @@ PODS:
629638
- React-jsiexecutor (= 1000.0.0)
630639
- ReactCommon/turbomodule/core (= 1000.0.0)
631640
- React-graphics (1000.0.0):
641+
- glog
632642
- RCT-Folly/Fabric (= 2021.07.22.00)
633643
- React-Core/Default (= 1000.0.0)
634644
- React-hermes (1000.0.0):
@@ -642,6 +652,11 @@ PODS:
642652
- React-jsiexecutor (= 1000.0.0)
643653
- React-jsinspector (= 1000.0.0)
644654
- React-perflogger (= 1000.0.0)
655+
- React-ImageManager (1000.0.0):
656+
- RCT-Folly/Fabric
657+
- React-Core/Default
658+
- React-Fabric
659+
- React-RCTImage
645660
- React-jsi (1000.0.0):
646661
- boost (= 1.76.0)
647662
- DoubleConversion
@@ -688,6 +703,7 @@ PODS:
688703
- RCT-Folly/Fabric (= 2021.07.22.00)
689704
- React-Core (= 1000.0.0)
690705
- React-Fabric (= 1000.0.0)
706+
- React-ImageManager
691707
- React-RCTImage (= 1000.0.0)
692708
- React-RCTImage (1000.0.0):
693709
- RCT-Folly (= 2021.07.22.00)
@@ -825,6 +841,7 @@ DEPENDENCIES:
825841
- React-Fabric (from `../../ReactCommon`)
826842
- React-graphics (from `../../ReactCommon/react/renderer/graphics`)
827843
- React-hermes (from `../../ReactCommon/hermes`)
844+
- React-ImageManager (from `../../ReactCommon/react/renderer/imagemanager/platform/ios`)
828845
- React-jsi (from `../../ReactCommon/jsi`)
829846
- React-jsiexecutor (from `../../ReactCommon/jsiexecutor`)
830847
- React-jsinspector (from `../../ReactCommon/jsinspector`)
@@ -904,6 +921,8 @@ EXTERNAL SOURCES:
904921
:path: "../../ReactCommon/react/renderer/graphics"
905922
React-hermes:
906923
:path: "../../ReactCommon/hermes"
924+
React-ImageManager:
925+
:path: "../../ReactCommon/react/renderer/imagemanager/platform/ios"
907926
React-jsi:
908927
:path: "../../ReactCommon/jsi"
909928
React-jsiexecutor:
@@ -975,13 +994,14 @@ SPEC CHECKSUMS:
975994
RCTTypeSafety: a41e253b4ed644708899857d912b2f50c7b6214d
976995
React: 2fc6c4c656cccd6753016528ad41199c16fd558e
977996
React-callinvoker: a7d5e883a83bb9bd3985b08be832c5e76451d18f
978-
React-Codegen: 4f1e911c128928e425e11698ad7859dfd0f92e20
997+
React-Codegen: 1d5974f7b1384b458c5e38f1aad902d0bfce1c80
979998
React-Core: 279a6e5ee79e88faa99157169b560c49635973d7
980999
React-CoreModules: d3ee40954b381edc514301341e8b895febfc1848
9811000
React-cxxreact: aff243750dad852080636e615d7ae5639381735b
982-
React-Fabric: 62b9929a7345f941d8833630f37d9440b2dda438
983-
React-graphics: cb8a85648695c60f33a00d732b985f734d1470d8
1001+
React-Fabric: 6b5c30b6e60a85446cc5d3702fa262fd1fc15619
1002+
React-graphics: e70886fff4b79bec3745de761900a770029591f2
9841003
React-hermes: 7f0e87d44b1c7cfbdd11aa3c070d04435fe75d57
1004+
React-ImageManager: c22bb185bc1b1557071da61f929070ed56fb3859
9851005
React-jsi: e4c75a1cf727c8761908ac2eeb1084e47ba88a26
9861006
React-jsiexecutor: 8361f78286021782d885e0888bb059a4045c59b9
9871007
React-jsinspector: 9b56a373a6797114e1d89a7dffa98ee98af67a8f
@@ -991,7 +1011,7 @@ SPEC CHECKSUMS:
9911011
React-RCTAnimation: 6741f7be3e269e057c1426074cc70f34b56e114b
9921012
React-RCTAppDelegate: 0b3b2c1e02c02f952f5033535ddb23d690e3b890
9931013
React-RCTBlob: fd1ee93e48aa67b0183346a59754375de93de63d
994-
React-RCTFabric: db1d7fe55db4811b63ae4060078e7048ebb4a918
1014+
React-RCTFabric: 533df4e11d99af97a78d4a400b4cab44925358e9
9951015
React-RCTImage: 055685a12c88939437f6520d9e7c120cd666cbf1
9961016
React-RCTLinking: b149b3ff1f96fa93fc445230b9c171adb0e5572c
9971017
React-RCTNetwork: 21abb4231182651f48b7035beaa011b1ab7ae8f4
@@ -1000,14 +1020,14 @@ SPEC CHECKSUMS:
10001020
React-RCTTest: 81ebfa8c2e1b0b482effe12485e6486dc0ff70d7
10011021
React-RCTText: 4e5ae05b778a0ed2b22b012af025da5e1a1c4e54
10021022
React-RCTVibration: ecfd04c1886a9c9a4e31a466c0fbcf6b36e92fde
1003-
React-rncore: 1235cadc4feaa607c9af12ca157b8ae991ade3a5
1023+
React-rncore: 3ef1d281e86300d2c8f97625f4a2fcea6602c5d5
10041024
React-runtimeexecutor: c7b2cd6babf6cc50340398bfbb7a9da13c93093f
10051025
ReactCommon: fdc30b91d89bfd2ed919c2cbccb460435f1f43f4
1006-
ScreenshotManager: 37152a3841a53f2de5c0013c58835b8738894553
1026+
ScreenshotManager: fb68e0677077569df974c9cbeaeb54f764d002ba
10071027
SocketRocket: fccef3f9c5cedea1353a9ef6ada904fde10d6608
10081028
Yoga: 1b1a12ff3d86a10565ea7cbe057d42f5e5fb2a07
10091029
YogaKit: f782866e155069a2cca2517aafea43200b01fd5a
10101030

1011-
PODFILE CHECKSUM: 920fb3b0e3c9dbdf8d86707f80cf0e7f2dc85c70
1031+
PODFILE CHECKSUM: 5f0460f3a7599f90e5d4759fdec7d7343fe7923d
10121032

10131033
COCOAPODS: 1.11.3

scripts/cocoapods/__tests__/codegen_utils-test.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -555,6 +555,7 @@ def get_podspec_fabric_and_script_phases(script_phases)
555555
specs[:dependencies].merge!({
556556
'React-graphics': [],
557557
'React-rncore': [],
558+
'React-Fabric': [],
558559
})
559560

560561
specs[:'script_phases'] = script_phases
@@ -570,6 +571,7 @@ def get_podspec_when_use_frameworks
570571

571572
specs[:dependencies].merge!({
572573
'React-graphics': [],
574+
'React-Fabric': [],
573575
})
574576

575577
return specs

scripts/cocoapods/__tests__/fabric-test.rb

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,21 +42,17 @@ def test_setupFabric_whenNewArchEnabled_installPods
4242
setup_fabric!(:react_native_path => prefix, new_arch_enabled: true)
4343

4444
# Assert
45-
check_installed_pods(prefix, install_rncore: false)
45+
check_installed_pods(prefix)
4646
end
4747

48-
def check_installed_pods(prefix, install_rncore: true)
49-
assert_equal($podInvocationCount, install_rncore ? 5 : 4)
48+
def check_installed_pods(prefix)
49+
assert_equal($podInvocationCount, 5)
5050

5151
check_pod("React-Fabric", :path => "#{prefix}/ReactCommon")
5252
check_pod("React-graphics", :path => "#{prefix}/ReactCommon/react/renderer/graphics")
5353
check_pod("React-RCTFabric", :path => "#{prefix}/React", :modular_headers => true)
5454
check_pod("RCT-Folly/Fabric", :podspec => "#{prefix}/third-party-podspecs/RCT-Folly.podspec")
55-
if install_rncore
56-
check_pod("React-rncore", :path => "#{prefix}/ReactCommon")
57-
else
58-
assert_nil($podInvocation["React-rncore"])
59-
end
55+
check_pod("React-ImageManager", :path => "#{prefix}/ReactCommon/react/renderer/imagemanager/platform/ios")
6056
end
6157

6258
def check_pod(name, path: nil, modular_headers: nil, podspec: nil)

scripts/cocoapods/codegen_utils.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ def get_react_codegen_spec(package_json_file, folly_version: '2021.07.22.00', fa
134134
if fabric_enabled
135135
spec[:'dependencies'].merge!({
136136
'React-graphics': [],
137+
'React-Fabric': [],
137138
});
138139
end
139140

scripts/cocoapods/fabric.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ def setup_fabric!(react_native_path: "../node_modules/react-native", new_arch_en
1111
pod 'React-Fabric', :path => "#{react_native_path}/ReactCommon"
1212
pod 'React-graphics', :path => "#{react_native_path}/ReactCommon/react/renderer/graphics"
1313
pod 'React-RCTFabric', :path => "#{react_native_path}/React", :modular_headers => true
14+
pod 'React-ImageManager', :path => "#{react_native_path}/ReactCommon/react/renderer/imagemanager/platform/ios"
1415
pod 'RCT-Folly/Fabric', :podspec => "#{react_native_path}/third-party-podspecs/RCT-Folly.podspec"
1516

16-
1717
pod 'React-rncore', :path => "#{react_native_path}/ReactCommon" if !new_arch_enabled
1818
end

0 commit comments

Comments
 (0)