1

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

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

...并将其包含在名为 .war 的结果中database.properties。(在 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 命令(我会使用涉及例如>>or的东西sed)来更改另一个配置文件?(我还想applicationContext.xml从另一个文件“注入”一些 db 设置;这比在 VCS 中保留该文件的两个副本具有基本相同的内容更好。)

对不起,如果这太基本了;我是 Buildr 的新手,并不真正了解 Ruby。(是的,使用当前团队成员都不精通的工具并不是最佳情况……)如果有任何需要澄清的地方,请指出!

4

1 回答 1

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. 例如,以 subshel​​ling 为代价,我可以将上述实现为:

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

如果您想将属性注入配置文件,您可能需要查看 Buildr 的过滤器机制。

于 2010-12-15T23:25:00.517 回答