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

fix(platform-ios): detect Podfile and .xcworkspace #1436

Conversation

tido64
Copy link
Contributor

@tido64 tido64 commented Jun 28, 2021

Summary:

react-native config fails to recognize projects that contain only a Podfile or .xcworkspace, e.g. because the Xcode project is generated. This change makes it output a config if either are found.

Resolves #1435
Resolves the iOS part of #1054

Test Plan:

git clone [email protected]:react-native-menu/menu.git
cd menu
mv example/ example2/ # This is to just move the existing test app out of the way temporarily
yarn add react-native-test-app --dev
yarn init-test-app
# The options I chose
# ✔ What is the name of your test app? … MenuExample
# ✔ Which platforms do you need test apps for? › Android, iOS
# ✔ Where should we create the new project? … example

cd example
yarn
yarn link "@react-native-community/cli"
yarn link "@react-native-community/cli-platform-ios"
pod install --project-directory=ios
yarn ios

@tido64 tido64 force-pushed the tido/support-podfile-xcworkspace branch from 632e75c to 9d7c292 Compare June 28, 2021 13:38
Copy link
Member

@thymikee thymikee left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. What do you think @grabbou?

@tido64 tido64 marked this pull request as ready for review June 28, 2021 17:12
@tido64 tido64 requested review from Esemesek and grabbou as code owners June 28, 2021 17:12
@tido64
Copy link
Contributor Author

tido64 commented Jul 5, 2021

@grabbou, @Esemesek: Gentle ping. Let me know if you have any comments and I'll try to address them. 😄

Copy link
Member

@grabbou grabbou left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the PR. I left a series of comments.

Before going to addressing them, I wanted to better understand the nature of this PR.

In what scenario, an xcworkspace will be present, but xcodeproj not?

Why should we allow CLI to detect projects that don't have .xcworkspace and .xcodeproj, but have a Podfile only? CLI is designed to support projects, not dependencies.

* Finds iOS project by looking for all .xcodeproj files
* in given folder.
*
* Returns first match if files are found or null
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the description needs to be updated. How does it work now? Returns first element for which isXcodeProject returns true, or first element in an array? When exactly first element in an array is a valid return value?

* Note: `./ios/Podfile` are returned regardless of the name
*/
export function findPodfile(folder: string): string | null {
const projects = findProject(folder, '**/Podfile');
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rename projects to podfiles or pods?

export default function findProject(folder: string): string | null {
const projects = glob
.sync(GLOB_PATTERN, {
function findProject(folder: string, pattern: string): string[] {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess this function can now be renamed to glob or findInFolder, since it no longer finds a project, but acts as a utility function.

@@ -48,10 +41,37 @@ export default function findProject(folder: string): string | null {
path.dirname(project) === IOS_BASE || !TEST_PROJECTS.test(project),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This one is not related to your PR per se, but I stared wondering whether path.dirname(project) === IOS_BASE should be there or not.

Now, I don't remember why I ended up leaving this one here, instead of using glob pattern ios/**/*.{xcodeproj,xcworkspace}.

I actually wonder why do we enforce iOS folder in first place here. That was probably to ignore node_modules and additional projects that might be there.

projectPath && isXcodeProject(projectPath)
? path.join(projectPath, 'project.pbxproj')
: null,
podfile: podfile && path.resolve(podfile),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we need podfile && here, if we enforce it on line 49?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hm right, with !project && !podfile guard we don't need to check either of those

const project = userConfig.project || memoizedFindProject(folder);

/**
* No iOS config found here
*/
if (!project) {
if (!project && !podfile) {
return null;
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't this be !project || !podfile instead? I guess a project is not valid when .xcodeproj is missing.

On a side note, I guess with this change, having a Podfile will be mandatory.

@grabbou
Copy link
Member

grabbou commented Jul 6, 2021

@tido64 how about we hop on a call at some point this or next week to discuss this?

@tido64
Copy link
Contributor Author

tido64 commented Jul 6, 2021

In what scenario, an xcworkspace will be present, but xcodeproj not?

Why should we allow CLI to detect projects that don't have .xcworkspace and .xcodeproj, but have a Podfile only? CLI is designed to support projects, not dependencies.

I filed a feature request on this last year or so here: #1054.

Technically, only Podfile and .xcworkspace need to reside in the same folder. .xcworkspace can point to a .xcodeproj anywhere in the file system and does not have the same restriction. Moreover, if you're using a project generator, you may not find a .xcworkspace there at all.

A more specific example are projects using react-native-test-app to generate both .xcworkspace and .xcodeproj during pod install (there was an RFC some time back if you're interested in details). Such projects may only have a Podfile in the ios folder (example, example 2). The generated .xcodeproj is hidden since it's managed by react-native-test-app and is not meant to be checked in. This is to hide away a piece of complexity that users need not care about. This is especially beneficial when they need to upgrade (or downgrade) react-native.

@tido64
Copy link
Contributor Author

tido64 commented Jul 6, 2021

@tido64 how about we hop on a call at some point this or next week to discuss this?

Yes, we can do that as well. I know you're super busy so let me know when you have time?

@grabbou
Copy link
Member

grabbou commented Jul 6, 2021

I will reach out to you directly over Discord and we will send a note when we're done

tido64 added a commit to tido64/react-native-cli that referenced this pull request Jul 12, 2021
@grabbou grabbou closed this Aug 4, 2021
grabbou pushed a commit that referenced this pull request Aug 5, 2021
* fix(platform-ios): fix `sourceDir` detection

See also #1054 and #1436.

Resolves #1435.

* yarn lint --fix
thymikee pushed a commit that referenced this pull request Aug 5, 2021
* fix(platform-ios): fix `sourceDir` detection

See also #1054 and #1436.

Resolves #1435.

* yarn lint --fix
@tido64 tido64 deleted the tido/support-podfile-xcworkspace branch August 24, 2021 08:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

run-ios bug: Try/catch removed from warnAboutManuallyLinkedLibs.ts causing exceptions to propagate/crash
3 participants