adds log-ios and log-android cli commands

Summary:
solves first part of #8186
Closes https://github.com/facebook/react-native/pull/8352

Differential Revision: D3475905

Pulled By: mkonicek

fbshipit-source-id: 99f6aa15b92ba3192fa0b812d369bd7020469573
This commit is contained in:
Vitaly Gorodetsky 2016-06-23 07:50:28 -07:00 committed by Facebook Github Bot 2
parent fe55dd1a9a
commit 39f524d8e5
4 changed files with 136 additions and 2 deletions

View File

@ -54,9 +54,11 @@ YellowBoxes can be disabled during development by using `console.disableYellowBo
## Accessing logs ## Accessing logs
To view detailed logs on iOS, open your app in Xcode, then Build and Run your app on a device or the iPhone Simulator. The console should appear automatically after the app launches. If your app is failing to build, check the Issues Navigator in Xcode. Run `react-native log-ios` in a terminal to display the logs for an iOS app running on a device or a simulator.
Run `adb logcat *:S ReactNative:V ReactNativeJS:V` in a terminal to display the logs for an Android app running on a device or an emulator. You can also view the iOS logs in Xcode: open your app in Xcode, then Build and Run your app on a device or the iPhone Simulator. The console should appear automatically after the app launches. If your app is failing to build, check the Issues Navigator in Xcode.
Run `react-native log-android` in a terminal to display the logs for an Android app running on a device or an emulator.
## Chrome Developer Tools ## Chrome Developer Tools

View File

@ -19,7 +19,9 @@ const link = require('./rnpm/link/src/link');
const path = require('path'); const path = require('path');
const Promise = require('promise'); const Promise = require('promise');
const runAndroid = require('./runAndroid/runAndroid'); const runAndroid = require('./runAndroid/runAndroid');
const logAndroid = require('./logAndroid/logAndroid');
const runIOS = require('./runIOS/runIOS'); const runIOS = require('./runIOS/runIOS');
const logIOS = require('./logIOS/logIOS');
const server = require('./server/server'); const server = require('./server/server');
const TerminalAdapter = require('yeoman-environment/lib/adapter.js'); const TerminalAdapter = require('yeoman-environment/lib/adapter.js');
const yeoman = require('yeoman-environment'); const yeoman = require('yeoman-environment');
@ -49,7 +51,9 @@ const documentedCommands = {
'new-library': [library, 'generates a native library bridge'], 'new-library': [library, 'generates a native library bridge'],
'android': [generateWrapper, 'generates an Android project for your app'], 'android': [generateWrapper, 'generates an Android project for your app'],
'run-android': [runAndroid, 'builds your app and starts it on a connected Android emulator or device'], 'run-android': [runAndroid, 'builds your app and starts it on a connected Android emulator or device'],
'log-android': [logAndroid, 'print Android logs'],
'run-ios': [runIOS, 'builds your app and starts it on iOS simulator'], 'run-ios': [runIOS, 'builds your app and starts it on iOS simulator'],
'log-ios': [logIOS, 'print iOS logs'],
'upgrade': [upgrade, 'upgrade your app\'s template files to the latest version; run this after ' + 'upgrade': [upgrade, 'upgrade your app\'s template files to the latest version; run this after ' +
'updating the react-native version in your package.json and running npm install'], 'updating the react-native version in your package.json and running npm install'],
'link': [linkWrapper, 'link a library'], 'link': [linkWrapper, 'link a library'],

View File

@ -0,0 +1,51 @@
/**
* Copyright (c) 2015-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
'use strict';
const chalk = require('chalk');
const child_process = require('child_process');
const Promise = require('promise');
/**
* Starts adb logcat
*/
function logAndroid() {
return new Promise((resolve, reject) => {
_logAndroid(resolve, reject);
});
}
function _logAndroid(resolve, reject) {
try {
const adbPath = process.env.ANDROID_HOME
? process.env.ANDROID_HOME + '/platform-tools/adb'
: 'adb';
const adbArgs = ['logcat', '*:S', 'ReactNative:V', 'ReactNativeJS:V'];
console.log(chalk.bold(
`Starting the logger (${adbPath} ${adbArgs.join(' ')})...`
));
const log = child_process.spawnSync(adbPath, adbArgs, {stdio: 'inherit'});
if (log.error !== null) {
throw log.error;
}
} catch (e) {
console.log(chalk.red(
'adb invocation failed. Do you have adb in your PATH?'
));
reject();
return;
}
}
module.exports = logAndroid;

View File

@ -0,0 +1,77 @@
'use strict';
const chalk = require('chalk');
const child_process = require('child_process');
const os = require('os');
const path = require('path');
const Promise = require('promise');
/**
* Starts iOS device syslog tail
*/
function logIOS() {
return new Promise((resolve, reject) => {
_logIOS(resolve, reject);
});
}
function _logIOS(resolve, reject) {
let rawDevices;
try {
rawDevices = child_process.execFileSync(
'xcrun', ['simctl', 'list', 'devices', '--json'], {encoding: 'utf8'}
);
} catch (e) {
console.log(chalk.red(
'xcrun invocation failed. Please check that Xcode is installed.'
));
reject(e);
return;
}
const { devices } = JSON.parse(rawDevices);
const device = _findAvailableDevice(devices);
if (device === undefined) {
console.log(chalk.red(
'No active iOS device found'
));
reject();
}
tailDeviceLogs(device.udid, reject);
}
function _findAvailableDevice(devices) {
for (const key of Object.keys(devices)) {
for (const device of devices[key]) {
if (device.availability === '(available)' && device.state === 'Booted') {
return device;
}
}
}
}
function tailDeviceLogs(udid, reject) {
const logDir = path.join(
os.homedir(),
'Library',
'Logs',
'CoreSimulator',
udid,
'asl',
);
const log =
child_process.spawnSync('syslog', ['-w', '-F', 'std', '-d', logDir], {stdio: 'inherit'});
if (log.error !== null) {
console.log(chalk.red(
'syslog invocation failed.'
));
reject(log.error);
}
}
module.exports = logIOS;