我们使用Buildr将应用程序打包为.war文件。为了进一步简化自动部署过程,我想有条件地选择这两个文件中的一个(来自目录src/main/resources
)...
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。 (是的,使用当前没有团队成员精通的工具并不是最佳情况......)如果需要澄清,请指出来!
答案 0 :(得分: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命令。例如,以替代方式为代价,我可以将上述内容实现为:
resources.enhance do
system("cp '#{_(:source, :main, :resources, "database-#{ENV['DATABASE']}.properties")}' '#{_(:target, :resources, "database.properties")}'")
end
如果您想将属性注入配置文件,您可能需要查看Buildr的filter机制。