1

Buildr を使用して、アプリケーションを.warファイルとしてパッケージ化しています。自動展開プロセスをさらに合理化するために、これら 2 つのファイルのいずれかを (ディレクトリから) 条件付きで選択したいと思いますsrc/main/resources...

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

...そして、結果の .war に .war という名前で含めdatabase.propertiesます。(WAR 内の同じ場所、つまりWEB-INF/classes/、今からのファイルがsrc/main/resources終了する場所)。

これを行う簡単な方法はありますか?どのようなアプローチでも問題ありません。たとえば、「パッケージ」をパラメーター化する (何らかの方法で) か、「package-hsql」と「package-pgsql」などの 2 つの異なるタスク/ターゲットを定義する (用語がわかりません)。そして十分に簡単です。

の関連ビット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

おまけの質問:別の構成ファイルを変更するために、2 つのケースのそれぞれで任意のシェル コマンドを実行する方法 (たとえば>>、 またはを含むものを使用します)。sed(また、別のファイルからいくつかのデータベース設定を「注入」したいと思いapplicationContext.xmlます。これは、VCS にそのファイルの 2 つのコピーをほぼ同一の内容で保持するよりも望ましい方法です。)

これが基本的すぎる場合は申し訳ありません。私は Buildr の初心者で、Ruby についてよく知りません。(そして、はい、現在のチームメンバーが熟練していないツールを使用するのは最適な状況ではありません...) 何か明確にする必要がある場合は、指摘してください!

4

1 に答える 1

2

buildr ビルドをパラメーター化する通常の方法は、環境変数を使用することです。たとえば、次のようにビルドを実行するように設計できます。

$ 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ファイルに加えて2 つのファイルがコピーされることです。database.propertiesそれが問題である場合は、もう少し複雑にすることで回避できます。

おまけの答え: を使用して、任意のシェル コマンドを実行できますsystem。たとえば、サブシェル化を犠牲にして、上記を次のように実装できます。

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

プロパティを構成ファイルに挿入したい場合は、Buildr のフィルターメカニズムを確認することをお勧めします。

于 2010-12-15T23:25:00.517 に答える