Skip to content

Commit

Permalink
fix: 修改create
Browse files Browse the repository at this point in the history
  • Loading branch information
罗学 committed Apr 6, 2021
1 parent 3d4280c commit 3f3d45c
Show file tree
Hide file tree
Showing 38 changed files with 257 additions and 261 deletions.
2 changes: 1 addition & 1 deletion packages/cli/commands/create.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
exports.registerCommand = (params) => {
const { program } = params
const { program, cleanArgs } = params
program
.command('create <app-name>')
.description('创建一个项目')
Expand Down
100 changes: 19 additions & 81 deletions packages/cli/lib/Creator.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
const debug = require('debug')
const inquirer = require('inquirer')
const EventEmitter = require('events')
const Generator = require('./Generator')
const cloneDeep = require('lodash.clonedeep')
const getVersions = require('./util/getVersions')
const PackageManager = require('./util/ProjectPackageManager')
const { clearConsole } = require('./util/clearConsole')
const PromptModuleAPI = require('./PromptModuleAPI')
Expand All @@ -13,15 +11,13 @@ const generateReadme = require('./util/generateReadme')

const {
defaults,
saveOptions,
loadOptions,
validatePreset
} = require('./options')

const {
chalk,
execa,
semver,
log,
warn,
error,
Expand All @@ -30,7 +26,6 @@ const {
hasGit,
hasYarn,
hasPnpm3OrLater,
hasPnpmVersionOrLater,
exit,
loadModule
} = require('@pkb/shared-utils')
Expand Down Expand Up @@ -72,37 +67,21 @@ module.exports = class Creator extends EventEmitter {
(hasYarn() ? 'yarn' : null) ||
(hasPnpm3OrLater() ? 'pnpm' : 'npm')
)

const pm = new PackageManager({ context, forcePackageManager: packageManager })

await clearConsole()
logWithSpinner('✨', `创建项目 in ${chalk.yellow(context)}.`)
this.emit('creation', { event: 'creating' })

const { current, latest } = await getVersions()
let latestMinor = `${semver.major(latest)}.${semver.minor(latest)}.0`
if (
/major/.test(semver.diff(current, latest)) ||
(semver.gte(current, latest) && semver.prerelease(current))
) {
latestMinor = current
}

const pkg = {
name,
version: '0.1.0',
private: true,
devDependencies: {}
}
const deps = Object.keys(preset.plugins)
deps.forEach(dep => {
if (preset.plugins[dep]._isPreset) {
return
}

pkg.devDependencies[dep] = (
preset.plugins[dep].version ||
((/^@vue/.test(dep)) ? `^${latestMinor}` : 'latest')
)
})
// todo 安装插件
const deps = Object.keys(preset.plugins)

await writeFileTree(context, {
'package.json': JSON.stringify(pkg, null, 2)
Expand All @@ -122,7 +101,6 @@ module.exports = class Creator extends EventEmitter {

// run generator
log('🚀 创建中...')
this.emit('creation', { event: 'invoking-generators' })
const plugins = await this.resolvePlugins(preset.plugins)
const generator = new Generator(context, {
pkg,
Expand All @@ -133,15 +111,13 @@ module.exports = class Creator extends EventEmitter {

// install additional deps (injected by generators)
log('📦 安装依赖中...')
this.emit('creation', { event: 'deps-install' })
log()
if (!isTestOrDebug) {
await pm.install()
}

// run complete cbs if any (injected by generators)
logWithSpinner('⚓', '运行完成 hooks...')
this.emit('creation', { event: 'completion-hooks' })
for (const cb of afterInvokeCbs) {
await cb()
}
Expand All @@ -157,28 +133,11 @@ module.exports = class Creator extends EventEmitter {
'README.md': generateReadme(generator.pkg, packageManager)
})

// generate a .npmrc file for pnpm, to persist the `shamefully-flatten` flag
if (packageManager === 'pnpm') {
const pnpmConfig = hasPnpmVersionOrLater('4.0.0')
? 'shamefully-hoist=true\n'
: 'shamefully-flatten=true\n'

await writeFileTree(context, {
'.npmrc': pnpmConfig
})
}

// commit initial state
let gitCommitFailed = false
if (shouldInitGit) {
await run('git add -A')
if (isTestOrDebug) {
await run('git', ['config', 'user.name', 'test'])
await run('git', ['config', 'user.email', '[email protected]'])
}
const msg = typeof cliOptions.git === 'string' ? cliOptions.git : 'init'
try {
await run('git', ['commit', '-m', msg])
await run('git', ['commit', '-m', 'init'])
} catch (e) {
gitCommitFailed = true
}
Expand All @@ -187,15 +146,7 @@ module.exports = class Creator extends EventEmitter {
stopSpinner()
log()
log(`🎉 成功创建项目 ${chalk.yellow(name)}.`)
if (!cliOptions.skipGetStarted) {
log(
'👉 开始使用以下命令:\n\n' +
(this.context === process.cwd() ? '' : chalk.cyan(` ${chalk.gray('$')} cd ${name}\n`)) +
chalk.cyan(` ${chalk.gray('$')} ${packageManager === 'yarn' ? 'yarn serve' : packageManager === 'pnpm' ? 'pnpm run serve' : 'npm run serve'}`)
)
}
log()
this.emit('creation', { event: 'done' })

if (gitCommitFailed) {
warn(
Expand All @@ -217,18 +168,8 @@ module.exports = class Creator extends EventEmitter {
await clearConsole(true)
answers = await inquirer.prompt(this.resolveFinalPrompts())
}
debug('vue-cli:answers')(answers)

if (answers.packageManager) {
saveOptions({
packageManager: answers.packageManager
})
}

let preset
if (answers.preset && answers.preset !== '__manual__') {
preset = await this.resolvePreset(answers.preset)
}
const preset = await this.resolvePreset(answers.preset)

validatePreset(preset)

Expand All @@ -239,11 +180,12 @@ module.exports = class Creator extends EventEmitter {
let preset
const savedPresets = loadOptions().presets || {}

console.log(name, preset, savedPresets)

if (name in savedPresets) {
preset = savedPresets[name]
} else if (name.includes('/')) {
logWithSpinner(`Fetching remote preset ${chalk.cyan(name)}...`)
this.emit('creation', { event: 'fetch-remote-preset' })
try {
preset = await loadRemotePreset(name, clone)
stopSpinner()
Expand All @@ -254,21 +196,17 @@ module.exports = class Creator extends EventEmitter {
}
}

if (name === 'default' && !preset) {
preset = defaults.presets.default
}

if (!preset) {
error(`preset "${name}" not found.`)
const presets = Object.keys(savedPresets)
if (presets.length) {
log()
log(`available presets:\n${presets.join('\n')}`)
} else {
log('you don\'t seem to have any saved preset.')
}
exit(1)
}
// if (!preset) {
// error(`preset "${name}" not found.`)
// const presets = Object.keys(savedPresets)
// if (presets.length) {
// log()
// log(`available presets:\n${presets.join('\n')}`)
// } else {
// log('you don\'t seem to have any saved preset.')
// }
// exit(1)
// }

return preset
}
Expand Down
62 changes: 27 additions & 35 deletions packages/cli/lib/create.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,7 @@ const { chalk, error, stopSpinner, exit } = require('@pkb/shared-utils')
const validateProjectName = require('validate-npm-package-name')

async function create(projectName, options) {
if (options.proxy) {
process.env.HTTP_PROXY = options.proxy
}

const cwd = options.cwd || process.cwd()
const cwd = process.cwd()
const inCurrent = projectName === '.'
const name = inCurrent ? path.relative('../', cwd) : projectName
const targetDir = path.resolve(cwd, projectName || '.')
Expand All @@ -30,38 +26,34 @@ async function create(projectName, options) {
}
// 如果文件夹存在
if (fs.existsSync(targetDir)) {
if (options.force) {
await fs.remove(targetDir)
await clearConsole()
if (inCurrent) {
const { ok } = await inquirer.prompt([
{
name: 'ok',
type: 'confirm',
message: '是否在当前目录下创建项目?'
}
])
if (!ok) return
} else {
await clearConsole()
if (inCurrent) {
const { ok } = await inquirer.prompt([
{
name: 'ok',
type: 'confirm',
message: '是否在当前目录下创建项目?'
}
])
if (!ok) return
} else {
const { action } = await inquirer.prompt([
{
name: 'action',
type: 'list',
message: `目标文件夹 ${chalk.cyan(targetDir)} 已经存在. 选一种方式:`,
choices: [
{ name: '覆盖', value: 'overwrite' },
{ name: '合并', value: 'merge' },
{ name: '删除', value: false }
]
}
])
if (!action) {
return
} else if (action === 'overwrite') {
console.log(`\n正在删除中 ${chalk.cyan(targetDir)}...`)
await fs.remove(targetDir)
const { action } = await inquirer.prompt([
{
name: 'action',
type: 'list',
message: `目标文件夹 ${chalk.cyan(targetDir)} 已经存在. 选一种方式:`,
choices: [
{ name: '覆盖', value: 'overwrite' },
{ name: '合并', value: 'merge' },
{ name: '删除', value: false }
]
}
])
if (!action) {
return
} else if (action === 'overwrite') {
console.log(`\n正在删除中 ${chalk.cyan(targetDir)}...`)
await fs.remove(targetDir)
}
}
}
Expand Down
4 changes: 3 additions & 1 deletion packages/cli/lib/options.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ const { exit } = require('@pkb/shared-utils/lib/exit')
const { error } = require('@pkb/shared-utils/lib/logger')
const { createSchema, validate } = require('@pkb/shared-utils/lib/validate')

const rcPath = exports.rcPath = getRcPath('.vuerc')
const rcPath = exports.rcPath = getRcPath('.pkdrc')

const presetSchema = createSchema(joi => joi.object().keys({
bare: joi.boolean(),
Expand Down Expand Up @@ -55,6 +55,8 @@ exports.loadOptions = () => {
if (cachedOptions) {
return cachedOptions
}

console.log(rcPath)
if (fs.existsSync(rcPath)) {
try {
cachedOptions = JSON.parse(fs.readFileSync(rcPath, 'utf-8'))
Expand Down
75 changes: 3 additions & 72 deletions packages/cli/lib/util/clearConsole.js
Original file line number Diff line number Diff line change
@@ -1,79 +1,10 @@
const getVersions = require('./getVersions')
const {
chalk,
execa,
semver,
clearConsole,
hasYarn,
hasPnpm3OrLater
clearConsole
} = require('@pkb/shared-utils')

async function getInstallationCommand () {
if (hasYarn()) {
const { stdout: yarnGlobalDir } = await execa('yarn', ['global', 'dir'])
if (__dirname.includes(yarnGlobalDir)) {
return 'yarn global add'
}
}

if (hasPnpm3OrLater()) {
const { stdout: pnpmGlobalPrefix } = await execa('pnpm', ['config', 'get', 'prefix'])
if (__dirname.includes(pnpmGlobalPrefix) && __dirname.includes('pnpm-global')) {
return 'pnpm i -g'
}
}

const { stdout: npmGlobalPrefix } = await execa('npm', ['config', 'get', 'prefix'])
if (__dirname.includes(npmGlobalPrefix)) {
return 'npm i -g'
}
}

exports.generateTitle = async function (checkUpdate) {
const { current, latest, error } = await getVersions()
let title = chalk.bold.blue(`BOX v${current}`)

if (process.env.VUE_CLI_TEST) {
title += ' ' + chalk.blue.bold('TEST')
}
if (process.env.VUE_CLI_DEBUG) {
title += ' ' + chalk.magenta.bold('DEBUG')
}

if (error) {
title += '\n' + chalk.red('Failed to check for updates')
}

if (checkUpdate && !error && semver.gt(latest, current)) {
if (process.env.VUE_CLI_API_MODE) {
} else {
let upgradeMessage = `New version available ${chalk.magenta(current)}${chalk.green(latest)}`

try {
const command = await getInstallationCommand()
let name = require('@pkb/shared-utils/package.json').name
if (semver.prerelease(latest)) {
name += '@next'
}

if (command) {
upgradeMessage +=
`\nRun ${chalk.yellow(`${command} ${name}`)} to update!`
}
} catch (e) {}

const upgradeBox = require('boxen')(upgradeMessage, {
align: 'center',
borderColor: 'green',
dimBorder: true,
padding: 1
})

title += `\n${upgradeBox}\n`
}
}

return title
exports.generateTitle = async function () {
return chalk.bold.blue('pk-cli')
}

exports.clearConsole = async function clearConsoleWithTitle (checkUpdate) {
Expand Down
Loading

0 comments on commit 3f3d45c

Please sign in to comment.