同様の要件がありました。/project/properties ノードの下のプロパティを更新するだけでなく、/project/profiles/properties ノードの下のプロパティも更新する必要があるため、両方のケースの更新をサポートするように Esko のスクリプトを変更します。一方、1 つのコマンドで複数のプロパティを更新することもサポートしているため、同じ pom.xml で複数のプロパティを更新する必要がある場合でも、複数回実行する必要はありません。
#!/usr/bin/env ruby
require 'rexml/document'
def change_profile_property(pom, profile_id, key, value)
property = pom.elements["/project/profiles/profile[id='#{profile_id}']/properties/#{key}"]
if property != nil
puts " #{profile_id}-#{key}: #{property.text} -> #{value}"
property.text = value
end
end
def change_property(pom, key, value)
property = pom.elements["/project/properties/#{key}"]
if property != nil
puts " #{key}: #{property.text} -> #{value}"
property.text = value
end
end
if ARGV.length == 0
puts "Usage: #{$0} KEY=VALUE [-profile <profile id>] KEY=VALUE"
exit 1
end
# parse the command line argument to get the key/value
global_properties = Array.new
profile_properties= Array.new
profile = nil
loop { case ARGV[0]
when '-profile' then ARGV.shift; profile=ARGV.shift
when nil then break
else
kv_str = ARGV.shift
if profile == nil
global_properties.push(kv_str)
else
profile_properties.push(kv_str)
end
end;
}
Dir.glob("**/pom.xml") { |pom_path|
puts pom_path
pom = REXML::Document.new(File.new(pom_path))
pom.context[:attribute_quote] = :quote
# updating the global properties
if global_properties.length != 0
for kv in global_properties
kv_array = kv.split('=')
if kv_array.length == 2
change_property(pom, kv_array[0], kv_array[1])
end
end
end
# updating the properties in profile
if profile_properties.length != 0
for kv in profile_properties
kv_array = kv.split('=')
if kv_array.length == 2
if profile != nil
change_profile_property(pom, profile, kv_array[0], kv_array[1])
end
end
end
end
File.open(pom_path, 'wb') { |file|
pom.write(file)
}
puts
}