mirror of
https://github.com/zhigang1992/react-native.git
synced 2026-04-24 04:16:00 +08:00
CLI: Add support for project templates
Summary: Currently it is not trivial for people to get started with React Native. `react-native init MyApp` just creates a simple app with a single screen. People have to spend time figuring out how to add more screens, or how to accomplish very basic tasks such as rendering a list of data or handling text input. Let's add an option: `react-native init --template navigation` - this creates a "starter" app which can be easily tweaked into the actual app the person wants to build. **Test plan (required)** - Checked that 'react-native init MyApp' still works as before: <img width="487" alt="screenshot 2017-02-02 16 56 28" src="https://cloud.githubusercontent.com/assets/346214/22559344/b2348ebe-e968-11e6-9032-d1c33216f490.png"> <img width="603" alt="screenshot 2017-02-02 16 58 04" src="https://cloud.githubusercontent.com/assets/346214/22559370/c96a2ca6-e968-11e6-91f7-7afb967920fc.png"> - Ran 'react-native init MyNavApp --template'. This prints the available templates: ``` $ react-native init MyNavApp Closes https://github.com/facebook/react-native/pull/12170 Differential Revision: D4516241 Pulled By: mkonicek fbshipit-source-id: 8ac081157919872e92947ed64ea64fb48078614d
This commit is contained in:
committed by
Facebook Github Bot
parent
75c14e3674
commit
a54d449e94
@@ -8,7 +8,10 @@
|
||||
*/
|
||||
'use strict';
|
||||
|
||||
const copyProjectTemplateAndReplace = require('../generator/copyProjectTemplateAndReplace');
|
||||
const {
|
||||
listTemplatesAndExit,
|
||||
createProjectFromTemplate,
|
||||
} = require('../generator/templates');
|
||||
const execSync = require('child_process').execSync;
|
||||
const fs = require('fs');
|
||||
const minimist = require('minimist');
|
||||
@@ -23,15 +26,15 @@ const yarn = require('../util/yarn');
|
||||
* @param projectDir Templates will be copied here.
|
||||
* @param argsOrName Project name or full list of custom arguments
|
||||
* for the generator.
|
||||
* @param options Command line options passed from the react-native-cli directly.
|
||||
* E.g. `{ version: '0.43.0', template: 'navigation' }`
|
||||
*/
|
||||
function init(projectDir, argsOrName) {
|
||||
console.log('Setting up new React Native app in ' + projectDir);
|
||||
|
||||
const args = Array.isArray(argsOrName)
|
||||
? argsOrName // argsOrName was e.g. ['AwesomeApp', '--verbose']
|
||||
: [argsOrName].concat(process.argv.slice(4)); // argsOrName was e.g. 'AwesomeApp'
|
||||
|
||||
// args array is e.g. ['AwesomeApp', '--verbose']
|
||||
// args array is e.g. ['AwesomeApp', '--verbose', '--template', 'navigation']
|
||||
if (!args || args.length === 0) {
|
||||
console.error('react-native init requires a project name.');
|
||||
return;
|
||||
@@ -40,7 +43,14 @@ function init(projectDir, argsOrName) {
|
||||
const newProjectName = args[0];
|
||||
const options = minimist(args);
|
||||
|
||||
generateProject(projectDir, newProjectName, options);
|
||||
if (listTemplatesAndExit(newProjectName, options)) {
|
||||
// Just listing templates using 'react-native init --template'
|
||||
// Not creating a new app.
|
||||
return;
|
||||
} else {
|
||||
console.log('Setting up new React Native app in ' + projectDir);
|
||||
generateProject(projectDir, newProjectName, options);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -67,11 +77,7 @@ function generateProject(destinationRoot, newProjectName, options) {
|
||||
yarn.getYarnVersionIfAvailable() &&
|
||||
yarn.isGlobalCliUsingYarn(destinationRoot);
|
||||
|
||||
copyProjectTemplateAndReplace(
|
||||
path.resolve('node_modules', 'react-native', 'local-cli', 'templates', 'HelloWorld'),
|
||||
destinationRoot,
|
||||
newProjectName
|
||||
);
|
||||
createProjectFromTemplate(destinationRoot, newProjectName, options.template, yarnVersion);
|
||||
|
||||
if (yarnVersion) {
|
||||
console.log('Adding React...');
|
||||
|
||||
Reference in New Issue
Block a user