Comment conditionnellement l'un des deux fichiers dans un package avec .war Builder?
Question
Nous utilisons Buildr pour emballer 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
) ...
-
database-hsql.properties
-
database-postgres.properties
... et l'ont inclus dans le .war résultant avec le nom database.properties
. (Au même endroit dans la guerre, à savoir WEB-INF/classes/
, où les fichiers de src/main/resources
finissent maintenant.)
De toute façon simple de le faire? Toute approche serait bien - par exemple paramétrage « package » (en quelque sorte) ou définir deux tâches / cibles différentes (je ne suis pas sûr de la terminologie) comme « paquet-hsql » et « paquet-pgsql. » - aussi longtemps que cela fonctionne et est assez simple
les bits pertinents 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
Question bonus : 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 vouloir « injecter » certains paramètres db à applicationContext.xml
d'un autre fichier, ce qui serait préférable de conserver deux copies de ce fichier dans VCS avec un contenu essentiellement identique.)
Désolé si cela est trop basique; Je suis un débutant total avec Buildr, et je ne sais pas vraiment Ruby. (Et oui, ce n'est pas une situation optimale pour utiliser un outil qu'aucun membre de l'équipe actuelle est compétent avec ...) Si quelque chose doit clarifier, s'il vous plaît le signaler!
La solution
La façon 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 fichier de construction, alors vous pourriez avoir:
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 envisager un inconvénient est qu'il copiera les deux fichiers database-*.properties
en plus du fichier database.properties
que vous allez vraiment utiliser. Si c'est un problème, il pourrait être contourné au prix d'une plus grande complexité.
Réponse Bonus : Vous pouvez exécuter une commande shell arbitraire en utilisant system
. Par exemple, au prix de subshelling je aurais pu implémenter ci-dessus comme:
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 de Buildr de filtre mécanisme .