¿Cómo puedo personalizar este script de comstackción con Node?

Tengo una estructura de directorio única para la que necesito ayuda para crear un script de comstackción.
Aquí está el enlace (ligeramente diferente) o la estructura del directorio:

client /extensions /sandbox /widgets /form /collections /models /views /styles custom.css /controllers main.coffee server /views /layouts /errors app.coffee config.coffee 

Un par de cosas que necesito:

  • Compile coffeescript con una tarea de observación en un servidor-dist + client-dist
  • Copie todos los demás archivos en sus carpetas anidadas, preferiblemente con una tarea de observación también

Problemas:

  • Si compilo coffeescript, simplemente copia los archivos .coffee a .js en sus directorios nesteds, pero eso deja atrás .css / imgs / etc cargado con require.js. Necesito una forma de incluirlos también en los directorios de listas.
  • Main.coffee en la carpeta / client es un require.config y puede usarse con la herramienta de construcción requirejs grunt para optimizar las cosas.

De todos modos la solución más fácil es lo que estoy buscando.

Terminé usando grunt – con las siguientes tareas:

  • limpio : borra los directorios de comstackción del servidor / cliente
  • ver : supervisa los archivos .coffee y ambos construyen directorios
  • copiar : copia sobre archivos de cliente / servidor para crear directorios que ignoran los archivos .coffee que son administrados por la tarea de café
  • coffee : Comstack archivos .coffee a .js moviéndolos a los directorios de comstackción

Aquí está el archivo grunt en su iteración actual:

 grunt.initConfig({ clean: { build: ['client-dist', 'server-dist'], release: [] }, watch: { coffee: { files: ['client/**/*.coffee', 'server/**/*.coffee'], tasks: 'coffee reload' }, reload: { files: ['client/**/*.!(coffee)', 'server/**/*.!(coffee)'], tasks: 'copy reload' } }, copy: { client: { files: { "client-dist/": "client/**/*.!(coffee)" }, options: { basePath: "client" } }, server: { files: { "server-dist/": "server/**/*.!(coffee)" }, options: { basePath: "server" } } }, coffee: { compile: { files: { 'server-dist/*.js': 'server/**/*.coffee', 'client-dist/*.js': 'client/**/*.coffee' } } } }); grunt.loadNpmTasks('grunt-contrib'); grunt.loadNpmTasks('grunt-reload'); grunt.registerTask('default', ''); grunt.registerTask('build', 'clean:build copy coffee watch');