Skip to content

Unable to use other configurations than Debug and Release on 0.40 #11813

Closed

Description

@compojoom

Description

in XCode we can duplicate the default build Configurations by navigating to our Project -> info tab -> click on the plus symbol and duplicate any of the existing configs (debug, Release). Set a new name. Now when edit our scheme and tell XCode to use our new config the build process won't finish. Most probably you'll end up with this error:

fatal error: 'React/RCTBundleURLProvider.h' file not found

After staring at the screen for a day I think that the issue is that the build script is copying the React files to either debug-iphoneos or release-iphoneos instead of using the "newconfig"-iphoneos directory.

REPROPDUCTION

Steps to reproduce:

  1. create a new RN project:
react-native init test
  1. Now open the project in XCode, click on your project in the folder tree. Then select the project -> your project and navigate to the Info tab. Duplicate one of the configurations and give it whatever name you like.

  2. Edit your current scheme and select the new configuration in the "build configuration" option. Now run the project. It should fail.

  3. You can repeat the same steps on RN 0.39 and it works...

Here a few screenshots of the proper screens in XCode:

image

image

And on this screen you can see that RTCBundleURLProvider.h is being copied, but to the wrong path
image

Solution

Don't have one yet, most probably the issue happens somewhere in runIOS.js

Additional Information

  • React Native version: 0.40
  • Platform: iOS
  • Operating System: MacOS

Activity

  1. duranmla commented on Jan 12, 2017

    @duranmla

    I think what you are looking for is something like:

    productFlavors {
            development {
                applicationId "io.app"
                versionName "${appVersionName}-development"
            }
            staging {
                applicationId "io.app"
                versionName "${appVersionName}-staging"
            }
            production {
                applicationId "io.app"
                versionName "${appVersionName}"
            }
        }
    

    check this out: 46422dd

  2. K-Leon commented on Jan 15, 2017

    @K-Leon
    Contributor

    Same Issue for me - could you find a solution @compojoom ?

    @javache I think you worked on the compilation stuff. Is there an easy way to get a Staging Target up?

    Thank you very much!

  3. K-Leon commented on Jan 15, 2017

    @K-Leon
    Contributor

    Just figured it out: You need to copy the Release Target in 'React' Project too with the same Name as the parent Target has. Now we need an idea how to make it less troublesome ( without touching React) or we just document it somewhere?

  4. christianbach commented on Jan 16, 2017

    @christianbach

    @K-Leon We have had the same issue with our Staging build configuration. Adding Staging as a configuration to the React.xcodeproj sorted our 0.40.0 build issues. Release and Debug worked out of the box.
    react-staging

  5. LeoNatan commented on Jan 17, 2017

    @LeoNatan
    Contributor

    This is a bug/feature of Xcode. It attempts to build sub-projects using the same configuration as the main project. If that configuration does not exist, Xcode uses the Release configuration. With the latest changes to public headers exposed by React.xcodeproj, these headers now go to the build path of the sub-project, which is configuration-dependent.

  6. tisho commented on Jan 17, 2017

    @tisho
    Contributor

    While adding a configuration with the same name works, it's not the most CI-friendly or future-proof solution. This is what I did, instead:

    1. Added the React build target under the current scheme for my project. (Sidenote: if you're using fastlane to deploy, keep your project's build target in first place, otherwise fastlane gets confused and thinks you're building a library, so it never builds an ipa).

    2. Added React under [Target] > Build Phases > Target Dependencies, which made Xcode build React before building the rest of the project.

    3. Under [Target] > Build Settings, added a new User-Defined setting, called REACT_HEADERS_PATH. For all configurations not named Debug or Release, I set that to $(BUILD_DIR)/Release-$(PLATFORM_NAME)/include.

    4. Under [Target] > Build Settings > Header Search Paths I added $(REACT_HEADERS_PATH) as an entry.

    5. Repeat for all targets in your project.

    When my project builds, React builds first, and since it doesn't know about configurations other than Release and Debug, it builds with the Release configuration. This places its headers under [build dir]/Products/Release-iphoneos/include. Since this path is now in the Header Search Paths of the main project, it gets picked up and everything else builds fine.

    Hope this helps.

    Updated 4/13 to mention repeating these steps for all targets (thanks @Twinski) and to change to the much shorter and more reliable $(BUILD_DIR) (thanks @hoolymama).

  7. hoolymama commented on Jan 18, 2017

    @hoolymama

    @tisho your solution worked for me. Cheers!
    I had to use
    $(BUILD_DIR)/Release-$(PLATFORM_NAME)/include
    not
    BUILD_PRODUCTS_DIR

  8. tisho commented on Jan 18, 2017

    @tisho
    Contributor

    Good catch. It was actually supposed to say BUILT_PRODUCTS_DIR, not BUILD_PRODUCTS_DIR. I edited the original post to correct that.

  9. hoolymama commented on Jan 18, 2017

    @hoolymama

    I can't quite make it work with $(BUILT_PRODUCTS_DIR)/Release-$(PLATFORM_NAME)/include
    For me it resolves to build/Staging-iphoneos/Release-iphoneos/include
    Its probably something with my configuration - I'll experiment a bit later, but for now BUILD_DIR is working okay. Cheers!

  10. thekevinbrown commented on Jan 25, 2017

    @thekevinbrown

    I built a package that should help with automatically setting all of the build configurations up in your libraries on each subsequent install:

    https://www.npmjs.com/package/react-native-schemes-manager

    Please give it a try and let me know how it works for you. We've got ~20 native libs now in most of our RN projects, so manually managing this would have been a nightmare.

  11. haleykoike commented on Jan 26, 2017

    @haleykoike

    @tisho solution worked for me too. I also had to follow the same steps to my app's Test target in addition to the main app target

  12. freakinruben commented on Feb 10, 2017

    @freakinruben

    @tisho you deserve a medal for this!

  13. philipshurpik commented on Feb 21, 2017

    @philipshurpik

    Guys, the easiest fix that I found - is to set "CONFIGURATION_BUILD_DIR" in buildSettings of your configuration like:
    CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)";

    Or if you want to set in XCode:
    Your Project -> Build Settings -> Build Locations -> Per-configuration Build Products Path
    for your new configuration: $(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)

  14. 31 remaining items

  15. varungupta85 commented on Sep 22, 2017

    @varungupta85
    Contributor

    @D1no Thanks for your reply. I looked at the react-native-schemes-manager when I was going to through the comments. I felt that it is doing a lot of magic in the background which always worries me because if things start to break in future, I am not sure where to look at. I tried the suggestions from @philipshurpik and @j2kun using which I was able to build the app using staging configuration. I feel that I should be able to get the frameworks to be also present in the IPA with some change in settings in Xcode.

    I will use the react-native-schemes-manager if I don't find a solution to this problem soon.

  16. D1no commented on Sep 22, 2017

    @D1no

    Actually there is not much magic. Just automation of a very annoying Xcode manual task. Read more at the bottom of the package, it’s sources and what it does. If all react native packages would be cocoa pods, the problem would not exist. But as they all require the rn packanger which has just two build configurations, those need to be copied for all of them. Thinkmill and we use it in production, and probably many more, and it works fine with version react-native@latest with Xcode 9.

    So, requiring xproject files from node_modules was never something Xcode was designed for. I mean, sometimes it feels likeXcode projects were not even designed for a code revision system, due to its cryptic uid file steucture.

    Until all that changes, or the guys at the metro bundler tackle this problem in a very smart way, the work stays the same. And it is very hard to configure yourself out of that.

  17. varungupta85 commented on Sep 23, 2017

    @varungupta85
    Contributor

    @D1no Thanks for the detailed reply. I feel more confident about using the scheme manager now and since I haven't been able to work around the problem I reported, I will start using it.

    I just wanted to point out one small thing that after I updated the CONFIGURATION_BUILD_DIR AND POD_CONFIGURATION_BUILD_DIR, I was able to build the app. The missing frameworks in the IPA are all pods that I have installed in my app mainly Sentry, KSCrash, RSKImageCropper and QBImagePicker`. I am not sure if it sheds any more light on the problem I am having since you said that the said issue doesn't occur with packages installed using cocoa pods and that the scheme manager is mainly to fix the projects installed using npm.

    Thanks again for taking the time to post your comments.

  18. stale commented on Nov 22, 2017

    @stale

    This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Maybe the issue has been fixed in a recent release, or perhaps it is not affecting a lot of people. If you think this issue should definitely remain open, please let us know why. Thank you for your contributions.

  19. added
    StaleThere has been a lack of activity on this issue and it may be closed soon.
    on Nov 22, 2017
  20. hushicai commented on Dec 12, 2017

    @hushicai

    worked.

  21. salujaharkirat commented on Dec 25, 2017

    @salujaharkirat

    @varungupta85 even i am facing the issue of frameworks not being listed in staging scheme. Did you find a solution for this?

  22. salujaharkirat commented on Dec 25, 2017

    @salujaharkirat

    @shohey1226 i tried the same thing but its not working for me. Looks like the pod libraries are getting copied into Staging folder instead of release which leads to #11813 (comment)

    /Users/harkirat/Library/Developer/Xcode/DerivedData/wlv1-grovuwlrhzpjbvenlreejvbtlwol/Build/Intermediates.noindex/ArchiveIntermediates/wlv1 Staging/BuildProductsPath
    tests-MBP:BuildProductsPath harkirat$ ls
    Release-iphoneos	Staging-iphoneos
    tests-MBP:BuildProductsPath harkirat$
    
    tests-MBP:BuildProductsPath harkirat$ cd Staging-iphoneos/
    tests-MBP:Staging-iphoneos harkirat$ ls
    GTMOAuth2		Mixpanel		QBImagePickerController
    GTMSessionFetcher	Pods_wlv1.framework	RSKImageCropper
    GoogleToolboxForMac	Protobuf		nanopb
    tests-MBP:Staging-iphoneos harkirat$
    
    tests-MBP:BuildProductsPath harkirat$ cd Release-iphoneos/
    tests-MBP:Release-iphoneos harkirat$ ls
    49D27CAF-3566-30BB-9FF1-63E20D4D5231.bcsymbolmap	libRCTMaterialKit.a
    57C7F55D-A2AE-30F3-A6EA-9F38A1651329.bcsymbolmap	libRCTNetwork.a
    5maFL9							libRCTSettings.a
    B00A891C-B9FD-3621-85B1-D7ACEEB3888C.bcsymbolmap	libRCTText.a
    B881CB00-A637-3C8C-90B1-36E49E358AA1.bcsymbolmap	libRCTVibration.a
    GeneratedInfoPlistDotEnv.h				libRCTWebSocket.a
    Hhe8NH							libRNDeviceInfo.a
    QBImagePicker.framework					libRNFIRMessaging.a
    QBImagePicker.framework.dSYM				libRNFS.a
    RSKImageCropper.framework				libRNFetchBlob.a
    RSKImageCropper.framework.dSYM				libRNIntercom.a
    include							libRNMixpanel.a
    libBVLinearGradient.a					libReact.a
    libBugsnagReactNative.a					libReactNativeConfig.a
    libBugsnagStatic.a					libcxxreact.a
    libCodePush.a						libdouble-conversion.a
    libRCTActionSheet.a					libimageCropPicker.a
    libRCTAnimation.a					libjschelpers.a
    libRCTCamera.a						libthird-party.a
    libRCTFBSDK.a						libyoga.a
    libRCTGeolocation.a					wlv1.app
    libRCTImage.a						wlv1.swiftmodule
    libRCTLinking.a
    

    I tried adding "$PODS_CONFIGURATION_BUILD_DIR" as recursive to FRAMEWORK_PATH but still it creates 2 folders.

  23. hussamkurd commented on Feb 20, 2018

    @hussamkurd
  24. wkoutre commented on Mar 8, 2018

    @wkoutre

    For anyone who comes across this, I managed to piece together a working XCode setup to get:

    • custom build configs working for Build and Archive in my react-native init apps (using Cocoapods); if you're using fastlane, this supports its deployment, as well
    • Microsoft's AppCenter and CodePush iOS SDKs working with said custom build configs (Staging, Angel, etc.)

    Made a post on an issue in Microsoft's code-push repo detailing my setup.

  25. aligfl commented on May 11, 2018

    @aligfl

    Shout out to @D1no! your solution worked for me! Been banging my head against the wall for the past few days. The solution worked for my CI system as well (buddybuild).

  26. DavidNorena commented on May 12, 2018

    @DavidNorena

    @D1no you should post that in a medium article !! nice !

  27. D1no commented on May 13, 2018

    @D1no

    When I jotted that down, I hoped a blog article would be obsolete by the time it goes online. Aka improvements of the metro bundler. Oh well - for better SEO I’ll add it to my todo list. Hopefully saving some devs the long path of desperate hacks until they find that comment. 🙃

  28. locked and limited conversation to collaborators on May 15, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    StaleThere has been a lack of activity on this issue and it may be closed soon.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions