Come includere condizionalmente uno dei due file in un pacchetto .war con Buildr?
Domanda
Stiamo usando Buildr per confezionare un'applicazione come href="http://en.wikipedia.org/wiki/WAR_%28Sun_file_format%29" rel="nofollow"> file di . Per semplificare ulteriormente il processo di distribuzione automatica, vorrei selezionare condizionalmente uno di questi due file (dalla directory src/main/resources
) ...
-
database-hsql.properties
-
database-postgres.properties
... e lo hanno incluso nella .war risultante con il nome database.properties
. (Nello stesso luogo all'interno del WAR, cioè WEB-INF/classes/
, in cui i file da src/main/resources
ora finiscono.)
Un modo semplice per fare questo? Qualsiasi approccio sarebbe bene - per esempio parametrizzazione "pacchetto" (in qualche modo) oppure definendo due compiti / obiettivi differenti (non sono sicuro della terminologia), come "pacchetto-hsql" e "pacchetto-pgsql" -. fintanto che funziona ed è abbastanza semplice
bit rilevanti di 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
Domanda bonus : come eseguire un comando arbitrario guscio (userei qualcosa che coinvolgono ad esempio >>
o sed
) in ciascuno dei due casi di apportare modifiche a un altro file di configurazione? (Mi piacerebbe anche voglia di "iniettare" alcune impostazioni db a applicationContext.xml
da un altro file, questo sarebbe preferibile mantenere due copie di quel file in VCS con i contenuti per lo più identici.)
Scusate se questo è troppo di base; Sono un newbie totale con Buildr, e non so davvero Ruby. (E sì, non è una situazione ottimale per essere utilizzando uno strumento che nessun membro del team corrente è abile con ...) Se bisogno di qualcosa per chiarire, si prega di indicarlo!
Soluzione
Il solito modo di parametrizzare un accumulo Buildr è con le variabili di ambiente. Così, per esempio, si potrebbe progettare la build da eseguire in questo modo:
$ buildr package DATABASE=postgres
Nel vostro BuildFile si potrebbe quindi avere:
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
Questa è la soluzione più semplice; una cosa che si potrebbe prendere in considerazione un inconveniente è che copierà i due file database-*.properties
in aggiunta al file database.properties
che ci troveremo a utilizzare. Se questo è un problema che potrebbe essere risolto a costo di un po 'di complessità.
risposta Bonus : È possibile eseguire un comando arbitrario shell, usando system
. Per esempio, a costo di subshelling avrei potuto implementato quanto sopra come:
resources.enhance do
system("cp '#{_(:source, :main, :resources, "database-#{ENV['DATABASE']}.properties")}' '#{_(:target, :resources, "database.properties")}'")
end
Se si vogliono iniettare proprietà in un file di configurazione, si potrebbe desiderare di guardare di Buildr meccanismo .