我正在查看微软移动中心SDK的source code for react-native。反应原生有几个本机模块,推荐的安装方法是通过Cocoapods。
现在,每个模块都有podspec,但没有一个提到React
作为依赖。例如,appcenter-crashes.podspec
具有以下依赖关系:
s.dependency 'AppCenterReactNativeShared'
s.dependency 'AppCenter/Crashes'
AppCenterReactNativeShared.podspec
刚刚
s.dependency 'AppCenter/Core', '1.1.0'
然而,该模块是反应原生的桥梁,依赖于React
并从其来源React
导入。例如,AppCenterReactNativeCrashes.m
包含以下行:
#import "AppCenterReactNativeCrashes.h"
// Support React Native headers both in the React namespace, where they are in RN version 0.40+,
// and no namespace, for older versions of React Native
#if __has_include(<React/RCTAssert.h>)
#import <React/RCTAssert.h>
#import <React/RCTBridgeModule.h>
...
接下来,在我的react-native项目中,我可以链接移动中心,使用Podfile构建和运行我的应用程序,如下所示:
target 'example' do
pod 'AppCenter/Crashes', '~> 1.0.1'
pod 'AppCenter/Analytics', '~> 1.0.1'
pod 'AppCenterReactNativeShared', '~> 1.0.1'
end
同样,我不需要在这里提及React
pod及其子规格!
现在在我自己的react-native本机模块中,我必须声明依赖项,如:
s.dependency 'React'
s.dependency 'some-other-dependency-my-module-needs'
然后在我的应用Podfile
中,我添加了React
pod:
pod 'yoga', path: "#{rn_path}/ReactCommon/yoga/yoga.podspec"
pod 'React', path: rn_path, subspecs: [
'Core',
'RCTActionSheet',
...
如果我不在原始模块podspec中包含React
,则会收到错误fatal error: 'React/RCTBridgeModule.h' file not found
。如果我没有将React
添加到Pofile,那么Cocoapods drags会从其存储库中弃用React pod并且构建中断。
所以,我的问题是移动中心原生模块在podspecs中没有React
怎么可能?我如何在我的原生模块中摆脱它?
答案 0 :(得分:1)
根据App Center SDK documentation for React Native,您必须运行react-native link
,这将为React Native for iOS添加本机依赖项。
react-native版本实际上是在Javascript级别的package.json
中定义的,react-native link
将为该版本安装相应的本机依赖项。
当我们对SDK进行更改时,我们使用测试应用程序来托管项目,以便我们可以在同一个XCode工作区中编辑测试应用程序和SDK代码。
答案 1 :(得分:1)
让我解释一下“greenfield”(从头开始创建本机应用程序)和“brownfield”(现有的Objective-C / Swift应用程序迁移以反应原生)iOS应用程序如何适用于App Center React Native SDK。
对于“绿地”,从头开始创建的React Native应用程序,无论是通过react-native init {myapp}
还是通过create-react-native-app {myapp}
创建的,react
和react-native
依赖项都会在创建过程中自动添加并在package.json
。
对于“brownfield”React Native应用程序,假设您遵循React Native Integration with Existing Apps documentation将Objective-C / Swift应用程序转换为React Native,则需要在{{1}中引用React
依赖项像Configuring CocoaPods dependencies中的示例:
Podfile
您可以在App Center SDK中查看示例“brownfield”应用的Podfile
。在此示例中,# The target name is most likely the name of your project.
target 'NumberTileGame' do
# Your 'node_modules' directory is probably in the root of your project,
# but if not, adjust the `:path` accordingly
pod 'React', :path => '../node_modules/react-native', :subspecs => [
'Core',
'DevSupport', # Include this to enable In-App Devmenu if RN >= 0.43
'RCTText',
'RCTNetwork',
'RCTWebSocket', # needed for debugging
# Add any other subspecs you want to use in your project
]
# Explicitly include Yoga if you are using RN >= 0.42.0
pod 'yoga', :path => '../node_modules/react-native/ReactCommon/yoga'
# Third party deps podspec link
pod 'DoubleConversion', :podspec => '../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec'
pod 'GLog', :podspec => '../node_modules/react-native/third-party-podspecs/GLog.podspec'
pod 'Folly', :podspec => '../node_modules/react-native/third-party-podspecs/Folly.podspec'
end
中的React
是引用,并且棕色地块应用程序需要查找反应引用。换句话说,如果Podfile
中没有React
引用,您会看到与Podfile
类似的错误。