facebook / react-native

A framework for building native applications using React
https://reactnative.dev
MIT License
117.1k stars 24.07k forks source link

codegen - javaPackageName is ignored with includesGeneratedCode and react-native codegen #45079

Open mfazekas opened 2 weeks ago

mfazekas commented 2 weeks ago

Description

react-native codegen ignores javaPackageName in package.json/codeGenConfig/andorid/javaPackageName and uses com.facebook.fbreact.specs

Steps to reproduce

See https://github.com/mfazekas/rn-codegen-javapackagename

See https://github.com/facebook/react-native/blob/2a6a895b17fdd4112349853e08a50c4c90886cb8/packages/react-native/scripts/codegen/generate-artifacts-executor.js#L454-L462

React Native Version

0.74.2

Affected Platforms

Runtime - Android

Areas

Codegen

Output of npx react-native info

% npx react-native info
info Fetching system and libraries information...
System:
  OS: macOS 14.5
  CPU: (12) arm64 Apple M2 Max
  Memory: 118.64 MB / 32.00 GB
  Shell:
    version: "5.9"
    path: /bin/zsh
Binaries:
  Node:
    version: 18.20.2
    path: ~/.nvm/versions/node/v18.20.2/bin/node
  Yarn:
    version: 3.6.4
    path: ~/.nvm/versions/node/v18.20.2/bin/yarn
  npm:
    version: 10.5.0
    path: ~/.nvm/versions/node/v18.20.2/bin/npm
  Watchman:
    version: 2024.05.06.00
    path: /opt/homebrew/bin/watchman
Managers:
  CocoaPods:
    version: 1.14.2
    path: /Users/boga/.rbenv/shims/pod
SDKs:
  iOS SDK:
    Platforms:
      - DriverKit 23.5
      - iOS 17.5
      - macOS 14.5
      - tvOS 17.5
      - visionOS 1.2
      - watchOS 10.5
  Android SDK: Not Found
IDEs:
  Android Studio: 2024.1 AI-241.15989.150.2411.11948838
  Xcode:
    version: 15.4/15F31d
    path: /usr/bin/xcodebuild
Languages:
  Java:
    version: 20.0.1
    path: /usr/bin/javac
  Ruby:
    version: 2.7.8
    path: /Users/boga/.rbenv/shims/ruby
npmPackages:
  "@react-native-community/cli": Not Found
  react:
    installed: 18.2.0
    wanted: 18.2.0
  react-native:
    installed: 0.74.2
    wanted: 0.74.2
  react-native-macos: Not Found
npmGlobalPackages:
  "*react-native*": Not Found
Android:
  hermesEnabled: true
  newArchEnabled: true
iOS:
  hermesEnabled: Not found
  newArchEnabled: false

Stacktrace or Logs

n/a

Reproducer

https://github.com/mfazekas/rn-codegen-javapackagename/

Screenshots and Videos

No response

cortinico commented 2 weeks ago

This is (sadly) a known bug. The issue is happening regardless of you using includesGeneratedCode or not.

I have an internal ticket to work on this. Sadly fixing it would be a breaking change for every codegen user so we're being a bit caution on when we should fix.

mfazekas commented 2 weeks ago

@cortinico thanks much.

Another issue is that outputDir is not relative to package root, but to cwd. So in the reproducer if run:

cd ReproducerApp
npx react-native codegen --path ../RTNCalculator --platform android

it generates into ./android/codegen which is ReproducerApp/android/codegen instead of ../RTNCalculator/android/codegen.

RTNCalculator/package.json:

    "includesGeneratedCode": true,
    "outputDir": {
      "android": "android/codegen"
    }

Is this a bug? Shall I open a separate issue for it?

cortinico commented 2 weeks ago

it generates into ./android/codegen which is ReproducerApp/android/codegen instead of ../RTNCalculator/android/codegen.

mmm I'm not sure this follows to your previous statement. If as you said, the path is relative to cwd (being ./ReproducerApp in your example), then stuff should be generated inside:

./RTNCalculator/android/codegen

no?

mfazekas commented 2 weeks ago

mmm I'm not sure this follows to your previous statement. If as you said, the path is relative to cwd (being ./ReproducerApp in your example), then stuff should be generated inside:

./RTNCalculator/android/codegen

no?

Sorry if I wasn't clear. I'd expect

"includesGeneratedCode": true,
    "outputDir": {
      "android": "android/codegen"
    }

to always generate into RTNCaclulator/android/codegen so always into the lib, but if I run from the app directory it creates new folder in the app

cd ReproducerApp
npx react-native codegen --path ../RTNCalculator --platform android

it generates into ReproducerApp/android/codegen

ReproducerApp % ls -la android/codegen/java/com/rtncalculator 
total 8
drwxr-xr-x  3 boga  staff    96 Jun 20 14:24 .
drwxr-xr-x  4 boga  staff   128 Jun 20 14:24 ..
-rw-r--r--  1 boga  staff  1130 Jun 20 14:24 NativeRTNCalculatorSpec.java
cortinico commented 2 weeks ago

@dmytrorykun can help you more here as he implemented the react-native codegen command. But yes this is probably a separate bug which needs a separate issue

dmytrorykun commented 2 weeks ago

This is definitely a bug. I'll take a look

mfazekas commented 2 weeks ago

@dmytrorykun opened issue #45112

atlj commented 18 hours ago

We've been hitting this issue in react-native-builder-bob. I've added a script to patch this behavior there. You can find the script here For folks who want to use this, when we land this in bob, you will be able to call it with --target codegen and it should generate the codegen specs and patch this.