Comment conditionnellement l'un des deux fichiers dans un package avec .war Builder?

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

  •  10-10-2019
  •  | 
  •  

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!

Était-ce utile?

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 .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top