¿Cómo incluir condicionalmente uno de los dos archivos en un paquete .war con buildr?

StackOverflow https://stackoverflow.com/questions/4449874

  •  10-10-2019
  •  | 
  •  

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!

¿Fue útil?

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.

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