Skip to content

autoLinking doesn't work with monorepo #537

Closed
@yozman

Description

@yozman

Environment

info Fetching system and libraries information...
System:
    OS: macOS 10.14.5
    CPU: (4) x64 Intel(R) Core(TM) i5-4690 CPU @ 3.50GHz
    Memory: 4.87 GB / 20.00 GB
    Shell: 5.3 - /bin/zsh
  Binaries:
    Node: 12.4.0 - ~/.nvm/versions/node/v12.4.0/bin/node
    Yarn: 1.16.0 - ~/.nvm/versions/node/v12.4.0/bin/yarn
    npm: 6.9.0 - ~/.nvm/versions/node/v12.4.0/bin/npm
  SDKs:
    iOS SDK:
      Platforms: iOS 12.2, macOS 10.14, tvOS 12.2, watchOS 5.2
    Android SDK:
      API Levels: 27, 28, 29
      Build Tools: 27.0.3, 28.0.3, 29.0.0
      System Images: android-27 | Intel x86 Atom_64, android-28 | Intel x86 Atom_64, android-29 | Intel x86 Atom_64
  IDEs:
    Android Studio: 3.4 AI-183.6156.11.34.5522156
    Xcode: 10.2.1/10E1001 - /usr/bin/xcodebuild
  npmPackages:
    react: 16.8.6 => 16.8.6 
    react-native: 0.60.0 => 0.60.0

Description

I have a project use monorepo with yarn workspace feature.
it's fail when I cd ios && pod install.

