来源:使用 Cocoapods for Firebase 时出现未绑定变量错误

问题描述 投票:0回答:4

我已使用 Cocoapods 将

Firebase
GoogleTagManager
集成到我的 iOS 应用程序目标中。 当我构建目标时,Xcode 不断给出错误:


Showing Recent Messages
PhaseScriptExecution [CP]\ Embed\ Pods\ Frameworks 

mkdir -p /Users/xxx.xxx/Library/Developer/Xcode/DerivedData/MyApp-enzvpdzsyhjszqbnwiclnpszlyri/Build/Products/Debug-iphonesimulator/MyApp.app/Frameworks


/Users/xxx.xxx/Projects/MyApp/Applications/MyApp/Pods/Target Support Files/Pods-MyApp/Pods-MyApp-frameworks.sh: line 43: source: unbound variable


Command /bin/sh failed with exit code 1

我多次清理了我的项目,删除了派生数据文件夹,但这些似乎都不起作用。

我的 Podfile 如下所示:

platform :ios, '11.0'

target 'MyApp' do

  use_frameworks!

  # Pods for MyApp
    pod 'Firebase/Core', '~> 5.19'
    pod 'Firebase/ABTesting'
    pod 'Firebase/Performance'
    pod 'Firebase/RemoteConfig'
    pod 'Firebase/Analytics'
    pod 'GoogleTagManager', '~> 7.1'
 end

Cocoapods 环境

CocoaPods : 1.5.3
        Ruby : ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-darwin16]
    RubyGems : 2.6.8
        Host : Mac OS X 10.14 (18A391)
       Xcode : 10.1 (10B61)
         Git : git version 2.17.2 (Apple Git-113)
Ruby lib dir : /Users/xxx.xxx/.rbenv/versions/2.4.0/lib
Repositories : master - https://github.com/CocoaPods/Specs.git @ 7c9a708dce25221eabc35ed39

我的项目设置中缺少什么导致此错误?

我花了几天时间在 SO / Cocoapods 上寻找解决方案,但徒劳无功。

在这方面的任何帮助将不胜感激。

谢谢

ios firebase cocoapods google-tag-manager xcode10.1
4个回答
1
投票

当我的框架是用M1芯片构建时,我遇到了同样的问题。 我可以通过从 Podfile 安装程序部分删除 ONLY_ACTIVE_ARCH 来解决这个问题。

所以我替换了这个:

post_install do |installer|

installer.pods_project.targets.each do |target|

target.build_configurations.each do |config|
  config.build_settings['BUILD_LIBRARY_FOR_DISTRIBUTION'] = 'YES'
  config.build_settings['ONLY_ACTIVE_ARCH'] = 'NO'

 end
end

有了这个:

post_install do |installer|

installer.pods_project.targets.each do |target|

target.build_configurations.each do |config|
  config.build_settings['BUILD_LIBRARY_FOR_DISTRIBUTION'] = 'YES'
 end
end

注意:当框架是使用非 M1 芯片构建时,我从一开始就添加了 ['ONLY_ACTIVE_ARCH'] = 'NO',以便使用“有问题的”框架在模拟器中运行我的应用程序。 所以我仍然需要这条线,具体取决于构建机器的芯片。


0
投票

这似乎是一些特殊的问题,可能与 bash 相关或其他问题。由于某些奇怪的原因,它不适用于 ~/Library/.../MyApp-xxxxx.../Build/Products/Release-iphoneos/ 目录(我们称之为 BUILD_DIR)

如果“source”未定义(这里就是这种情况),则将 ${source} 替换为 ${source:-} 没有帮助,因为它会为 source 放置一个空白,这不是您想要的。

对我来说另一个问题是 rsync 找不到上面的目录。

这就是我所做的:

  1. 让项目构建并报错。这可确保在我的 BUILD_DIR 中创建所需的框架目录,并构建框架。

  2. 在项目根目录下创建一个目录Pods-frameworks,将BUILD_DIR中的所有framework目录复制到该目录下。

  3. 在 PodsMyApp-frameworks.sh 中,最后 25 行,在调试和发布模式下调用 install_framework 以及所有与 pod 相关的框架,将 ${BUILT_PRODUCTS_DIR} 更改为定义为这个新 Pods-frameworks 目录的新宏。

  4. 再次构建项目。

问题就解决了。如果再次安装 pods 并且版本发生变化,则可能需要重复此过程。


