Skip to content

Commit

Permalink
fix(install): leave yarn/npm up to the user
Browse files Browse the repository at this point in the history
closes #878
  • Loading branch information
JeroenVinke committed Jul 23, 2018
1 parent 987cc68 commit cce5070
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 33 deletions.
38 changes: 19 additions & 19 deletions lib/commands/new/project-template.js
Original file line number Diff line number Diff line change
Expand Up @@ -331,17 +331,21 @@ exports.ProjectTemplate = class {
return this.root.create(ui, location);
}

install(ui) {
let workingDirectory = this.options.hasFlag('here')
getWorkingDirectory() {
return this.options.hasFlag('here')
? process.cwd()
: path.posix.join(process.cwd(), this.content.calculateRelativePath());
}

install(ui, packageManager) {
let workingDirectory = this.getWorkingDirectory();

return installDependencies(ui, workingDirectory)
return installDependencies(workingDirectory, packageManager)
.then(() => runPostInstallProcesses(ui, workingDirectory, this.postInstallProcesses));
}
};

function installDependencies(ui, workingDirectory, dependencies) {
function installDependencies(workingDirectory, packageManager) {
let npm = new NPM();
let npmOptions = {
loglevel: 'error',
Expand All @@ -351,24 +355,20 @@ function installDependencies(ui, workingDirectory, dependencies) {
workingDirectory: workingDirectory
};

// try yarn, but if something fails then fall back to NPM
try {
let yarn = new Yarn();
if (yarn.isAvailable(workingDirectory)) {
return yarn.install([], { cwd: workingDirectory })
.catch(e => {
logger.error('Something went wrong while attempting to use Yarn. Falling back to NPM');
logger.info(e);
if (packageManager === 'yarn') {
const yarn = new Yarn();
return yarn.install([], { cwd: workingDirectory })
.catch(e => {
logger.error('Something went wrong while attempting to use Yarn. Falling back to NPM');
logger.info(e);

return npm.install([], npmOptions);
});
}
} catch (e) {
logger.error('Something went wrong while attempting to search for Yarn. Falling back to NPM');
logger.info(e);
return npm.install([], npmOptions);
});
} else if (packageManager === 'npm') {
return npm.install([], npmOptions);
}

return npm.install([], npmOptions);
throw new Error(`Unknown package manager ${packageManager}`);
}

function addDependencies(current, toAdd) {
Expand Down
56 changes: 42 additions & 14 deletions lib/workflow/activities/project-install.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ const os = require('os');
const UI = require('../../ui').UI;
const transform = require('../../colors/transform');
const createLines = require('../../string').createLines;
const Yarn = require('../../package-managers/yarn').Yarn;
const CLIOptions = require('../../cli-options').CLIOptions;

module.exports = class {
Expand All @@ -15,22 +16,49 @@ module.exports = class {

execute(context) {
let project = context.state.project;
let options = [];

let yarn = new Yarn();
if (yarn.isAvailable(project.getWorkingDirectory())) {
this.ui.log('Note: lock files are not cross compatible between package managers. Choose Yarn here only if you intend to use Yarn for future package installs. Alternatively, remove either yarn.lock or package-lock.json from the project directory before installing new packages.');
options = [
{
displayName: 'Yes, use Yarn',
description: 'Installs all server, client and tooling dependencies needed to build the project using Yarn.',
value: 'yarn'
},
{
displayName: 'Yes, use NPM',
description: 'Installs all server, client and tooling dependencies needed to build the project using NPM.',
value: 'npm'
},
{
displayName: 'No',
description: 'Completes the new project wizard without installing dependencies.',
value: 'no'
}
];
} else {
options = [
{
displayName: 'Yes',
description: 'Installs all server, client and tooling dependencies needed to build the project.',
value: 'yes'
},
{
displayName: 'No',
description: 'Completes the new project wizard without installing dependencies.',
value: 'no'
}
];
}

return this.ui.question('Would you like to install the project dependencies?', options).then(answer => {
if (answer.value === 'yes' || answer.value === 'npm' || answer.value === 'yarn') {
const packageManager = answer.value === 'yes' ? 'npm' : answer.value;

return this.ui.question('Would you like to install the project dependencies?', [
{
displayName: 'Yes',
description: 'Installs all server, client and tooling dependencies needed to build the project.',
value: 'yes'
},
{
displayName: 'No',
description: 'Completes the new project wizard without installing dependencies.',
value: 'no'
}
]).then(answer => {
if (answer.value === 'yes') {
return this.ui.log(os.EOL + 'Installing project dependencies.')
.then(() => project.install(this.ui))
.then(() => project.install(this.ui, packageManager))
.then(() => this.displayCompletionMessage(project))
.then(() => context.next(this.nextActivity));
}
Expand Down

0 comments on commit cce5070

Please sign in to comment.