私はレコをプルダウンし、いくつかの仕様を実行し、すべてが合格すると宝石を作ります。Ruby 1.9.1-p243 - 実行時に更新されるgemspecを使用して宝石を構築する
gemspecファイルには元のリポジトリのチェックアウトが付属していますので、ジェムが構築されるたびに(つまり、タスクの実行時に)バージョンをバンプしたいと思います。 Gem :: Specification.loadは、nilを返すだけなので、gemspecの属性を操作することはできません。私がこれまでにこれを行うために考え出した唯一の方法は、一時的なgemspecを作成し、バージョンラインを私が望むものに置き換え、mvを現在のgemspecに置き換えることです。
ただし、プロセスが終了するまでファイルは更新されません。パスとファイルは名目上は存在しますが、ファイル自体にコンテンツはありません。ただ空白です。 irbでテストすると、セッションを終了した後にgemspecの内容が表示されます。ここで
は、宝石の建物のためのrakeタスクです:
desc "Build new vulnerability tests gem"
task :build_gem do
Process.fork { update_gemspec_version 'foo.gemspec' }
gemspec = Gem::Specification.load('foo.gemspec')
builder = Gem::Builder.new(gemspec)
puts "Building gem from #{gemspec.file_name}"
builder.build
end
(あなたが見ることができる、私は方法を実行するためのプロセスをフォークしても問題が解決するだろうと思ったが、それはただの宝石とのdidnを構築するために、元のgemspecを使用しました「T rakeタスクが完了するまで、何も更新)
そしてupdate_gemspec_versionヘルパーメソッド:。
def update_gemspec_version(gemspec)
temp_file = Tempfile.new "#{gemspec}"
time = Time.now
minor_rev = 0
base = time.year.to_s + '.' + time.month.to_s + '.' + time.day.to_s
File.open("#{gemspec}", 'r') do |file|
file.each do |line|
if line =~ /^\s*s\.version\s=\s'(\d+\.\d+\.\d+\.(\d+))'$/
if $1 >= base + '.' + minor_rev.to_s
while minor_rev <= $2.to_i
minor_rev += 1
end
replacement = line.gsub($1, base + '.' + minor_rev.to_s)
puts replacement
temp_file.puts replacement
else
replacement = line.gsub($1, base + '.' + minor_rev.to_s)
puts replacement
temp_file.puts replacement
end
else
temp_file.puts line
end
end
end
FileUtils.mv(temp_file.path, File.expand_path("#{gemspec}"))
nil
end
私はすべてが間違っているこのついて行くだろうか?
あなたが知っていることは以前...私はirbでそれをテストしていましたが、それはゼロに戻りましたが、今は間違いなく正しく編集しました。私はそれがヘルパーメソッドで働いているのを見たはずです。とにかく、ありがとう。物事をもっときれいにする必要があります。 –