0
投票

好吧,这个问题我折腾了4天,终于用脚本解决了。

设置

  • RN 0.61.50.59.10
  • 升级
  • Xcode 11.3.1
    • 多方案(分期、测试版)
    • 多配置(分期、测试版)
  • CocoaPods 1.9.3

相关npm包:

    "react-native": "0.61.5",
    "@react-native-firebase/app": "^8.4.6",
    "@react-native-firebase/auth": "^9.3.1",
    "@react-native-firebase/crashlytics": "^8.4.11",
    "@react-native-firebase/database": "^7.5.12",
    "@react-native-firebase/messaging": "^7.9.1",
    "react-native-code-push": "6.3.0",
    "react-native-config": "1.4.0"

使用的指南和来源:

Podfile:

platform :ios, '9.0'
require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules'

project 'lend24app',
  'Debug' => :debug,
  'Release' => :release,
  'Staging' => :release,
  'Beta' => :release


target 'lend24app' do
  use_frameworks!
  $RNFirebaseAsStaticFramework = true

  # Pods for lendmn
  pod 'FBLazyVector', :path => "../node_modules/react-native/Libraries/FBLazyVector"
  pod 'FBReactNativeSpec', :path => "../node_modules/react-native/Libraries/FBReactNativeSpec"
  pod 'RCTRequired', :path => "../node_modules/react-native/Libraries/RCTRequired"
  pod 'RCTTypeSafety', :path => "../node_modules/react-native/Libraries/TypeSafety"
  pod 'React', :path => '../node_modules/react-native/'
  pod 'React-Core', :path => '../node_modules/react-native/'
  pod 'React-CoreModules', :path => '../node_modules/react-native/React/CoreModules'
  pod 'React-Core/DevSupport', :path => '../node_modules/react-native/'
  pod 'React-RCTActionSheet', :path => '../node_modules/react-native/Libraries/ActionSheetIOS'
  pod 'React-RCTAnimation', :path => '../node_modules/react-native/Libraries/NativeAnimation'
  pod 'React-RCTBlob', :path => '../node_modules/react-native/Libraries/Blob'
  pod 'React-RCTImage', :path => '../node_modules/react-native/Libraries/Image'
  pod 'React-RCTLinking', :path => '../node_modules/react-native/Libraries/LinkingIOS'
  pod 'React-RCTNetwork', :path => '../node_modules/react-native/Libraries/Network'
  pod 'React-RCTSettings', :path => '../node_modules/react-native/Libraries/Settings'
  pod 'React-RCTText', :path => '../node_modules/react-native/Libraries/Text'
  pod 'React-RCTVibration', :path => '../node_modules/react-native/Libraries/Vibration'
  pod 'React-Core/RCTWebSocket', :path => '../node_modules/react-native/'

  pod 'React-cxxreact', :path => '../node_modules/react-native/ReactCommon/cxxreact'
  pod 'React-jsi', :path => '../node_modules/react-native/ReactCommon/jsi'
  pod 'React-jsiexecutor', :path => '../node_modules/react-native/ReactCommon/jsiexecutor'
  pod 'React-jsinspector', :path => '../node_modules/react-native/ReactCommon/jsinspector'
  pod 'ReactCommon/jscallinvoker', :path => "../node_modules/react-native/ReactCommon"
  pod 'ReactCommon/turbomodule/core', :path => "../node_modules/react-native/ReactCommon"
  pod 'Yoga', :path => '../node_modules/react-native/ReactCommon/yoga'

  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'

  pod 'RNInputMask', :path => '../node_modules/react-native-text-input-mask/ios/InputMask'
  pod 'RNVectorIcons', :path => '../node_modules/react-native-vector-icons'

  permissions_path = '../node_modules/react-native-permissions/ios'

  pod 'Permission-Camera', :path => "#{permissions_path}/Camera.podspec"
  pod 'Permission-Contacts', :path => "#{permissions_path}/Contacts.podspec"
  pod 'Permission-FaceID', :path => "#{permissions_path}/FaceID.podspec"
  pod 'Permission-LocationAlways', :path => "#{permissions_path}/LocationAlways.podspec"
  pod 'Permission-LocationWhenInUse', :path => "#{permissions_path}/LocationWhenInUse.podspec"
  pod 'Permission-MediaLibrary', :path => "#{permissions_path}/MediaLibrary.podspec"
  pod 'Permission-Notifications', :path => "#{permissions_path}/Notifications.podspec"
  pod 'Permission-PhotoLibrary', :path => "#{permissions_path}/PhotoLibrary.podspec"
  pod 'Permission-Reminders', :path => "#{permissions_path}/Reminders.podspec"
  pod 'Permission-StoreKit', :path => "#{permissions_path}/StoreKit.podspec"


  pre_install do |installer|
    installer.analysis_result.specifications.each do |s|
      s.swift_version = '4.0' unless s.swift_version
    end
    # workaround for https://github.com/CocoaPods/CocoaPods/issues/3289
    Pod::Installer::Xcode::TargetValidator.send(:define_method, :verify_no_static_framework_transitive_dependencies) {}

    installer.pod_targets.each do |pod|
      if pod.name.eql?('RNPermissions') || pod.name.start_with?('Permission-')
        def pod.build_type;
          # Uncomment one line depending on your CocoaPods version
          Pod::BuildType.static_library # >= 1.9
        end
      end
    end
  end

  post_install do |installer|
    installer.pods_project.build_configurations.each do |config|
      if config.name == 'Staging' || config.name == 'Beta'
        config.build_settings['CONFIGURATION_TEMP_DIR'] = '$(PROJECT_TEMP_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)'
        config.build_settings['CONFIGURATION_BUILD_DIR'] = '$(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)'
      end
    end
    installer.pods_project.targets.each do |target|
      target.build_configurations.each do |config|
        if config.name == 'Staging' || config.name == 'Beta'
          config.build_settings['CONFIGURATION_TEMP_DIR'] = '$(PROJECT_TEMP_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)'
          config.build_settings['PODS_CONFIGURATION_BUILD_DIR'] = '${PODS_BUILD_DIR}/Release$(EFFECTIVE_PLATFORM_NAME)'
        end
      end
    end
  end

  target 'lend24appTests' do
    inherit! :search_paths
    # Pods for testing
  end

  use_native_modules!
