fs = require 'fs'
path = require 'path'
helpers = require './helpers'
optparse = require './optparse'
CoffeeScript = require './'
外部依赖项。
fs = require 'fs'
path = require 'path'
helpers = require './helpers'
optparse = require './optparse'
CoffeeScript = require './'
注册 .coffee 扩展名
CoffeeScript.register()
跟踪定义的任务列表、可接受的选项等等。
tasks = {}
options = {}
switches = []
oparse = null
将顶层 Cake 函数混合到 Cakefile 中,以便直接使用。
helpers.extend global,
使用简短名称、可选的句子描述和作为操作本身运行的函数来定义 Cake 任务。
task: (name, description, action) ->
[action, description] = [description, action] unless action
tasks[name] = {name, description, action}
定义 Cakefile 接受的选项。解析后的选项哈希,包含所有传递的命令行选项,将作为第一个参数提供给操作。
option: (letter, flag, description) ->
switches.push [letter, flag, description]
在当前 Cakefile 中调用另一个任务。
invoke: (name) ->
missingTask name unless tasks[name]
tasks[name].action options
运行 cake
。按顺序执行您传递的所有任务。请注意,Node 的异步性可能会导致任务以与您预期不同的顺序执行。如果没有传递任务,则打印帮助屏幕。在从子目录运行 Cake 任务时,保留对原始目录名称的引用。
exports.run = ->
global.__originalDirname = fs.realpathSync '.'
process.chdir cakefileDirectory __originalDirname
args = process.argv[2..]
CoffeeScript.run fs.readFileSync('Cakefile').toString(), filename: 'Cakefile'
oparse = new optparse.OptionParser switches
return printTasks() unless args.length
try
options = oparse.parse(args)
catch e
return fatalError "#{e}"
invoke arg for arg in options.arguments
以类似于 rake -T
的格式显示 Cake 任务列表
printTasks = ->
relative = path.relative or path.resolve
cakefilePath = path.join relative(__originalDirname, process.cwd()), 'Cakefile'
console.log "#{cakefilePath} defines the following tasks:\n"
for name, task of tasks
spaces = 20 - name.length
spaces = if spaces > 0 then Array(spaces + 1).join(' ') else ''
desc = if task.description then "# #{task.description}" else ''
console.log "cake #{name}#{spaces} #{desc}"
console.log oparse.help() if switches.length
在尝试使用无效的任务/选项时打印错误并退出。
fatalError = (message) ->
console.error message + '\n'
console.log 'To see a list of all tasks/options, run "cake"'
process.exit 1
missingTask = (task) -> fatalError "No such task: #{task}"
当调用 cake
时,在当前目录和所有父目录中搜索以找到相关的 Cakefile。
cakefileDirectory = (dir) ->
return dir if fs.existsSync path.join dir, 'Cakefile'
parent = path.normalize path.join dir, '..'
return cakefileDirectory parent unless parent is dir
throw new Error "Cakefile not found in #{process.cwd()}"