mirror of
https://github.com/zhigang1992/create-react-app.git
synced 2026-04-03 22:44:38 +08:00
There’s a common tool included in Hadoop that also has a `yarn` command,
which created issues for users who had Hadoop installed:
* #1257
* #1363
Yarn also installs the command under `yarnpkg` alias (added in
cefa9a368d)
so we can use `yarnpkg` instead of `yarn` to make it more reliable.
This has no effect on users who don't have Hadoop installed, but those
who have won't see errors from falsely detecting Hadoop Yarn as Yarn
the package manager, and they can now also install Yarn to make use of
our Yarn support without the Hadoop Yarn interfering.
130 lines
4.3 KiB
JavaScript
130 lines
4.3 KiB
JavaScript
/**
|
||
* 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.
|
||
*/
|
||
|
||
var fs = require('fs-extra');
|
||
var path = require('path');
|
||
var spawn = require('cross-spawn');
|
||
var pathExists = require('path-exists');
|
||
var chalk = require('chalk');
|
||
|
||
module.exports = function(appPath, appName, verbose, originalDirectory) {
|
||
var ownPackageName = require(path.join(__dirname, '..', 'package.json')).name;
|
||
var ownPath = path.join(appPath, 'node_modules', ownPackageName);
|
||
var appPackage = require(path.join(appPath, 'package.json'));
|
||
var useYarn = pathExists.sync(path.join(appPath, 'yarn.lock'));
|
||
|
||
// Copy over some of the devDependencies
|
||
appPackage.dependencies = appPackage.dependencies || {};
|
||
appPackage.devDependencies = appPackage.devDependencies || {};
|
||
|
||
// Setup the script rules
|
||
appPackage.scripts = {
|
||
'start': 'react-scripts start',
|
||
'build': 'react-scripts build',
|
||
'test': 'react-scripts test --env=jsdom',
|
||
'eject': 'react-scripts eject'
|
||
};
|
||
|
||
fs.writeFileSync(
|
||
path.join(appPath, 'package.json'),
|
||
JSON.stringify(appPackage, null, 2)
|
||
);
|
||
|
||
var readmeExists = pathExists.sync(path.join(appPath, 'README.md'));
|
||
if (readmeExists) {
|
||
fs.renameSync(path.join(appPath, 'README.md'), path.join(appPath, 'README.old.md'));
|
||
}
|
||
|
||
// Copy the files for the user
|
||
fs.copySync(path.join(ownPath, 'template'), appPath);
|
||
|
||
// Rename gitignore after the fact to prevent npm from renaming it to .npmignore
|
||
// See: https://github.com/npm/npm/issues/1862
|
||
fs.move(path.join(appPath, 'gitignore'), path.join(appPath, '.gitignore'), [], function (err) {
|
||
if (err) {
|
||
// Append if there's already a `.gitignore` file there
|
||
if (err.code === 'EEXIST') {
|
||
var data = fs.readFileSync(path.join(appPath, 'gitignore'));
|
||
fs.appendFileSync(path.join(appPath, '.gitignore'), data);
|
||
fs.unlinkSync(path.join(appPath, 'gitignore'));
|
||
} else {
|
||
throw err;
|
||
}
|
||
}
|
||
});
|
||
|
||
// Run yarn or npm for react and react-dom
|
||
// TODO: having to do two npm/yarn installs is bad, can we avoid it?
|
||
var command;
|
||
var args;
|
||
|
||
if (useYarn) {
|
||
command = 'yarnpkg';
|
||
args = ['add'];
|
||
} else {
|
||
command = 'npm';
|
||
args = [
|
||
'install',
|
||
'--save',
|
||
verbose && '--verbose'
|
||
].filter(function(e) { return e; });
|
||
}
|
||
args.push('react', 'react-dom');
|
||
|
||
console.log('Installing react and react-dom using ' + command + '...');
|
||
console.log();
|
||
|
||
var proc = spawn(command, args, {stdio: 'inherit'});
|
||
proc.on('close', function (code) {
|
||
if (code !== 0) {
|
||
console.error('`' + command + ' ' + args.join(' ') + '` failed');
|
||
return;
|
||
}
|
||
|
||
// Display the most elegant way to cd.
|
||
// This needs to handle an undefined originalDirectory for
|
||
// backward compatibility with old global-cli's.
|
||
var cdpath;
|
||
if (originalDirectory &&
|
||
path.join(originalDirectory, appName) === appPath) {
|
||
cdpath = appName;
|
||
} else {
|
||
cdpath = appPath;
|
||
}
|
||
|
||
console.log();
|
||
console.log('Success! Created ' + appName + ' at ' + appPath);
|
||
console.log('Inside that directory, you can run several commands:');
|
||
console.log();
|
||
console.log(chalk.cyan(' ' + command + ' start'));
|
||
console.log(' Starts the development server.');
|
||
console.log();
|
||
console.log(chalk.cyan(' ' + command + ' run build'));
|
||
console.log(' Bundles the app into static files for production.');
|
||
console.log();
|
||
console.log(chalk.cyan(' ' + command + ' test'));
|
||
console.log(' Starts the test runner.');
|
||
console.log();
|
||
console.log(chalk.cyan(' ' + command + ' run eject'));
|
||
console.log(' Removes this tool and copies build dependencies, configuration files');
|
||
console.log(' and scripts into the app directory. If you do this, you can’t go back!');
|
||
console.log();
|
||
console.log('We suggest that you begin by typing:');
|
||
console.log();
|
||
console.log(chalk.cyan(' cd'), cdpath);
|
||
console.log(' ' + chalk.cyan(command + ' start'));
|
||
if (readmeExists) {
|
||
console.log();
|
||
console.log(chalk.yellow('You had a `README.md` file, we renamed it to `README.old.md`'));
|
||
}
|
||
console.log();
|
||
console.log('Happy hacking!');
|
||
});
|
||
};
|