【问题标题】:source: unbound variable error when using Cocoapods for Firebase来源:使用 Cocoapods for Firebase 时出现未绑定变量错误
【发布时间】:2019-09-21 17:09:51
【问题描述】:

我已使用 Cocoapods 将 FirebaseGoogleTagManager 集成到我的 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 的解决方案,但徒劳无功。

非常感谢您在这方面的任何帮助。

谢谢

【问题讨论】:

  • 编辑:CocoaPods:1.6.1
  • @PaulBeusterien 所以我需要将与${EXPANDED_CODE_SIGN_IDENTITY:-} 相同的修复程序应用到"${source:-}" ?
  • 当我在 Pods-Project-frameworks.sh 文件中将所有出现的 ${source} 替换为 ${source:-} 时,错误被抑制,但框架没有在 Products 中生成Pods 项目中的目录。 @PaulBeusterien 有什么想法吗?我迫切需要让它为我的项目工作。任何指针将不胜感激。

标签: ios firebase cocoapods google-tag-manager xcode10.1


【解决方案1】:

这似乎是一些特殊的问题,可能与 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 并且版本发生更改,则可能需要重复此过程。

【讨论】:

  • 您必须记住对 PodsMyApp-frameworkds.sh 重复此更改,因为每次调用 pod install 时,此文件都会从头开始重新生成。
【解决方案2】:

好吧,这个问题我搞砸了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"

使用的指南和来源:

Pod 文件:

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. 使用上面提到的来自 Code Push 的 guide 创建 Xcode 配置
  4. 未知...

在旅途中的某个地方,我最终得到了 PODS_CONFIGURATION_BUILD_DIR 构建设置,该设置具有 ${PODS_BUILD_DIR}/Release$(EFFECTIVE_PLATFORM_NAME) for 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 文件夹,而由于PODS_CONFIGURATION_BUILD_DIR 设置或类似设置,其余部分在Beta-iphoneos 中,我尝试更改为默认值,但是然后构建甚至在到达这个构建阶段之前就失败了[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/

在这里有点累,只是想它可能会帮助有类似情况的任何人,希望我能提供更多帮助,欢迎反馈。

【讨论】:

    【解决方案3】:

    当我的框架使用 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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-01
      • 1970-01-01
      • 2021-06-03
      • 2017-05-11
      • 2021-08-14
      • 2021-06-15
      相关资源
      最近更新 更多