Grunt: Watch multiple files, Compile only Changed

前端 未结 4 1615
悲哀的现实
悲哀的现实 2020-12-05 06:28

I\'m new to Grunt, and so far I\'m enjoying it very much. I want Grunt to compile only the changed files when running grunt watch

In my Grunfile.coffee

4条回答
  •  醉话见心
    2020-12-05 07:01

    The grunt.event.on event detects changes in files, receiving an action and filepath parameter.

    Here's an untested example based on one of my gruntfiles. In this case, all my source coffeescript files are kept in a directory called sources, and for previewing they are compiled and saved to an identical directory structure under a directory called dev

    SOURCES_DIR = 'sources'
    DEV_DIR = 'dev'
    
    grunt.initConfig
      watch :
        all :
          files : ["**/*.coffee"]
      coffee :
        dev :
          files :
            dest : "app.js"
    grunt.loadNpmTasks 'grunt-contrib-watch'
    grunt.loadNpmTasks 'grunt-contrib-coffee'
    
    grunt.registerTask 'build', ['coffee:dev']
    
    grunt.event.on('watch', (action,filepath) ->
      # Determine the full directory of the changed file
      wdi = filepath.lastIndexOf '/'
      wd =  filepath.substring 0,wdi
    
      # remove `sources` prefix from that directory
      fpath = wd.replace(SOURCES_DIR,'') + '/'
    
      # determine the filename
      fnamei = filepath.lastIndexOf '.'
      fname = filepath.substring wdi+1,fnamei # NOTE: this breaks the case where in same dir
    
      # concatenate fpath and fname with the dir to be compiled into
      deststr = "#{DEV_DIR}#{fpath}#{fname}.coffee"
    
    
      # set coffee.dev.files value in the coffee task to have am entry of form {"destination":"source"}
      obj = {}
      obj[deststr] = filepath
      grunt.config "coffee.dev.files", obj
    
      # fire the coffee task
      grunt.task.run "coffee"
    )
    

    Hope that helps.

    EDIT: Probably not exactly what you want - because no doubt you want access to intermediary variables, actions and so forth - but you could use grunt to just run a shell coffee command. The grunt-shell npm task does this, for example

    EDIT2: I've faced continued problems with grunt.watch.on not working consistently in grunt 0.4.1 on OSX 10.8 and MacVim 7.3; for whatever reason, it stops watching. I've reverted back to just using the basic grunt initConfig object but with much more granularity so it only watches and compiles relatively small groups of files rather than the whole lot. This slows down the build time considerably, but it much more robust. Your mileage may very.

提交回复
热议问题