Skip to content
This repository has been archived by the owner on Dec 12, 2017. It is now read-only.

Commit

Permalink
add use option && add command
Browse files Browse the repository at this point in the history
  • Loading branch information
QingWei-Li committed May 4, 2016
1 parent 763021b commit da26738
Show file tree
Hide file tree
Showing 14 changed files with 168 additions and 24 deletions.
23 changes: 22 additions & 1 deletion README.md
Expand Up @@ -15,6 +15,8 @@ http://cookingjs.github.io


## 安装
**只能使用 NPM 3 及其以上版本安装**

```shell
npm i cooking -g
```
Expand All @@ -39,6 +41,8 @@ cooking 将 webpack 的配置重新包装过,提供的基础配置能满足大
var cooking = require('cooking')

cooking.set({
// 当前项目需要引入的依赖包
use: '',
// 入口文件。同 webpack 的 entry,接受 String|Array|Object,使用相对路径
entry: './src/entry.js',
// 项目输出路径。同 output.path,使用相对路径
Expand Down Expand Up @@ -231,6 +235,11 @@ config.resolve.extensions.push('.json')
> cooking import <plugin-name>
```

安装依赖包
```shell
> cooking import <package-name> -p
```


### remove
卸载插件
Expand All @@ -243,6 +252,11 @@ config.resolve.extensions.push('.json')
> cooking remove <template-name> -t
```

卸载依赖包
```shell
> cooking remove <package-name> -p
```


### update
更新插件,可指定版本号,同 npm update
Expand All @@ -255,15 +269,22 @@ config.resolve.extensions.push('.json')
> cooking update <template-name> -t
```

更新依赖包
```shell
> cooking update <package-name> -p
```

### list
查看安装的插件和脚手架
```shell
> cooking list
```

## 依赖包列表
- [vue](https://github.com/cookingjs/cooking-package-vue) 提供 vue、vuex、vue-router 和 vue-resource

## 插件列表
- [vue](https://github.com/cookingjs/cooking-vue) 提供 vue、vuex 和 vue 相关配置
- [vue](https://github.com/cookingjs/cooking-vue) vue 相关配置
- [sass](https://github.com/cookingjs/cooking-sass) sass 配置
- [postcss](https://github.com/cookingjs/cooking-postcss) postcss-loader, 内置 cssnext
- [lint](https://github.com/cookingjs/cooking-lint) lint 在 JS 文件 babel 之前
Expand Down
9 changes: 4 additions & 5 deletions bin/cooking
Expand Up @@ -5,8 +5,6 @@ var program = require('commander')
var PATH = require('../util/path')
var check = require('../util/check')
var config = require('../util/config')
// TODO
// var loadCommand = require('../util/load-command')

check.initPluginPackage()
config.init()
Expand All @@ -17,7 +15,8 @@ if (config.get('updateCheck')) {

// hack
// https://gist.github.com/branneman/8048520#6-the-hack
process.env['NODE_PATH'] = [
process.env['NODE_PATH'] += [
'',
path.join(PATH.CWD_PATH, 'node_modules'),
PATH.LIB_PATH,
path.join(PATH.ROOT_PATH, 'node_modules'),
Expand All @@ -39,8 +38,8 @@ program
.command('watch', '开发模式 development')
.command('build', '生产模式 production')

// TODO: 读取动态指令
// loadCommand(program)
// 加载动态指令
require('../util/load-command')(program)
program.parse(process.argv)

if (!process.argv.slice(2).length) {
Expand Down
3 changes: 2 additions & 1 deletion bin/cooking-build
Expand Up @@ -12,6 +12,7 @@ var chalk = require('chalk')
program
.option('-c --config <configfile>', 'Webpack config file')
.option('-p --progress', 'Display progress')
.option('--no-color', 'Disable colors to display the statistics')
.parse(process.argv)

// set env
Expand Down Expand Up @@ -55,7 +56,7 @@ webpack(config).run(function (err, stats) {
return
}
logger.success('info\n' + stats.toString({
colors: true,
colors: program.color,
chunks: false,
children: false
}))
Expand Down
19 changes: 12 additions & 7 deletions bin/cooking-import
Expand Up @@ -2,30 +2,35 @@

var program = require('commander')
var logger = require('../util/logger')
var isInstalled = require('../util/is-installed')
var npm = require('../util/npm')

program
.option('-r --registry [registry-url]', '指定镜像, 默认选用 taobao 镜像')
.option('-t --template', '安装脚手架')
.option('-p --package', '安装依赖包')
.parse(process.argv)

console.log()
process.on('exit', function () {
console.log()
})

var option = program.args[0]
var name = program.args[0]

if (!option) {
if (!name) {
logger.fatal('请指定插件名称')
}

if (option.indexOf('/') > -1) {
name = option
if (program.template) {
logger.log('安装脚手架: ' + name)
name = 'slush-cooking-' + name
} else if (program.package) {
logger.log('安装依赖包: ' + name)
name = 'cooking-package-' + name
} else {
name = 'cooking-' + option
logger.log('安装插件: ' + name)
name = 'cooking-' + name
}

logger.log('安装插件: ' + option)
npm.install(name, program.registry)
logger.success('安装成功')
15 changes: 15 additions & 0 deletions bin/cooking-list
Expand Up @@ -17,15 +17,25 @@ var info = require(pkg)
var dependencies = info.dependencies
var generatorPkg = {}
var pluginPkg = {}
var commandPkg = {}
var dependencyPkg = {}

for (var name in dependencies) {
if (/^slush-cooking-/.test(name)) {
generatorPkg[name.replace(/^slush-cooking-/, '')] = dependencies[name]
} else if (/^cooking-(\S+)-cli$/.test(name)) {
commandPkg[name.replace(/^cooking-(\S+)-cli$/, '$1')] = dependencies[name]
} else if (/^cooking-package-/.test(name)) {
dependencyPkg[name.replace(/^cooking-package-/, '')] = dependencies[name]
} else if (/^cooking-/.test(name)) {
pluginPkg[name.replace(/^cooking-/, '')] = dependencies[name]
}
}

logger.log('--------------')
logger.log('已安装依赖包')
logger.log('--------------')
console.log(json.plain(dependencyPkg))
logger.log('--------------')
logger.log('已安装脚手架')
logger.log('--------------')
Expand All @@ -35,3 +45,8 @@ logger.log('--------------')
logger.log('已安装插件')
logger.log('--------------')
console.log(json.plain(pluginPkg))
console.log()
logger.log('--------------')
logger.log('已安装指令')
logger.log('--------------')
console.log(json.plain(commandPkg))
7 changes: 6 additions & 1 deletion bin/cooking-remove
@@ -1,10 +1,12 @@
#!/usr/bin/env node

var program = require('commander')
var logger = require('../util/logger')
var npm = require('../util/npm')

program
.option('-t --template [template-name]', '卸载脚手架')
.option('-t --template', '卸载脚手架')
.option('-p --package', '卸载依赖包')
.parse(process.argv)

console.log()
Expand All @@ -21,6 +23,9 @@ if (!name) {
if (program.template) {
logger.log('卸载脚手架: ' + name)
name = 'slush-cooking-' + name
} else if (program.package) {
logger.log('卸载依赖包: ' + name)
name = 'cooking-package-' + name
} else {
logger.log('卸载插件: ' + name)
name = 'cooking-' + name
Expand Down
6 changes: 5 additions & 1 deletion bin/cooking-update
Expand Up @@ -6,7 +6,8 @@ var npm = require('../util/npm')

program
.option('-r --registry [registry-url]', '指定镜像, 默认选用 taobao 镜像')
.option('-t --template [template-name]', '更新脚手架')
.option('-t --template', '更新脚手架')
.option('-p --package', '更新依赖包')
.parse(process.argv)

console.log()
Expand All @@ -23,6 +24,9 @@ if (!name) {
if (program.template) {
logger.log('更新脚手架: ' + name)
name = 'slush-cooking-' + name
} else if (program.package) {
logger.log('更新依赖包: ' + name)
name = 'cooking-package-' + name
} else {
logger.log('更新插件: ' + name)
name = 'cooking-' + name
Expand Down
7 changes: 5 additions & 2 deletions lib/cooking.js
Expand Up @@ -4,6 +4,7 @@ var getBaseConfig = require('../util/get-base-config')
var merge = require('../util/merge')
var parse = require('../util/parse')
var loadExtend = require('../util/load-extend')
var loadPackage = require('../util/load-package')

/**
* loader.vue => module.loaders.vue
Expand All @@ -18,9 +19,11 @@ var replacePath = function (path) {
* set config
*/
exports.set = function (config) {
this.config = merge(config || {}, getBaseConfig(config || {}))
config = config || {}
this.config = merge(config, getBaseConfig(config))

loadExtend(this.config.__COOKING_EXTENDS__, {
loadPackage(config.use)
loadExtend(config.extends, {
add: this.add,
remove: this.remove,
config: this.config
Expand Down
4 changes: 2 additions & 2 deletions package.json
Expand Up @@ -76,7 +76,7 @@
"style-loader": "^0.13.1",
"update-notifier": "^0.6.3",
"url-loader": "^0.5.7",
"webpack": "^1.12.14",
"webpack-dev-server": "^1.14.1"
"webpack": "~1.12.14",
"webpack-dev-server": "~1.14.1"
}
}
23 changes: 23 additions & 0 deletions test/is.test.js
@@ -0,0 +1,23 @@
import test from 'ava'
import is from '../util/is'

test('is string', t => {
t.true(is.string(''))
t.false(is.string(123))
})

test('is array', t => {
t.true(is.array([]))
t.false(is.array(''))
})

test('is object', t => {
t.true(is.object({}))
t.false(is.object(''))
})

test('is boolean', t => {
t.true(is.boolean(true))
t.true(is.boolean(false))
t.false(is.boolean({}))
})
26 changes: 26 additions & 0 deletions test/logger.test.js
@@ -0,0 +1,26 @@
import test from 'ava'
import logger from '../util/logger'

test('logger warn', t => {
t.notThrows(function () {
logger.warn('ok')
})
})

test('logger log', t => {
t.notThrows(function () {
logger.log('ok')
})
})

test('logger success', t => {
t.notThrows(function () {
logger.success('ok')
})
})

test('logger error', t => {
t.notThrows(function () {
logger.error('ok')
})
})
15 changes: 14 additions & 1 deletion util/load-command.js
Expand Up @@ -7,8 +7,21 @@ module.exports = function (program) {
for (var name in dependencies) {
if (/^cooking-(\S+)-cli$/.test(name)) {
var commandName = name.replace(/^cooking-(\S+)-cli$/, '$1')
var description = require(path.join(name, 'package.json')).description
var action = (function (_name) {
return function () {
require(_name)(program)
}
})(name)
var command = program.command(commandName)

program.command(commandName, '')
command.description(description)
try {
require(path.join(name, 'options'))(command)
} catch (e) {
// options.js 文件不存在则不处理
}
command.action(action)
}
}
}
32 changes: 32 additions & 0 deletions util/load-package.js
@@ -0,0 +1,32 @@
var pluginExists = require('./check').pluginExists
var logger = require('./logger')
var isArray = require('./is').array
var isString = require('./is').string
var exec = require('./exec')

var installExtend = function (name) {
logger.warn('依赖包不存在,自动下载依赖包: ' + name)
exec('cooking', ['import', name, '-p'], {
stdio: 'inherit'
})
}

module.exports = function (pkg) {
if (!pkg) {
return
}

if (!isString || !isArray) {
logger.fatal('use 字段只接受数组和字符串类型')
}

if (isString(pkg)) {
pkg = [pkg]
}

pkg.forEach(function (name) {
if (!pluginExists('cooking-pkg-' + name)) {
installExtend(name)
}
})
}
3 changes: 0 additions & 3 deletions util/merge.js
Expand Up @@ -97,9 +97,6 @@ module.exports = function (userConfig, baseConfig) {
config.__COOKING_CLEAN__ = true
}

// extends
config.__COOKING_EXTENDS__ = userConfig.extends

// chunk
if (is.string(userConfig.chunk)) {
var hashContent = userConfig.hash === true && process.env.NODE_ENV === 'production' ? '.[hash:7]' : ''
Expand Down

0 comments on commit da26738

Please sign in to comment.