2010-12-15 34 views
1

我们使用Buildr将应用程序打包为.war文件。为了进一步精简自动部署过程中,我想有条件地选择这两个文件(从目录src/main/resources)中的一个......如何有条件地使用Buildr在.war包中包含两个文件之一?

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

...和将它包含在名为database.properties的.war中。 (在WAR内部的相同位置,即WEB-INF/classes/,其中src/main/resources的文件现在结束。)

任何简单的方法来做到这一点?任何方法都可以,例如—,例如参数化“程序包”(以某种方式)或定义两个不同的任务/目标(我不确定该术语),例如“package-hsql”&“package-pgsql”—,只要它有效且足够简单。的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 

奖金的问题:如何执行任意的shell命令(我会使用涉及如>>sed东西)在每个两种情况更改另一个配置文件? (我也想从另一个文件“注入”applicationContext.xml的一些数据库设置;这比将VCS中的两个副本保留在大多数相同的内容中更可取)。我是一个Buildr的新手,并不了解Ruby。 (是的,使用一种当前团队成员无法熟练使用的工具不是最佳状态......)如果需要澄清,请指出!

回答

2

参数化构建器构建的常用方法是使用环境变量。因此,例如,你可能设计你的构建中,像这样被执行:

$ buildr package DATABASE=postgres 

在你的构建文件,你可能会然后让:

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 

这是最简单的解决方案;有一件事你可能会考虑一个缺点,那就是它会复制除你实际使用的database.properties文件之外的两个database-*.properties文件。如果这是一个问题,它可能会以更复杂的代价来解决。

奖励答案:您可以使用system执行任意shell命令。例如,在subshel​​ling的费用我可能已经实现了上面:

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

如果你是想注入性能到配置文件,您可能想看看Buildr的filter机制。

+0

太好了,非常感谢!我使用“cp”方法得到了它的工作。 (现在我有点匆忙,但后来的奖金案例(applicationContext.xml)确实应该清理干净,或许使用您提到的过滤机制......) – Jonik 2010-12-16 10:00:54

相关问题