• 跳转到 … +
    browser.coffee cake.coffee coffee-script.coffee command.coffee grammar.coffee helpers.coffee index.coffee lexer.coffee nodes.coffee optparse.coffee register.coffee repl.coffee rewriter.coffee scope.litcoffee sourcemap.litcoffee
  • cake.coffee

  • ¶

    cake 是 Make (Rake, Jake) 的简化版,用于 CoffeeScript。您可以在 Cakefile 中定义带名称和描述的任务,并从命令行调用它们,或从其他任务中调用它们。

    在没有参数的情况下运行 cake 将打印出当前目录的 Cakefile 中所有任务的列表。

  • ¶

    外部依赖项。

    fs           = require 'fs'
    path         = require 'path'
    helpers      = require './helpers'
    optparse     = require './optparse'
    CoffeeScript = require './coffee-script'
  • ¶

    注册 .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()}"