在react-native模块的podspec中反应依赖

时间:2017-12-12 09:20:46

标签: ios objective-c react-native cocoapods

我正在查看微软移动中心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怎么可能?我如何在我的原生模块中摆脱它?

2 个答案:

答案 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}创建的,reactreact-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类似的错误。