¿Cómo incluir condicionalmente uno de los dos archivos en un paquete .war con buildr?
Pregunta
Estamos utilizando BuildR para empaquetar una aplicación como un .guerra expediente. Para optimizar el proceso de implementación automatizado, me gustaría seleccionar condicionalmente uno de estos dos archivos (desde el directorio src/main/resources
)...
database-hsql.properties
database-postgres.properties
... y tenerlo incluido en la guerra resultante con el nombre database.properties
. (En el mismo lugar dentro de la guerra, a saber WEB-INF/classes/
, donde archivos de src/main/resources
ahora termina.)
¿Alguna forma simple de hacer esto? Cualquier enfoque estaría bien, por ejemplo, parametrizar "paquete" (de alguna manera) o definir dos tareas/objetivos diferentes (no estoy seguro de la terminología) como "paquete-hsql" y "paquete-pgsql", siempre que funcione y es bastante simple.
Bits relevantes de buildfile
:
load 'dependencies'
require 'buildr/hibernate'
desc "..."
define "foo" do
project.version = VERSION_NUMBER
project.group = GROUP
manifest["Implementation-Vendor"] = COPYRIGHT
compile.with WICKET,GUAVA,GSON, ... [many more libs]
test.with MOCKITO
resources
test.compile.with SERVLET,_('src/main/webapp'),_('src/main/resources')
package(:war).with(:libs=> [WICKET,GUAVA,GSON, ... ])
end
Pregunta extra: Cómo ejecutar un comando arbitrario de shell (usaría algo que involucra, por ejemplo >>
o sed
) ¿En cada uno de los dos casos para hacer cambios en otro archivo de configuración? (También me gustaría "inyectar" algunas configuraciones de DB para applicationContext.xml
de otro archivo; Esto sería preferible mantener dos copias de ese archivo en VCS con contenido en su mayoría idéntico).
Lo siento si esto es demasiado básico; Soy un novato total con Buildr, y realmente no conozco a Ruby. (Y sí, no es una situación óptima usar una herramienta con la que ningún miembro del equipo actual sea competente con ...) Si algo necesita aclarar, ¡por favor, apírtelo!
Solución
La forma habitual de parametrizar una compilación BuildR es con variables de entorno. Entonces, por ejemplo, puede diseñar su compilación para ser ejecutada así:
$ buildr package DATABASE=postgres
En su BuildFile puede tener:
ENV['DATABASE'] ||= 'hsql' # this line makes the default 'hsql'
define "foo" do
# the rest of the definition
resources.enhance do
cp _(:source, :main, :resources, "database-#{ENV['DATABASE']}.properties"), _(:target, :resources, "database.properties")
end
end
Esta es la solución más simple; Una cosa que podría considerar un inconveniente es que copiará a los dos database-*.properties
archivos además de la database.properties
archivo que realmente usará. Si ese es un problema, podría trabajarse a costa de una mayor complejidad.
Respuesta adicional: Puede ejecutar un comando de shell arbitrario usando system
. Por ejemplo, a costa de la subshelling podría haber implementado lo anterior como:
resources.enhance do
system("cp '#{_(:source, :main, :resources, "database-#{ENV['DATABASE']}.properties")}' '#{_(:target, :resources, "database.properties")}'")
end
Si desea inyectar propiedades en un archivo de configuración, es posible que desee mirar a Buildr's filtrar mecanismo.