Skip to content

[iOS][RN 0.82] Circular dependency between React-jsc and React-utils in pods #54267

@anta-semenov

Description

@anta-semenov

Description

0.82.1 version introduced circular dependency in pods.

Specifically this line

add_dependency(s, "React-utils", :additional_framework_paths => ["react/utils/platform/ios"])
that wasn't in 0.79.5 version

Adding React-utils as dependency to React-runtimeexecutor causes this chain:
React-jsi -> React-jsitooling -> React-runtimeexecutor -> React-utils -> React-jsi

There was a similar issue before #51577 but there is no any solution, pr was closed

Steps to reproduce

  1. cd ReproducerApp
  2. yarn
  3. cd ios
  4. bundle install
  5. bundle exec pod install

Erro in reproducer is a bit different that I have in real project, but it's also connected to React-jsc and React-jsitooling, it's make sence that from React-jsitooling there is no way to React-jsc as React-jsitooling is a dependency of React-jsc

React Native Version

0.82.1

Affected Platforms

Build - MacOS

Output of npx @react-native-community/cli info

System:
  OS: macOS 15.5
  CPU: (8) arm64 Apple M1 Pro
  Memory: 155.89 MB / 16.00 GB
  Shell:
    version: 3.2.57
    path: /bin/bash
Binaries:
  Node:
    version: 22.11.0
    path: /usr/local/bin/node
  Yarn:
    version: 1.22.19
    path: /usr/local/bin/yarn
  npm:
    version: 10.9.0
    path: /usr/local/bin/npm
  Watchman:
    version: 2024.12.02.00
    path: /opt/homebrew/bin/watchman
Managers:
  CocoaPods:
    version: 1.15.2
    path: /Users/anton/.rbenv/shims/pod
SDKs:
  iOS SDK:
    Platforms:
      - DriverKit 24.2
      - iOS 18.2
      - macOS 15.2
      - tvOS 18.2
      - visionOS 2.2
      - watchOS 11.2
  Android SDK: Not Found
IDEs:
  Android Studio: 2024.2 AI-242.23726.103.2422.12816248
  Xcode:
    version: 16.2/16C5032a
    path: /usr/bin/xcodebuild
Languages:
  Java:
    version: 17.0.12
    path: /usr/bin/javac
  Ruby:
    version: 3.3.6
    path: /Users/anton/.rbenv/shims/ruby
npmPackages:
  "@react-native-community/cli": Not Found
  react: Not Found
  react-native: Not Found
  react-native-macos: Not Found
npmGlobalPackages:
  "*react-native*": Not Found
Android:
  hermesEnabled: true
  newArchEnabled: true
iOS:
  hermesEnabled: Not found
  newArchEnabled: false // don't now why it shows false, it's 0.82.1 version which should have only new arch

Stacktrace or Logs

