2011-07-08 58 views
10

Estoy intentando configurar SBT para compilar un proyecto existente que no utiliza la estructura de directorios maven. Estoy utilizando el full configuration y he puesto mi configuración resourceDirectory JavaSource & de la siguiente manera:Recursos de filtrado en SBT

def settings = Defaults.defaultSettings ++ Seq(
    resourceDirectory in Compile <<= baseDirectory(_/"java"), 
    javaSource in Compile <<= baseDirectory(_/"java") 
) 

Ahora quiero ser capaz de filtrar los recursos que incluimos en el artefacto frasco, como hacemos actualmente con la hormiga, además de excluir. archivos java ya que nuestros recursos están mezclados con el código fuente. Por ejemplo:

<fileset dir="java" includes="**/*.txt, **/*.csv" excludes="**/*.java" /> 

¿Hay alguna manera de hacer esto?

+0

Solo un aviso para las personas que miran esta pregunta, esto es SBT 0.10. –

+0

¿Vale la pena crear una etiqueta sbt10? Es muy diferente de sbt07 ... – opyate

+1

un aviso secundario - 'defaultExcludes' se desaprobó a favor de' excludeFilter'in sbt 0.11 – wbarksdale

Respuesta

6

Utilice defaultExcludes con ámbito para la tarea unmanagedResources y opcionalmente la configuración. Por ejemplo, esta configuración excluye .java archivos de los recursos principales:

defaultExcludes in Compile in unmanagedResources := "*.java" 

in Compile limita a esta configuración sólo se aplican a los recursos principales. Al usar in Test, se aplicaría solo a los recursos de prueba. Al omitir una configuración (es decir, no in Compile o in Test), la configuración se aplicaría a los recursos principales y de prueba.

in unmanagedResources aplica estas exclusiones solo para recursos. Para aplicar excluye a las fuentes, por ejemplo, el alcance sería in unmanagedSources. El motivo de la parte no gestionada es enfatizar que estos se aplican únicamente a fuentes no administradas (o editadas manualmente).

La clave defaultExcludes tiene tipo sbt.FileFilter, por lo que el valor de configuración debe ser de este tipo. En el ejemplo anterior, "*.java" se convierte implícitamente en un FileFilter. * se interpreta como un comodín, por lo que el filtro acepta archivos con un nombre que termina en '.java'. Para combinar filtros, usa || y &&. Por ejemplo, si .scala archivos necesarios para ser excluidos, así, el argumento a := sería:

"*.java" || "*.scala" 

En el conjunto de archivos Ant original, los filtros de inclusión y exclusión seleccionar conjuntos mutuamente excluyentes de archivos, por lo que sólo una es necesario.

También es posible construir directamente el Seq[File] para unmanagedResources. Por ejemplo:

unmanagedResources in Compile <<= 
    unmanagedResourceDirectories in Compile map { (dirs: Seq[File]) => 
    (dirs ** ("*.txt" || "*.csv" -- "*.java")).get 
    } 

El método ** selecciona todos los descendientes que coinciden con el argumento FileFilter. Puede verificar que los archivos se seleccionen como espera ejecutando show unmanaged-resources.

+0

Esto funciona si quiero excluir archivos .java, ¿puedo incluir solo un conjunto de archivos en particular? Supongo que negar un 'sbt.FileFilter' funcionaría si eso fuera posible. –

+0

No hay una configuración complementaria de 'incluye' ni nada. Hay 'sourceFilter' para fuentes y' classpathFilter' para classpaths, pero nada para recursos. Sería útil unificar estos en cosas como 'includes in unmanagedResources', por lo que podría [abrir un error] (https://github.com/harrah/xsbt/issues) para ello. Negar un 'FileFilter' es posible, pero no ayudará aquí. –

+0

Edité la respuesta para incluir cómo construir directamente la configuración de recursos. –