Detected React Native module pods for RNRippleView, react-native-video, and react-native-webview
Analyzing dependencies
Fetching podspec for `DoubleConversion` from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`
Fetching podspec for `Folly` from `../node_modules/react-native/third-party-podspecs/Folly.podspec`
Fetching podspec for `RNRippleView` from `../`
[!] No podspec found for `RNRippleView` in `../`

then I run react-native config

Details
{
  "root": "/Users/flyboy/.dee/yozman/yoboto-app",
  "reactNativePath": "/Users/flyboy/.dee/yozman/yoboto-app/node_modules/react-native",
  "dependencies": {
    "react-native-touchable-ripple": {
      "root": "/Users/flyboy/.dee/yozman/yoboto-app/packages/react-native-touchable-ripple",
      "name": "react-native-touchable-ripple",
      "platforms": {
        "ios": {
          "sourceDir": "/Users/flyboy/.dee/yozman/yoboto-app/packages/react-native-touchable-ripple/ios",
          "folder": "/Users/flyboy/.dee/yozman/yoboto-app/packages/react-native-touchable-ripple",
          "pbxprojPath": "/Users/flyboy/.dee/yozman/yoboto-app/packages/react-native-touchable-ripple/ios/RNRippleView.xcodeproj/project.pbxproj",
          "podfile": null,
          "podspecPath": "/Users/flyboy/.dee/yozman/yoboto-app/packages/react-native-touchable-ripple/RNRippleView.podspec",
          "projectPath": "/Users/flyboy/.dee/yozman/yoboto-app/packages/react-native-touchable-ripple/ios/RNRippleView.xcodeproj",
          "projectName": "RNRippleView.xcodeproj",
          "libraryFolder": "Libraries",
          "sharedLibraries": [],
          "plist": []
        },
        "android": null
      },
      "assets": [],
      "hooks": {},
      "params": []
    },
    "react-native-video": {
      "root": "/Users/flyboy/.dee/yozman/yoboto-app/node_modules/react-native-video",
      "name": "react-native-video",
      "platforms": {
        "ios": {
          "sourceDir": "/Users/flyboy/.dee/yozman/yoboto-app/node_modules/react-native-video/ios",
          "folder": "/Users/flyboy/.dee/yozman/yoboto-app/node_modules/react-native-video",
          "pbxprojPath": "/Users/flyboy/.dee/yozman/yoboto-app/node_modules/react-native-video/ios/RCTVideo.xcodeproj/project.pbxproj",
          "podfile": null,
          "podspecPath": "/Users/flyboy/.dee/yozman/yoboto-app/node_modules/react-native-video/react-native-video.podspec",
          "projectPath": "/Users/flyboy/.dee/yozman/yoboto-app/node_modules/react-native-video/ios/RCTVideo.xcodeproj",
          "projectName": "RCTVideo.xcodeproj",
          "libraryFolder": "Libraries",
          "sharedLibraries": [],
          "plist": []
        },
        "android": {
          "sourceDir": "/Users/flyboy/.dee/yozman/yoboto-app/node_modules/react-native-video/android-exoplayer",
          "folder": "/Users/flyboy/.dee/yozman/yoboto-app/node_modules/react-native-video",
          "packageImportPath": "import com.brentvatne.react.ReactVideoPackage;",
          "packageInstance": "new ReactVideoPackage()"
        }
      },
      "assets": [],
      "hooks": {},
      "params": []
    },
    "react-native-webview": {
      "root": "/Users/flyboy/.dee/yozman/yoboto-app/node_modules/react-native-webview",
      "name": "react-native-webview",
      "platforms": {
        "ios": {
          "sourceDir": "/Users/flyboy/.dee/yozman/yoboto-app/node_modules/react-native-webview/ios",
          "folder": "/Users/flyboy/.dee/yozman/yoboto-app/node_modules/react-native-webview",
          "pbxprojPath": "/Users/flyboy/.dee/yozman/yoboto-app/node_modules/react-native-webview/ios/RNCWebView.xcodeproj/project.pbxproj",
          "podfile": null,
          "podspecPath": "/Users/flyboy/.dee/yozman/yoboto-app/node_modules/react-native-webview/react-native-webview.podspec",
          "projectPath": "/Users/flyboy/.dee/yozman/yoboto-app/node_modules/react-native-webview/ios/RNCWebView.xcodeproj",
          "projectName": "RNCWebView.xcodeproj",
          "libraryFolder": "Libraries",
          "sharedLibraries": [],
          "plist": []
        },
        "android": {
          "sourceDir": "/Users/flyboy/.dee/yozman/yoboto-app/node_modules/react-native-webview/android",
          "folder": "/Users/flyboy/.dee/yozman/yoboto-app/node_modules/react-native-webview",
          "packageImportPath": "import com.reactnativecommunity.webview.RNCWebViewPackage;",
          "packageInstance": "new RNCWebViewPackage()"
        }
      },
      "assets": [],
      "hooks": {},
      "params": []
    }
  },
  "commands": [
    {
      "name": "log-ios",
      "description": "starts iOS device syslog tail"
    },
    {
      "name": "run-ios",
      "description": "builds your app and starts it on iOS simulator",
      "examples": [
        {
          "desc": "Run on a different simulator, e.g. iPhone 5",
          "cmd": "react-native run-ios --simulator \"iPhone 5\""
        },
        {
          "desc": "Pass a non-standard location of iOS directory",
          "cmd": "react-native run-ios --project-path \"./app/ios\""
        },
        {
          "desc": "Run on a connected device, e.g. Max's iPhone",
          "cmd": "react-native run-ios --device \"Max's iPhone\""
        },
        {
          "desc": "Run on the AppleTV simulator",
          "cmd": "react-native run-ios --simulator \"Apple TV\"  --scheme \"helloworld-tvOS\""
        }
      ],
      "options": [
        {
          "name": "--simulator [string]",
          "description": "Explicitly set simulator to use. Optionally include iOS version betweenparenthesis at the end to match an exact version: \"iPhone 6 (10.0)\"",
          "default": "iPhone X"
        },
        {
          "name": "--configuration [string]",
          "description": "Explicitly set the scheme configuration to use",
          "default": "Debug"
        },
        {
          "name": "--scheme [string]",
          "description": "Explicitly set Xcode scheme to use"
        },
        {
          "name": "--project-path [string]",
          "description": "Path relative to project root where the Xcode project (.xcodeproj) lives.",
          "default": "ios"
        },
        {
          "name": "--device [string]",
          "description": "Explicitly set device to use by name.  The value is not required if you have a single device connected."
        },
        {
          "name": "--udid [string]",
          "description": "Explicitly set device to use by udid"
        },
        {
          "name": "--no-packager",
          "description": "Do not launch packager while building"
        },
        {
          "name": "--verbose",
          "description": "Do not use xcpretty even if installed"
        },
        {
          "name": "--port [number]",
          "default": 8081
        },
        {
          "name": "--terminal [string]",
          "description": "Launches the Metro Bundler in a new window using the specified terminal path."
        }
      ]
    },
    {
      "name": "log-android",
      "description": "starts logkitty"
    },
    {
      "name": "run-android",
      "description": "builds your app and starts it on a connected Android emulator or device",
      "options": [
        {
          "name": "--root [string]",
          "description": "Override the root directory for the android build (which contains the android directory)",
          "default": ""
        },
        {
          "name": "--variant [string]",
          "description": "Specify your app's build variant",
          "default": "debug"
        },
        {
          "name": "--appFolder [string]",
          "description": "Specify a different application folder name for the android source. If not, we assume is \"app\"",
          "default": "app"
        },
        {
          "name": "--appId [string]",
          "description": "Specify an applicationId to launch after build.",
          "default": ""
        },
        {
          "name": "--appIdSuffix [string]",
          "description": "Specify an applicationIdSuffix to launch after build.",
          "default": ""
        },
        {
          "name": "--main-activity [string]",
          "description": "Name of the activity to start",
          "default": "MainActivity"
        },
        {
          "name": "--deviceId [string]",
          "description": "builds your app and starts it on a specific device/simulator with the given device id (listed by running \"adb devices\" on the command line)."
        },
        {
          "name": "--no-packager",
          "description": "Do not launch packager while building"
        },
        {
          "name": "--port [number]",
          "default": 8081
        },
        {
          "name": "--terminal [string]",
          "description": "Launches the Metro Bundler in a new window using the specified terminal path."
        },
        {
          "name": "--tasks [list]",
          "description": "Run custom Gradle tasks. By default it's \"installDebug\""
        },
        {
          "name": "--no-jetifier",
          "description": "Do not run \"jetifier\" – the AndroidX transition tool. By default it runs before Gradle to ease working with libraries that don't support AndroidX yet. See more at: https://www.npmjs.com/package/jetifier.",
          "default": false
        }
      ]
    }
  ],
  "assets": [],
  "platforms": {
    "ios": {},
    "android": {}
  },
  "haste": {
    "providesModuleNodeModules": [
      "react-native"
    ],
    "platforms": [
      "ios",
      "android"
    ]
  },
  "project": {
    "ios": {
      "sourceDir": "/Users/flyboy/.dee/yozman/yoboto-app/ios",
      "folder": "/Users/flyboy/.dee/yozman/yoboto-app",
      "pbxprojPath": "/Users/flyboy/.dee/yozman/yoboto-app/ios/yoboto.xcodeproj/project.pbxproj",
      "podfile": "/Users/flyboy/.dee/yozman/yoboto-app/ios/Podfile",
      "podspecPath": null,
      "projectPath": "/Users/flyboy/.dee/yozman/yoboto-app/ios/yoboto.xcodeproj",
      "projectName": "yoboto.xcodeproj",
      "libraryFolder": "Libraries",
      "sharedLibraries": [],
      "plist": []
    },
    "android": {
      "sourceDir": "/Users/flyboy/.dee/yozman/yoboto-app/android/app",
      "isFlat": false,
      "folder": "/Users/flyboy/.dee/yozman/yoboto-app",
      "stringsPath": "/Users/flyboy/.dee/yozman/yoboto-app/android/app/src/main/res/values/strings.xml",
      "manifestPath": "/Users/flyboy/.dee/yozman/yoboto-app/android/app/src/main/AndroidManifest.xml",
      "buildGradlePath": "/Users/flyboy/.dee/yozman/yoboto-app/android/app/build.gradle",
      "settingsGradlePath": "/Users/flyboy/.dee/yozman/yoboto-app/android/settings.gradle",
      "assetsPath": "/Users/flyboy/.dee/yozman/yoboto-app/android/app/src/main/assets",
      "mainFilePath": "/Users/flyboy/.dee/yozman/yoboto-app/android/app/src/main/java/com/yoboto/MainApplication.java",
      "packageName": "com.yoboto"
    }
  }
}

I guess this comes with this commit c9aec25

# Use relative path
absolute_podspec_path = File.dirname(podspec_path)
relative_podspec_path = File.join(root, absolute_podspec_path.partition('node_modules').last(2).join())
pod spec.name, :path => relative_podspec_path

for podspec RNRippleView at #L46 absolute_podspec_path is /Users/flyboy/.dee/yozman/yoboto-app/packages/react-native-touchable-ripple/RNRippleView.podspec.
it's already relative_path and doesn't contain character node_modules.
so relative_podspec_path at #L47 will be not correct.

Reproducible Demo

Metadata

Metadata

Assignees

No one assigned

    Labels

    autolinkbugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions