Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
compojoom opened this issue Jan 10, 2017 · 55 comments
Closed

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

compojoom opened this issue Jan 10, 2017 · 55 comments
Labels
Stale There has been a lack of activity on this issue and it may be closed soon.

Comments

@compojoom
Copy link
Contributor

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
@duranmla
Copy link

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

@K-Leon
Copy link
Contributor

K-Leon commented Jan 15, 2017

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!

@K-Leon
Copy link
Contributor

K-Leon commented Jan 15, 2017

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?

@christianbach
Copy link

@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

@LeoNatan
Copy link
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.

@tisho
Copy link
Contributor

tisho commented Jan 17, 2017

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).

@hoolymama
Copy link

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

@tisho
Copy link
Contributor

tisho commented Jan 18, 2017

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

@hoolymama
Copy link

hoolymama commented Jan 18, 2017

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!

@thekevinbrown
Copy link

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.

@haleykoike
Copy link

@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

sergey-akhalkov added a commit to microsoft/react-native-code-push that referenced this issue Feb 9, 2017
After RN 0.40 it is not possible to use other configurations than Debug and Release (facebook/react-native#11813)
As workaround we could make Staging’s Build Products Path value the same as for Release configuration.

Fix #688
@freakinruben
Copy link

@tisho you deserve a medal for this!

atticoos referenced this issue Feb 11, 2017
Summary:
To make React Native play nicely with our internal build infrastructure we need to properly namespace all of our header includes.

Where previously you could do `#import "RCTBridge.h"`, you must now write this as `#import <React/RCTBridge.h>`. If your xcode project still has a custom header include path, both variants will likely continue to work, but for new projects, we're defaulting the header include path to `$(BUILT_PRODUCTS_DIR)/usr/local/include`, where the React and CSSLayout targets will copy a subset of headers too. To make Xcode copy headers phase work properly, you may need to add React as an explicit dependency to your app's scheme and disable "parallelize build".

Reviewed By: mmmulani

Differential Revision: D4213120

fbshipit-source-id: 84a32a4b250c27699e6795f43584f13d594a9a82
@philipshurpik
Copy link

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)

@j2kun
Copy link

j2kun commented Mar 9, 2017

I would like to second that this is a major headache. Even if I patch it to find React, it can't find any other native dependencies. Do I have to patch the header search paths for every single dependency I add to the project?

Note, that if you're using Cocoapods, you may have to change another configuration variable to point to Release, or it won't be able to find linked Pods:

screen shot 2017-03-08 at 5 52 24 pm

@fungilation
Copy link

What about the "Per-configuration Immediate Build Products Path"? It'd make sense for Staging to share the same path as Release too?

@Twinski
Copy link

Twinski commented Apr 13, 2017

@tisho Fix seems to be working! Maybe it's also useful to say that you also should repeat the $(REACT_HEADERS_PATH) for the VigiTest Target!

@vonovak
Copy link
Contributor

vonovak commented Apr 14, 2017

If anyone is running into this issue when using xcode's workspaces, just make sure to check the settings of all your projects within the workspace.

@natdm
Copy link

natdm commented Apr 17, 2017

How do I Added the React build target under the current scheme for my project ? It's not working for me so far. Seems like that's the only step I'm missing. Still getting this error:


ld: warning: directory not found for option '-L/Users/nathanhyland/Library/Developer/Xcode/DerivedData/bideasy_rn-ddevhacvgkjqoigndhxjmlrtyyog/Build/Products/Staging'
ld: warning: directory not found for option '-L/Users/nathanhyland/Library/Developer/Xcode/DerivedData/bideasy_rn-ddevhacvgkjqoigndhxjmlrtyyog/Build/Products/Staging-iphoneos/AFNetworking'
ld: warning: directory not found for option '-L/Users/nathanhyland/Library/Developer/Xcode/DerivedData/bideasy_rn-ddevhacvgkjqoigndhxjmlrtyyog/Build/Products/Staging-iphoneos/Lock'
ld: warning: directory not found for option '-L/Users/nathanhyland/Library/Developer/Xcode/DerivedData/bideasy_rn-ddevhacvgkjqoigndhxjmlrtyyog/Build/Products/Staging-iphoneos/Masonry'
ld: warning: directory not found for option '-L/Users/nathanhyland/Library/Developer/Xcode/DerivedData/bideasy_rn-ddevhacvgkjqoigndhxjmlrtyyog/Build/Products/Staging-iphoneos/SimpleKeychain'
ld: warning: directory not found for option '-L/Users/nathanhyland/Library/Developer/Xcode/DerivedData/bideasy_rn-ddevhacvgkjqoigndhxjmlrtyyog/Build/Products/Staging-iphoneos/TouchIDAuth'
ld: warning: directory not found for option '-F/Users/nathanhyland/Library/Developer/Xcode/DerivedData/bideasy_rn-ddevhacvgkjqoigndhxjmlrtyyog/Build/Products/Staging'
ld: library not found for -lAFNetworking
clang: error: linker command failed with exit code 1 (use -v to see invocation)

@shohey1226
Copy link

After @j2kun 's step, I had to add "$PODS_CONFIGURATION_BUILD_DIR" as recursive to Framework Search path to pass the build with cocoapods.

image

@pallyoung
Copy link

@tisho thanks

@luyuan11233
Copy link

@tisho I followed your solution,but it didn't work.this is my screenshot:
I also add React in Build Phases --> Target Dependencies,but it didn't work too......
24ecffbb-f589-40ac-a1a6-a82032e33125
b99b7516-1ec8-4926-b0f6-695b7daf0eaa

@easybird
Copy link

easybird commented Jul 6, 2017

@tisho Thx! Did the trick for me.
Extra thing that was needed in my case due to link errors:
add "$(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)" to Library Search Paths (only for the custom configuration)

@Eluss
Copy link

Eluss commented Jul 7, 2017

@easybird I had the same issue and setting library search paths indeed solves the problem, thanks!

@manbearshark
Copy link

manbearshark commented Jul 10, 2017

In case anyone else runs into this issue and wants to test out the schemes-manager solution, I created an example project that incorporates @D1no 's guide as a github project you can pull and play around with. I spent some time hard-coding paths to header files and realized that this would not scale well once more developers ended up working on our projects, so decided to go the schemes-manager route, and everything works great so far.

@andpor
Copy link

andpor commented Jul 12, 2017

What a mess!!!! I just spent several days trying to figure out what is going on with my XCode project. We rely on custom configs heavily - this completely broke our project. When is this going to be fixed proper????

@CharltonC
Copy link

Just want to add that this error occurs with a clean project boilerplate based on react-native init. The error mentioned and error icon are there from the start. However the error mentioned didn't cause the build to fail, the simulator was still able to load up.

Steps to reproduce:

  1. In Terminal, create the project: react-native init <project-name>
  2. Open the project in Xcode and open "AppDelegate.m" file, you should see the red error icon next to the code: #import <React/RCTBundleURLProvider.h>

Package/Software Versions installed as follows:

  • "react": "16.0.0-alpha.12",
  • "react-native": "0.46.4"
  • NPM: 3.10.10
  • XCode: 8.2.1

@jomaint
Copy link

jomaint commented Aug 25, 2017

Tried @tisho solution but i got a new error. Not really sure what am i suppose to do next.

library not found for -lRealmReact

@rzrobert
Copy link

@tisho Your answer is very exciting, according to your guidance, I built a number of new target, and can build success. But the new target fails in archive:
image

@varungupta85
Copy link
Contributor

varungupta85 commented Sep 21, 2017

I was able to create a staging environment following @philipshurpik and @j2kun suggestions. However, if I create a new scheme to create a staging archive, the build fails with the same error React/RCTBridgeModule.h file not found. If I edit the default scheme to use the staging configuration, then the archive is created successfully. Is there any other trick to get new schemes to work as well using the new staging configuration. I want to avoid having to keep editing the scheme every time I create a staging or a release archive. I fear I may forget to change and create unwanted problems.

@varungupta85
Copy link
Contributor

I created a staging configuration and I was able to create an IPA file using the staging configuration. But when I upload the IPA to iTunesConnect, I see that the IPA is missing the frameworks that I am using in the app. The frameworks are present when the IPA is created using the release configuration. Below are the screenshots for the staging and the release configuration. Observe that the frameworks are not listed.

Staging
screen shot 2017-09-22 at 9 06 25 am

Release
screen shot 2017-09-22 at 9 06 53 am

Observe that the frameworks are not listed in the staging IPA when I try to upload it iTunesConnect. Due to this, I got an error from iTunesConnect

Invalid Bundle - One or more dynamic libraries that are referenced by your app are not present in the dylib search path.

Below is a screenshot of the framework search paths in the Xcode project. The value is same for both staging and release.

screen shot 2017-09-22 at 12 36 38 pm

Please let me know how can I fix this problem.

@D1no
Copy link

D1no commented Sep 22, 2017

@varungupta85 check out schema manager mentioned above. Its purpose is to add the libraries from node_modules to the new release targets.

@varungupta85
Copy link
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.

@D1no
Copy link

D1no commented Sep 22, 2017

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.

@varungupta85
Copy link
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.

@stale
Copy link

stale bot commented Nov 22, 2017

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.

@stale stale bot added the Stale There has been a lack of activity on this issue and it may be closed soon. label Nov 22, 2017
@stale stale bot closed this as completed Nov 29, 2017
@hushicai
Copy link

worked.

@salujaharkirat
Copy link

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

@salujaharkirat
Copy link

@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.

@hussamkurd
Copy link

I just download CORS extension for chrome and it works for me

https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi/related

@wkoutre
Copy link

wkoutre commented Mar 8, 2018

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.

@aligfl
Copy link

aligfl commented May 11, 2018

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).

@DavidNorena
Copy link

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

@D1no
Copy link

D1no commented May 13, 2018

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. 🙃

@facebook facebook locked and limited conversation to collaborators May 15, 2018
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
Stale There has been a lack of activity on this issue and it may be closed soon.
Projects
None yet
Development

No branches or pull requests