2010-12-15 5 views
1

Nous utilisons Buildr pour empaqueter une application en tant que fichier .war. Pour simplifier le processus de déploiement automatisé plus loin, je voudrais choisir conditionnellement l'un de ces deux fichiers (à partir du répertoire src/main/resources) ...Comment conditionnellement inclure l'un des deux fichiers dans un package .war avec Buildr?

  • database-hsql.properties
  • database-postgres.properties

... et l'avoir inclus dans le .war résultant avec le nom database.properties. (Au même endroit à l'intérieur de la guerre, à savoir WEB-INF/classes/, où les fichiers de src/main/resources finissent maintenant.)

Un moyen simple de faire cela? Toute approche serait bien — par exemple. paramétrage « package » (en quelque sorte) ou définir deux tâches différentes/cibles (je ne suis pas sûr de la terminologie) tels que « paquet-hsql » & « paquet-pgsql » — aussi longtemps que cela fonctionne et est assez simple.

Bits importants 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 

Bonus question: comment exécuter une commande shell arbitraire (j'utiliser quelque chose qui implique par exemple >> ou sed) dans chacun des deux cas, d'apporter des modifications un autre fichier de configuration? (Je voudrais aussi "injecter" certains paramètres db à applicationContext.xml à partir d'un autre fichier, ce serait préférable de garder deux copies de ce fichier dans VCS avec un contenu presque identique.)

Désolé, c'est trop basique; Je suis un débutant total avec Buildr, et je ne connais pas vraiment Ruby. (Et oui, ce n'est pas une situation optimale d'utiliser un outil dont aucun membre de l'équipe n'est compétent.) Si quelque chose a besoin d'être clarifié, veuillez le signaler!

Répondre

2

La manière habituelle de paramétrer une version buildr est avec des variables d'environnement. Ainsi, par exemple, vous pouvez concevoir votre construction à exécuter comme ceci:

$ buildr package DATABASE=postgres 

Dans votre buildfile vous pourriez alors:

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 

Ceci est la solution la plus simple; Une chose que vous pourriez considérer comme un inconvénient est qu'il va copier les deux fichiers database-*.properties en plus du fichier database.properties que vous utiliserez réellement. Si c'est un problème, cela pourrait se faire au prix d'un peu plus de complexité.

Réponse bonus: Vous pouvez exécuter une commande shell arbitraire à l'aide de system. Par exemple, au prix de subshelling je aurais pu implémenter ce qui précède que:

resources.enhance do 
    system("cp '#{_(:source, :main, :resources, "database-#{ENV['DATABASE']}.properties")}' '#{_(:target, :resources, "database.properties")}'") 
end 

Si vous êtes désireux d'injecter des propriétés dans un fichier de configuration, vous voudrez peut-être regarder mécanisme filter de Buildr.

+0

Super, merci beaucoup! Je l'ai eu en utilisant l'approche "cp". (En ce moment je suis un peu pressé, mais plus tard le cas de bonus (applicationContext.xml) devrait vraiment être nettoyé, peut-être avec le mécanisme de filtre que vous mentionnez ...) – Jonik

Questions connexes