**Project error**
Analyzing dependencies
RNFBAnalytics: Using default Firebase/Analytics with Ad Ids. May require App Tracking Transparency. Not allowed for Kids apps.
RNFBAnalytics: You may set variable `$RNFirebaseAnalyticsWithoutAdIdSupport=true` in Podfile to use analytics without ad ids.
RNFBAnalytics: GoogleAppMeasurementOnDeviceConversion pod added
RNFBAnalytics: Using overridden static_framework value of 'true'
RNFBApp: Using overridden static_framework value of 'true'
RNFBCrashlytics: Using overridden static_framework value of 'true'
RNFBMessaging: Using overridden static_framework value of 'true'
RNFBPerf: Using overridden static_framework value of 'true'
Fetching podspec for `hermes-engine` from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`
[Hermes] Using release tarball from URL: https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/0.82.1/react-native-artifacts-0.82.1-hermes-ios-debug.tar.gz
[Lottie React Native] Using install_modules_dependencies
/Users/anton/Documents/Develop/Projects/drops-frontend/react-native/node_modules/react-native-fbsdk-next/react-native-fbsdk-next.podspec:4: warning: already initialized constant Pod::FBSDKVersion
/Users/anton/Documents/Develop/Projects/drops-frontend/react-native/node_modules/react-native-fbsdk-next/react-native-fbsdk-next.podspec:4: warning: previous definition of FBSDKVersion was here
[!] There is a circular dependency between React-jsc and React-cxxreact and React-runtimeexecutor and React-utils

**Reproducer error**

ArgumentError - There is no path from React-jsitooling to React-jsc
/Users/anton/Documents/Develop/Projects/react-native-circular-dependencies/ReproducerApp/vendor/bundle/ruby/3.3.0/gems/molinillo-0.8.0/lib/molinillo/dependency_graph.rb:249:in `path'
/Users/anton/Documents/Develop/Projects/react-native-circular-dependencies/ReproducerApp/vendor/bundle/ruby/3.3.0/gems/molinillo-0.8.0/lib/molinillo/dependency_graph.rb:193:in `add_edge'
/Users/anton/Documents/Develop/Projects/react-native-circular-dependencies/ReproducerApp/vendor/bundle/ruby/3.3.0/gems/molinillo-0.8.0/lib/molinillo/dependency_graph.rb:152:in `block in add_child_vertex'
/Users/anton/Documents/Develop/Projects/react-native-circular-dependencies/ReproducerApp/vendor/bundle/ruby/3.3.0/gems/molinillo-0.8.0/lib/molinillo/dependency_graph.rb:150:in `each'
/Users/anton/Documents/Develop/Projects/react-native-circular-dependencies/ReproducerApp/vendor/bundle/ruby/3.3.0/gems/molinillo-0.8.0/lib/molinillo/dependency_graph.rb:150:in `add_child_vertex'
/Users/anton/Documents/Develop/Projects/react-native-circular-dependencies/ReproducerApp/vendor/bundle/ruby/3.3.0/gems/molinillo-0.8.0/lib/molinillo/resolution.rb:738:in `block in require_nested_dependencies_for'
/Users/anton/Documents/Develop/Projects/react-native-circular-dependencies/ReproducerApp/vendor/bundle/ruby/3.3.0/gems/molinillo-0.8.0/lib/molinillo/resolution.rb:737:in `each'
/Users/anton/Documents/Develop/Projects/react-native-circular-dependencies/ReproducerApp/vendor/bundle/ruby/3.3.0/gems/molinillo-0.8.0/lib/molinillo/resolution.rb:737:in `require_nested_dependencies_for'
/Users/anton/Documents/Develop/Projects/react-native-circular-dependencies/ReproducerApp/vendor/bundle/ruby/3.3.0/gems/molinillo-0.8.0/lib/molinillo/resolution.rb:727:in `activate_new_spec'
/Users/anton/Documents/Develop/Projects/react-native-circular-dependencies/ReproducerApp/vendor/bundle/ruby/3.3.0/gems/molinillo-0.8.0/lib/molinillo/resolution.rb:684:in `attempt_to_activate'
/Users/anton/Documents/Develop/Projects/react-native-circular-dependencies/ReproducerApp/vendor/bundle/ruby/3.3.0/gems/molinillo-0.8.0/lib/molinillo/resolution.rb:254:in `process_topmost_state'
/Users/anton/Documents/Develop/Projects/react-native-circular-dependencies/ReproducerApp/vendor/bundle/ruby/3.3.0/gems/molinillo-0.8.0/lib/molinillo/resolution.rb:182:in `resolve'
/Users/anton/Documents/Develop/Projects/react-native-circular-dependencies/ReproducerApp/vendor/bundle/ruby/3.3.0/gems/molinillo-0.8.0/lib/molinillo/resolver.rb:43:in `resolve'
/Users/anton/Documents/Develop/Projects/react-native-circular-dependencies/ReproducerApp/vendor/bundle/ruby/3.3.0/gems/cocoapods-1.15.2/lib/cocoapods/resolver.rb:94:in `resolve'
/Users/anton/Documents/Develop/Projects/react-native-circular-dependencies/ReproducerApp/vendor/bundle/ruby/3.3.0/gems/cocoapods-1.15.2/lib/cocoapods/installer/analyzer.rb:1082:in `block in resolve_dependencies'
/Users/anton/Documents/Develop/Projects/react-native-circular-dependencies/ReproducerApp/vendor/bundle/ruby/3.3.0/gems/cocoapods-1.15.2/lib/cocoapods/user_interface.rb:64:in `section'
/Users/anton/Documents/Develop/Projects/react-native-circular-dependencies/ReproducerApp/vendor/bundle/ruby/3.3.0/gems/cocoapods-1.15.2/lib/cocoapods/installer/analyzer.rb:1080:in `resolve_dependencies'
/Users/anton/Documents/Develop/Projects/react-native-circular-dependencies/ReproducerApp/vendor/bundle/ruby/3.3.0/gems/cocoapods-1.15.2/lib/cocoapods/installer/analyzer.rb:125:in `analyze'
/Users/anton/Documents/Develop/Projects/react-native-circular-dependencies/ReproducerApp/vendor/bundle/ruby/3.3.0/gems/cocoapods-1.15.2/lib/cocoapods/installer.rb:422:in `analyze'
/Users/anton/Documents/Develop/Projects/react-native-circular-dependencies/ReproducerApp/vendor/bundle/ruby/3.3.0/gems/cocoapods-1.15.2/lib/cocoapods/installer.rb:244:in `block in resolve_dependencies'
/Users/anton/Documents/Develop/Projects/react-native-circular-dependencies/ReproducerApp/vendor/bundle/ruby/3.3.0/gems/cocoapods-1.15.2/lib/cocoapods/user_interface.rb:64:in `section'
/Users/anton/Documents/Develop/Projects/react-native-circular-dependencies/ReproducerApp/vendor/bundle/ruby/3.3.0/gems/cocoapods-1.15.2/lib/cocoapods/installer.rb:243:in `resolve_dependencies'
/Users/anton/Documents/Develop/Projects/react-native-circular-dependencies/ReproducerApp/vendor/bundle/ruby/3.3.0/gems/cocoapods-1.15.2/lib/cocoapods/installer.rb:162:in `install!'
/Users/anton/Documents/Develop/Projects/react-native-circular-dependencies/ReproducerApp/vendor/bundle/ruby/3.3.0/gems/cocoapods-1.15.2/lib/cocoapods/command/install.rb:52:in `run'
/Users/anton/Documents/Develop/Projects/react-native-circular-dependencies/ReproducerApp/vendor/bundle/ruby/3.3.0/gems/claide-1.1.0/lib/claide/command.rb:334:in `run'
/Users/anton/Documents/Develop/Projects/react-native-circular-dependencies/ReproducerApp/vendor/bundle/ruby/3.3.0/gems/cocoapods-1.15.2/lib/cocoapods/command.rb:52:in `run'
/Users/anton/Documents/Develop/Projects/react-native-circular-dependencies/ReproducerApp/vendor/bundle/ruby/3.3.0/gems/cocoapods-1.15.2/bin/pod:55:in `<top (required)>'
/Users/anton/Documents/Develop/Projects/react-native-circular-dependencies/ReproducerApp/vendor/bundle/ruby/3.3.0/bin/pod:25:in `load'
/Users/anton/Documents/Develop/Projects/react-native-circular-dependencies/ReproducerApp/vendor/bundle/ruby/3.3.0/bin/pod:25:in `<top (required)>'
/Users/anton/.rbenv/versions/3.3.6/lib/ruby/3.3.0/bundler/cli/exec.rb:58:in `load'
/Users/anton/.rbenv/versions/3.3.6/lib/ruby/3.3.0/bundler/cli/exec.rb:58:in `kernel_load'
/Users/anton/.rbenv/versions/3.3.6/lib/ruby/3.3.0/bundler/cli/exec.rb:23:in `run'
/Users/anton/.rbenv/versions/3.3.6/lib/ruby/3.3.0/bundler/cli.rb:455:in `exec'
/Users/anton/.rbenv/versions/3.3.6/lib/ruby/3.3.0/bundler/vendor/thor/lib/thor/command.rb:28:in `run'
/Users/anton/.rbenv/versions/3.3.6/lib/ruby/3.3.0/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
/Users/anton/.rbenv/versions/3.3.6/lib/ruby/3.3.0/bundler/vendor/thor/lib/thor.rb:527:in `dispatch'
/Users/anton/.rbenv/versions/3.3.6/lib/ruby/3.3.0/bundler/cli.rb:35:in `dispatch'
/Users/anton/.rbenv/versions/3.3.6/lib/ruby/3.3.0/bundler/vendor/thor/lib/thor/base.rb:584:in `start'
/Users/anton/.rbenv/versions/3.3.6/lib/ruby/3.3.0/bundler/cli.rb:29:in `start'
/Users/anton/.rbenv/versions/3.3.6/lib/ruby/gems/3.3.0/gems/bundler-2.5.22/exe/bundle:28:in `block in <top (required)>'
/Users/anton/.rbenv/versions/3.3.6/lib/ruby/3.3.0/bundler/friendly_errors.rb:117:in `with_friendly_errors'
/Users/anton/.rbenv/versions/3.3.6/lib/ruby/gems/3.3.0/gems/bundler-2.5.22/exe/bundle:20:in `<top (required)>'
/Users/anton/.rbenv/versions/3.3.6/bin/bundle:25:in `load'
/Users/anton/.rbenv/versions/3.3.6/bin/bundle:25:in `<main>'

MANDATORY Reproducer

https://github.com/anta-semenov/react-native-circular-dependencies

Screenshots and Videos

No response

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions