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

Closed
tido64 wants to merge 1 commit into
react-native-community:masterfrom
tido64:tido/support-podfile-xcworkspace
Closed

fix(platform-ios): detect Podfile and .xcworkspace#1436
tido64 wants to merge 1 commit into
react-native-community:masterfrom
tido64:tido/support-podfile-xcworkspace

Conversation

@tido64

@tido64tido64 commented Jun 28, 2021

Copy link
Copy Markdown
Contributor

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 git@github.com: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
tido64force-pushed the tido/support-podfile-xcworkspace branch from 632e75c to 9d7c292CompareJune 28, 2021 13:38

@thymikeethymikee left a comment

Copy link
Copy Markdown
Member

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

Copy link
Copy Markdown
ContributorAuthor

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

@grabbougrabbou left a comment

Copy link
Copy Markdown
Member

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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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

if (!project) {
if (!project && !podfile) {
return null;
}

Copy link
Copy Markdown
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
Copy Markdown
Member

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

@tido64

Copy link
Copy Markdown
ContributorAuthor

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
Copy Markdown
ContributorAuthor

@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
Copy Markdown
Member

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
@grabbougrabbou 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 freeto 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

@tido64@grabbou@thymikee
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

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

Closed
tido64 wants to merge 1 commit into
react-native-community:masterfrom
tido64:tido/support-podfile-xcworkspace
Closed

fix(platform-ios): detect Podfile and .xcworkspace#1436
tido64 wants to merge 1 commit into
react-native-community:masterfrom
tido64:tido/support-podfile-xcworkspace

Conversation

@tido64

@tido64tido64 commented Jun 28, 2021

Copy link
Copy Markdown
Contributor

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 git@github.com: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
tido64force-pushed the tido/support-podfile-xcworkspace branch from 632e75c to 9d7c292CompareJune 28, 2021 13:38

@thymikeethymikee left a comment

Copy link
Copy Markdown
Member

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

Copy link
Copy Markdown
ContributorAuthor

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

@grabbougrabbou left a comment

Copy link
Copy Markdown
Member

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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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

if (!project) {
if (!project && !podfile) {
return null;
}

Copy link
Copy Markdown
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
Copy Markdown
Member

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

@tido64

Copy link
Copy Markdown
ContributorAuthor

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
Copy Markdown
ContributorAuthor

@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
Copy Markdown
Member

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
@grabbougrabbou 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 freeto 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

@tido64@grabbou@thymikee
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

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

Closed
tido64 wants to merge 1 commit into
react-native-community:masterfrom
tido64:tido/support-podfile-xcworkspace
Closed

fix(platform-ios): detect Podfile and .xcworkspace#1436
tido64 wants to merge 1 commit into
react-native-community:masterfrom
tido64:tido/support-podfile-xcworkspace

Conversation

@tido64

@tido64tido64 commented Jun 28, 2021

Copy link
Copy Markdown
Contributor

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 git@github.com: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
tido64force-pushed the tido/support-podfile-xcworkspace branch from 632e75c to 9d7c292CompareJune 28, 2021 13:38

@thymikeethymikee left a comment

Copy link
Copy Markdown
Member

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

Copy link
Copy Markdown
ContributorAuthor

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

@grabbougrabbou left a comment

Copy link
Copy Markdown
Member

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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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

if (!project) {
if (!project && !podfile) {
return null;
}

Copy link
Copy Markdown
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
Copy Markdown
Member

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

@tido64

Copy link
Copy Markdown
ContributorAuthor

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
Copy Markdown
ContributorAuthor

@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
Copy Markdown
Member

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
@grabbougrabbou 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 freeto 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

@tido64@grabbou@thymikee
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

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

Closed
tido64 wants to merge 1 commit into
react-native-community:masterfrom
tido64:tido/support-podfile-xcworkspace
Closed

fix(platform-ios): detect Podfile and .xcworkspace#1436
tido64 wants to merge 1 commit into
react-native-community:masterfrom
tido64:tido/support-podfile-xcworkspace

Conversation

@tido64

@tido64tido64 commented Jun 28, 2021

Copy link
Copy Markdown
Contributor

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 git@github.com: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
tido64force-pushed the tido/support-podfile-xcworkspace branch from 632e75c to 9d7c292CompareJune 28, 2021 13:38

@thymikeethymikee left a comment

Copy link
Copy Markdown
Member

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

Copy link
Copy Markdown
ContributorAuthor

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

@grabbougrabbou left a comment

Copy link
Copy Markdown
Member

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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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

if (!project) {
if (!project && !podfile) {
return null;
}

Copy link
Copy Markdown
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
Copy Markdown
Member

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

@tido64

Copy link
Copy Markdown
ContributorAuthor

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
Copy Markdown
ContributorAuthor

@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
Copy Markdown
Member

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
@grabbougrabbou 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 freeto 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

@tido64@grabbou@thymikee
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

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

Closed
tido64 wants to merge 1 commit into
react-native-community:masterfrom
tido64:tido/support-podfile-xcworkspace
Closed

fix(platform-ios): detect Podfile and .xcworkspace#1436
tido64 wants to merge 1 commit into
react-native-community:masterfrom
tido64:tido/support-podfile-xcworkspace

Conversation

@tido64

@tido64tido64 commented Jun 28, 2021

Copy link
Copy Markdown
Contributor

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 git@github.com: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
tido64force-pushed the tido/support-podfile-xcworkspace branch from 632e75c to 9d7c292CompareJune 28, 2021 13:38

@thymikeethymikee left a comment

Copy link
Copy Markdown
Member

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

Copy link
Copy Markdown
ContributorAuthor

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

@grabbougrabbou left a comment

Copy link
Copy Markdown
Member

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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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

if (!project) {
if (!project && !podfile) {
return null;
}

Copy link
Copy Markdown
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
Copy Markdown
Member

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

@tido64

Copy link
Copy Markdown
ContributorAuthor

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
Copy Markdown
ContributorAuthor

@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
Copy Markdown
Member

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
@grabbougrabbou 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 freeto 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

@tido64@grabbou@thymikee
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

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

Closed
tido64 wants to merge 1 commit into
react-native-community:masterfrom
tido64:tido/support-podfile-xcworkspace
Closed

fix(platform-ios): detect Podfile and .xcworkspace#1436
tido64 wants to merge 1 commit into
react-native-community:masterfrom
tido64:tido/support-podfile-xcworkspace

Conversation

@tido64

@tido64tido64 commented Jun 28, 2021

Copy link
Copy Markdown
Contributor

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 git@github.com: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
tido64force-pushed the tido/support-podfile-xcworkspace branch from 632e75c to 9d7c292CompareJune 28, 2021 13:38

@thymikeethymikee left a comment

Copy link
Copy Markdown
Member

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

Copy link
Copy Markdown
ContributorAuthor

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

@grabbougrabbou left a comment

Copy link
Copy Markdown
Member

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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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

if (!project) {
if (!project && !podfile) {
return null;
}

Copy link
Copy Markdown
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
Copy Markdown
Member

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

@tido64

Copy link
Copy Markdown
ContributorAuthor

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
Copy Markdown
ContributorAuthor

@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
Copy Markdown
Member

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
@grabbougrabbou 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 freeto 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

@tido64@grabbou@thymikee
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

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

Closed
tido64 wants to merge 1 commit into
react-native-community:masterfrom
tido64:tido/support-podfile-xcworkspace
Closed

fix(platform-ios): detect Podfile and .xcworkspace#1436
tido64 wants to merge 1 commit into
react-native-community:masterfrom
tido64:tido/support-podfile-xcworkspace

Conversation

@tido64

@tido64tido64 commented Jun 28, 2021

Copy link
Copy Markdown
Contributor

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 git@github.com: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
tido64force-pushed the tido/support-podfile-xcworkspace branch from 632e75c to 9d7c292CompareJune 28, 2021 13:38

@thymikeethymikee left a comment

Copy link
Copy Markdown
Member

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

Copy link
Copy Markdown
ContributorAuthor

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

@grabbougrabbou left a comment

Copy link
Copy Markdown
Member

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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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

if (!project) {
if (!project && !podfile) {
return null;
}

Copy link
Copy Markdown
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
Copy Markdown
Member

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

@tido64

Copy link
Copy Markdown
ContributorAuthor

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
Copy Markdown
ContributorAuthor

@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
Copy Markdown
Member

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
@grabbougrabbou 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 freeto 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

@tido64@grabbou@thymikee
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

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

Closed
tido64 wants to merge 1 commit into
react-native-community:masterfrom
tido64:tido/support-podfile-xcworkspace
Closed

fix(platform-ios): detect Podfile and .xcworkspace#1436
tido64 wants to merge 1 commit into
react-native-community:masterfrom
tido64:tido/support-podfile-xcworkspace

Conversation

@tido64

@tido64tido64 commented Jun 28, 2021

Copy link
Copy Markdown
Contributor

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 git@github.com: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
tido64force-pushed the tido/support-podfile-xcworkspace branch from 632e75c to 9d7c292CompareJune 28, 2021 13:38

@thymikeethymikee left a comment

Copy link
Copy Markdown
Member

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

Copy link
Copy Markdown
ContributorAuthor

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

@grabbougrabbou left a comment

Copy link
Copy Markdown
Member

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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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

if (!project) {
if (!project && !podfile) {
return null;
}

Copy link
Copy Markdown
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
Copy Markdown
Member

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

@tido64

Copy link
Copy Markdown
ContributorAuthor

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
Copy Markdown
ContributorAuthor

@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
Copy Markdown
Member

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
@grabbougrabbou 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 freeto 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

@tido64@grabbou@thymikee