From 8445f19c98e5e99664c24aea4f5bdc3b7f33f243 Mon Sep 17 00:00:00 2001 From: maciej simka Date: Wed, 10 Jul 2019 10:37:12 +0200 Subject: [PATCH 1/6] fix: run `pod repo update` after installing CocoaPods (#487) Added `pod repo update` command call after CocoaPods installation to avoid issues with pod command being unable to find specification for dependency. Added loader to CocoaPods installation step for consistency with other steps of init and better DX, removed logger info after 30s timeout because of redundancy with loader. Changed loader method before prompt for CocoaPods installation from `stop` to `info` for better prompt visibility. --- packages/cli/src/tools/installPods.js | 46 +++++++++++++++++++++------ 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/packages/cli/src/tools/installPods.js b/packages/cli/src/tools/installPods.js index 44947238a..37ad26d1d 100644 --- a/packages/cli/src/tools/installPods.js +++ b/packages/cli/src/tools/installPods.js @@ -7,8 +7,6 @@ import inquirer from 'inquirer'; import commandExists from 'command-exists'; import {logger} from '@react-native-community/cli-tools'; -const COCOAPODS_INSTALLATION_TIMEOUT = 30000; - async function installPods({ projectName, loader, @@ -33,7 +31,7 @@ async function installPods({ await commandExists('pod'); } catch (e) { if (loader) { - loader.stop(); + loader.info(); } const {shouldInstallCocoaPods} = await inquirer.prompt([ @@ -49,12 +47,10 @@ async function installPods({ ]); if (shouldInstallCocoaPods) { - // Show a helpful notice when installation takes more than usually - const cocoaPodsInstallationTimeMessage = setTimeout( - () => - logger.info('Installing CocoaPods, this may take a few minutes'), - COCOAPODS_INSTALLATION_TIMEOUT, - ); + if (loader) { + loader.start('Installing CocoaPods'); + } + try { // First attempt to install `cocoapods` await execa('gem', ['install', 'cocoapods']); @@ -63,6 +59,9 @@ async function installPods({ // If that doesn't work then try with sudo await execa('sudo', ['gem', 'install', 'cocoapods']); } catch (error) { + if (loader) { + loader.fail(); + } logger.log(error.stderr); throw new Error( @@ -72,7 +71,34 @@ async function installPods({ ); } } finally { - clearTimeout(cocoaPodsInstallationTimeMessage); + if (loader) { + loader.succeed(); + } + } + + try { + if (loader) { + loader.start('Updating CocoaPods repositories'); + } + + await execa('pod', ['repo', 'update']); + } catch (error) { + // "pod" command outputs errors to stdout (at least some of them) + logger.log(error.stderr || error.stdout); + + if (loader) { + loader.fail(); + } + + throw new Error( + `Failed to update CocoaPods repositories for iOS project.\nPlease try again manually: "pod repo update".\nCocoaPods documentation: ${chalk.dim.underline( + 'https://cocoapods.org/', + )}`, + ); + } finally { + if (loader) { + loader.succeed(); + } } // This only shows when `CocoaPods` is automatically installed, From 0d7f63d5766de4ae8978fc652aee8fc6666bad10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Pierzcha=C5=82a?= Date: Wed, 10 Jul 2019 13:18:33 +0200 Subject: [PATCH 2/6] always show installing pods step --- packages/cli/src/commands/init/init.js | 2 +- packages/cli/src/tools/installPods.js | 14 ++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/cli/src/commands/init/init.js b/packages/cli/src/commands/init/init.js index b55557fe8..35099c883 100644 --- a/packages/cli/src/commands/init/init.js +++ b/packages/cli/src/commands/init/init.js @@ -154,7 +154,7 @@ async function installDependencies({ npm?: boolean, loader: typeof Ora, }) { - loader.start('Installing all required dependencies'); + loader.start('Installing dependencies'); await PackageManager.installAll({ preferYarn: !npm, diff --git a/packages/cli/src/tools/installPods.js b/packages/cli/src/tools/installPods.js index 37ad26d1d..b52a53998 100644 --- a/packages/cli/src/tools/installPods.js +++ b/packages/cli/src/tools/installPods.js @@ -100,16 +100,18 @@ async function installPods({ loader.succeed(); } } - - // This only shows when `CocoaPods` is automatically installed, - // if it's already installed then we just show the `Installing dependencies` step - if (loader) { - loader.start('Installing CocoaPods dependencies'); - } } } try { + if (loader) { + loader.succeed(); + loader.start( + `Installing CocoaPods dependencies ${chalk.dim( + '(this make take a few minutes)', + )}`, + ); + } await execa('pod', ['install']); } catch (error) { // "pod" command outputs errors to stdout (at least some of them) From 335fc82b0088b3a7676424d7f65627134c2993c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Pierzcha=C5=82a?= Date: Wed, 10 Jul 2019 13:20:27 +0200 Subject: [PATCH 3/6] add notice back --- packages/cli/src/tools/installPods.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/cli/src/tools/installPods.js b/packages/cli/src/tools/installPods.js index b52a53998..51707d975 100644 --- a/packages/cli/src/tools/installPods.js +++ b/packages/cli/src/tools/installPods.js @@ -48,7 +48,11 @@ async function installPods({ if (shouldInstallCocoaPods) { if (loader) { - loader.start('Installing CocoaPods'); + loader.start( + `Installing CocoaPods ${chalk.dim( + '(this make take a few minutes)', + )}`, + ); } try { From 0b086d5a80369e3473eb624f5c835f23e28df6bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Pierzcha=C5=82a?= Date: Wed, 10 Jul 2019 13:44:01 +0200 Subject: [PATCH 4/6] minor loader refactor --- packages/cli/src/tools/installPods.js | 54 +++++++++------------------ packages/cli/src/tools/loader.js | 11 +++--- 2 files changed, 23 insertions(+), 42 deletions(-) diff --git a/packages/cli/src/tools/installPods.js b/packages/cli/src/tools/installPods.js index 51707d975..e0b2bd025 100644 --- a/packages/cli/src/tools/installPods.js +++ b/packages/cli/src/tools/installPods.js @@ -6,6 +6,7 @@ import Ora from 'ora'; import inquirer from 'inquirer'; import commandExists from 'command-exists'; import {logger} from '@react-native-community/cli-tools'; +import {NoopLoader} from './loader'; async function installPods({ projectName, @@ -14,6 +15,7 @@ async function installPods({ projectName: string, loader?: typeof Ora, }) { + loader = loader || new NoopLoader(); try { if (!fs.existsSync('ios')) { return; @@ -30,9 +32,7 @@ async function installPods({ try { await commandExists('pod'); } catch (e) { - if (loader) { - loader.info(); - } + loader.info(); const {shouldInstallCocoaPods} = await inquirer.prompt([ { @@ -47,25 +47,20 @@ async function installPods({ ]); if (shouldInstallCocoaPods) { - if (loader) { - loader.start( - `Installing CocoaPods ${chalk.dim( - '(this make take a few minutes)', - )}`, - ); - } + loader.start( + `Installing CocoaPods ${chalk.dim('(this make take a few minutes)')}`, + ); try { // First attempt to install `cocoapods` await execa('gem', ['install', 'cocoapods']); + loader.succeed(); } catch (_error) { try { // If that doesn't work then try with sudo await execa('sudo', ['gem', 'install', 'cocoapods']); } catch (error) { - if (loader) { - loader.fail(); - } + loader.fail(); logger.log(error.stderr); throw new Error( @@ -74,48 +69,33 @@ async function installPods({ )}`, ); } - } finally { - if (loader) { - loader.succeed(); - } } try { - if (loader) { - loader.start('Updating CocoaPods repositories'); - } - + loader.start('Updating CocoaPods repositories'); await execa('pod', ['repo', 'update']); + loader.succeed(); } catch (error) { // "pod" command outputs errors to stdout (at least some of them) logger.log(error.stderr || error.stdout); - - if (loader) { - loader.fail(); - } + loader.fail(); throw new Error( `Failed to update CocoaPods repositories for iOS project.\nPlease try again manually: "pod repo update".\nCocoaPods documentation: ${chalk.dim.underline( 'https://cocoapods.org/', )}`, ); - } finally { - if (loader) { - loader.succeed(); - } } } } try { - if (loader) { - loader.succeed(); - loader.start( - `Installing CocoaPods dependencies ${chalk.dim( - '(this make take a few minutes)', - )}`, - ); - } + loader.succeed(); + loader.start( + `Installing CocoaPods dependencies ${chalk.dim( + '(this make take a few minutes)', + )}`, + ); await execa('pod', ['install']); } catch (error) { // "pod" command outputs errors to stdout (at least some of them) diff --git a/packages/cli/src/tools/loader.js b/packages/cli/src/tools/loader.js index 525cc5c9d..b0c480975 100644 --- a/packages/cli/src/tools/loader.js +++ b/packages/cli/src/tools/loader.js @@ -2,14 +2,15 @@ import Ora from 'ora'; import logger from './logger'; -class OraMock { +class OraNoop { succeed() {} fail() {} - start() {} + start(message?: string) {} + info(message?: string) {} } -function getLoader(): typeof Ora { - return logger.isVerbose() ? OraMock : Ora; +export function getLoader(): typeof Ora { + return logger.isVerbose() ? OraNoop : Ora; } -export {getLoader}; +export const NoopLoader = OraNoop; From d778bddeae36945940baf24b73430491bfc4fb86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Pierzcha=C5=82a?= Date: Wed, 10 Jul 2019 14:00:37 +0200 Subject: [PATCH 5/6] fix false positive for pod command being available --- packages/cli/package.json | 1 - packages/cli/src/tools/installPods.js | 26 +++++++++++++++++--------- yarn.lock | 5 ----- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index d33618da4..563ec7596 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -28,7 +28,6 @@ "@react-native-community/cli-platform-ios": "^2.2.0", "@react-native-community/cli-tools": "^2.0.2", "chalk": "^1.1.1", - "command-exists": "^1.2.8", "commander": "^2.19.0", "compression": "^1.7.1", "connect": "^3.6.5", diff --git a/packages/cli/src/tools/installPods.js b/packages/cli/src/tools/installPods.js index e0b2bd025..5501b6500 100644 --- a/packages/cli/src/tools/installPods.js +++ b/packages/cli/src/tools/installPods.js @@ -4,7 +4,6 @@ import execa from 'execa'; import chalk from 'chalk'; import Ora from 'ora'; import inquirer from 'inquirer'; -import commandExists from 'command-exists'; import {logger} from '@react-native-community/cli-tools'; import {NoopLoader} from './loader'; @@ -30,7 +29,10 @@ async function installPods({ } try { - await commandExists('pod'); + // Check if "pod" is available and usable. It happens that there are + // multiple versions of "pod" command and even though it's there, it exits + // with a failure + await execa('pod'); } catch (e) { loader.info(); @@ -47,18 +49,21 @@ async function installPods({ ]); if (shouldInstallCocoaPods) { - loader.start( - `Installing CocoaPods ${chalk.dim('(this make take a few minutes)')}`, - ); + loader.start('Installing CocoaPods'); try { // First attempt to install `cocoapods` - await execa('gem', ['install', 'cocoapods']); + await execa('gem', ['install', 'cocoapods', '--no-document']); loader.succeed(); } catch (_error) { try { // If that doesn't work then try with sudo - await execa('sudo', ['gem', 'install', 'cocoapods']); + await execa('sudo', [ + 'gem', + 'install', + 'cocoapods', + '--no-document', + ]); } catch (error) { loader.fail(); logger.log(error.stderr); @@ -72,7 +77,11 @@ async function installPods({ } try { - loader.start('Updating CocoaPods repositories'); + loader.start( + `Updating CocoaPods repositories ${chalk.dim( + '(this make take a few minutes)', + )}`, + ); await execa('pod', ['repo', 'update']); loader.succeed(); } catch (error) { @@ -90,7 +99,6 @@ async function installPods({ } try { - loader.succeed(); loader.start( `Installing CocoaPods dependencies ${chalk.dim( '(this make take a few minutes)', diff --git a/yarn.lock b/yarn.lock index b6ccd26b8..a7f24014f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2948,11 +2948,6 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -command-exists@^1.2.8: - version "1.2.8" - resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.8.tgz#715acefdd1223b9c9b37110a149c6392c2852291" - integrity sha512-PM54PkseWbiiD/mMsbvW351/u+dafwTJ0ye2qB60G1aGQP9j3xK2gmMDc+R34L3nDtx4qMCitXT75mkbkGJDLw== - commander@^2.19.0, commander@~2.19.0: version "2.19.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" From 490d4d1a94e4f7a6e1d4dd9957cb7ebaca8de48f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Pierzcha=C5=82a?= Date: Wed, 10 Jul 2019 14:02:39 +0200 Subject: [PATCH 6/6] use pod --version for smaller output --- packages/cli/src/tools/installPods.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/cli/src/tools/installPods.js b/packages/cli/src/tools/installPods.js index 5501b6500..04d6e9e5a 100644 --- a/packages/cli/src/tools/installPods.js +++ b/packages/cli/src/tools/installPods.js @@ -32,7 +32,7 @@ async function installPods({ // Check if "pod" is available and usable. It happens that there are // multiple versions of "pod" command and even though it's there, it exits // with a failure - await execa('pod'); + await execa('pod', ['--version']); } catch (e) { loader.info(); @@ -83,7 +83,6 @@ async function installPods({ )}`, ); await execa('pod', ['repo', 'update']); - loader.succeed(); } catch (error) { // "pod" command outputs errors to stdout (at least some of them) logger.log(error.stderr || error.stdout); @@ -99,6 +98,7 @@ async function installPods({ } try { + loader.succeed(); loader.start( `Installing CocoaPods dependencies ${chalk.dim( '(this make take a few minutes)',