end

此设置是2016年以来项目逐步开发的结果,所以项目和实际配置不推荐,最好从头开始!

导致此问题的步骤,所有步骤都无法生成 beta 存档:

  1. 通过升级命令升级rn
  2. 使用 RN Upgrade helper
  3. 修补通过命令丢失的文件
  4. 使用上面提到的 Code Push 指南创建 Xcode 配置
  5. 未知...
在旅途中的某个地方,我最终得到了

PODS_CONFIGURATION_BUILD_DIR

 构建设置,其中包含 
${PODS_BUILD_DIR}/Release$(EFFECTIVE_PLATFORM_NAME)
 用于 Beta 
configuration

此时正在运行

Beta

 构建,但归档失败并显示 
source: unbound variable

每当我将

PODS_CONFIGURATION_BUILD_DIR

 更改为 
${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
 或者如果我编辑出 
Podfile
 修复相同的 
PODS_CONFIGURATION_BUILD_DIR
 更改,构建阶段会失败并显示 

'React/RCTBridgeDelegate.h' file not found.
深入研究 

...frameworks.sh

 很明显,Pods 构建输出到 
Release-iphoneos
 文件夹,而由于 
Beta-iphoneos
 设置或类似的原因,其余部分位于 
PODS_CONFIGURATION_BUILD_DIR
 中,我尝试更改为默认值,但随后构建甚至在到达此构建阶段之前就失败了 
[CP] Embed Pods Frameworks

最后我只是使用以下脚本将所有内容从

Release-iphoneos

 移动到 
Beta-iphoneos
 在此阶段之前:

+ New Run Script Phase


# Type a script or drag a script file from your workspace to insert its path. if [[ "$CONFIGURATION" == "Debug" ]]; then exit 0 elif [[ "$CONFIGURATION" == "Release" ]]; then exit 0 fi mv $BUILD_DIR/Release$EFFECTIVE_PLATFORM_NAME/* $BUILD_DIR/$CONFIGURATION$EFFECTIVE_PLATFORM_NAME/
在这里有点累,只是想这可能会对类似情况的人有所帮助,希望我能提供更多帮助,欢迎反馈。


0
投票
我认为与框架使用的c++版本有关。 对我来说,更改框架构建设置

GCC_C_LANGUAGE_STANDARD = gnu17;

GCC_C_LANGUAGE_STANDARD = gnu11;
解决了问题。

© www.soinside.com 2019 - 2024. All rights reserved.