Pregunta

Estoy empezando un proyecto en el trabajo y me preguntaba cuál sería la mejor herramienta de construcción.

Toda la cosa está escrita en Coffeescript, utilizando AngularJS para el lado del cliente y los nodejs para el servidor.

Hay varios componentes para la aplicación:

  • una aplicación ipad
  • una aplicación de iPhone (diferente funcionalidad desde el iPad)
  • un CMS para las aplicaciones
  • un servidor nodejs

Hay toneladas de código compartido entre todos estos, nuevamente todos escritos en Coffeescript.

Me gustaría una herramienta de compilación donde puedo enumerar qué aplicación usa el código (gran parte de él compartido) y crearía los archivos de JavaScript de cada aplicación en una carpeta separada.

Por ejemplo, configuraría una carpeta llamada '/ compiled / ipad /' que tiene index.html, y carpetas para JS, CSS, IMG, etc. Listaría qué archivos de café compilados que quiero arrojado / compilado / iPad / JS (parte de /src/shared/*.coffee, algunos de ellos de /src/ipad/*.coffee, etc.) y qué archivos quiero arrojado / compilado / iPad / CSS. Me gustaría que pudiera concatenar fácilmente los archivos cómo también quiero.

También compilaría mis pruebas, de / SRC / TEST / iPad en / Compiled / Test / iPad / *. JS.

Todas las pruebas de la unidad de la unidad del cliente se escriben usando testacular y no estoy seguro de lo que yo ' Esciraremos las pruebas de la unidad del lado del servidor todavía.

¿Qué herramienta de construcción / configuración es el mejor enfoque aquí? Un makefile? ¿Algo así como gruñido? Sinceramente soy nuevo en toda la escena de construcción.

Editar : decidió ir con navegación. Puede encontrar mi solución para que funcione con Angular aquí: https:// grupos. google.com/forum/#!topic/angular/ytovaikoccs

¿Fue útil?

Solución

Pondría todo el código compartido en los módulos node.js y crearía un proyecto que se vea como lo siguiente:

Project
|~apps/
| |~cms/
| | `-app.js
| |~ipad/
| | `-app.js
| |~iphone/
| | `-app.js
| `~node/
|   `-app.js
|~libs/
| |-module.js
| `-module2.js
|~specs/
| |~cms/
| | `-app.js
| |~ipad/
| | `-app.js
| |~iphone/
| | `-app.js
| `~node/
|   `-app.js
| `~libs/
|   |-module.js
|   `-module2.js
`-Makefile

Luego usaría algo como navegación (hay otros) para que las aplicaciones del lado del cliente sean necesarias.De esa manera, en lugar de tener un archivo de compilación donde dice lo que necesita, en realidad, tiene aplicaciones reales importando módulos.

Otros consejos

Personalmente, creo que la unidad para escribir el código del lado del servidor en JavaScript o Coffeescript se extiende a su cadena de herramientas de compilación: así que se adhiere al usar JavaScript / Coffeescript allí también. Esto le permitirá automatizar fácilmente sus tareas de servidor / cliente de su herramienta de compilación, dudo que sea de manera significativa posible con otra herramienta como hacer (simplemente estaría escribiendo envolturas alrededor de las llamadas de comando node.js). Sugerencias, ordenadas por estructurada:

  • node.js : Simplemente ruede sus scripts de compilación en JavaScript, e invocarlos con nodo. Supongamos scripts de shell, supongo. No recomiendo esta ruta.
  • jake o Pastel : soy del mundo de Java, por lo que no es sorprendente que estos me recuerdan a la hormiga. Prefiero CafeeScript, y por lo tanto prefiero el pastel.
  • Grunt : No había oído hablar de esto antes, así que no puedo dar mucho consejo. Me recuerda a Maven, por supuesto ... y solo puedo decir ... Cuanta más estructura, una herramienta de compilación tiende a imponer lo menos flexible, puede ser. Es algo de una compensación. Mientras lo haga "la herramienta de construcción", puede ahorrar toneladas de tiempo. Pero si tiene problemas específicos de la aplicación, puede ser un dolor real para resolver.

Por supuesto, puede ir con alguna otra herramienta de construcción que ya está familiarizado con algún otro idioma: Rake, Maven, Horm, Grandle, etc.

Hice casi esta cosa exacta en un shapewile usando módulos de nodo según sea necesario.

Establecer algunas variables globales que son matrices con la ruta de cada archivo, concatenan los archivos en un archivo en el directorio compilado que especifique, luego compila que un archivo en JS.

para los estilos, lo mismo con la concatenación sin la compilación, obviamente.

fs = require 'fs'
path = require 'path'
{spawn, exec} = require 'child_process'
parser = require('uglify-js').parser
uglify = require('uglify-js').uglify
cleanCss = require 'clean-css'

coffees = 
 [
  "/src/shared/file1.coffee"
  "/src/shared/file2.coffee"
  "/src/ipad/file1.coffee"
 ]

tests = 
  [
   "/src/ipad/tests.coffee"
  ]

styles = 
 [
  "/src/ipad/styles1.css"
  "/src/shared/styles2.css"
 ]

concatenate = (destinationFile, files, type) ->
  newContents = new Array
  remaining = files.length
  for file, index in files then do (file, index) ->
      fs.readFile file, 'utf8', (err, fileContents) ->
          throw err if err
          newContents[index] = fileContents
          if --remaining is 0
              fs.writeFile destinationFile, newContents.join '\n\n', 'utf8', (err) ->
                throw err if err
              if type is 'styles'
                 minifyCss fileName
              else
                 compileCoffee fileName


 compileCoffee = (file) ->
    exec "coffee -c #{file}", (err) ->
       throw err if err
       # delete coffee file leaving only js
       fs.unlink 'path/specifying/compiled_coffee', (err) -> 
          throw err if err
          minifyJs file

 minifyJs = (file) ->
  fs.readFile f, 'utf8', (err, contents) ->
      ast = parser.parse contents
      ast = uglify.ast_mangle ast 
      ast = uglify.ast_squeeze ast
      minified = uglify.gen_code ast

      writeMinified file, minified

writeMinified = (file, contents) ->
   fs.writeFile file, contents, 'utf8', (err) -> throw err if err  


minifyCss = (file) ->
    fs.readFile file, 'utf8', (err, contents) ->
    throw err if err
    minimized = cleanCss.process contents
    clean = minimized.replace 'app/assets', ''

    fs.writeFile file, clean, 'utf8', (err) ->
        throw err if err


task 'compile_coffees', 'concat, compile, and minify coffees', ->
  concatenate '/compiled/ipad/code.coffee', coffees, 'coffee'

task 'concat_styles', 'concat and minify styles', ->
  concatenate '/compiled/ipad/css/styles.css', styles, 'styles'

task 'compile_tests', 'concat, compile, and minify test', ->
  concatenate '/compiled/ipad/tests.coffee', tests, 'tests'

Ahora esto es aproximadamente lo que creo que está pidiendo.

definitivamente podría ser más bonita, especialmente teniendo una función separada para escribir los contenidos miniizados, pero funciona.

No es perfecto para los estilos, ya sea porque estaba usando SASS y tenía otras funciones antes de que llegara a la función mini., pero creo que obtienes la idea.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top