1

私はRuby開発者ではありませんが、1行のRubyスクリプトを使用して、Jenkinsで構築しているGrailsアプリケーションの3部構成のバージョン番号をインクリメントしようとしています。バージョン番号は、application.propertiesという単純なプロパティファイルに保存されます。これを行う方法はたくさんあることは知っていますが、ここでの私の質問はRubyに固有のものであり、なぜそれが機能しないのかということです。

テストのために、application.propertiesを1行に減らしました。

app.version=0.2.8

私がやりたいのは、最後の数を増やすことだけです。それでおしまい。それで、私はいくつかのコードをオンラインで見つけて、それを少しハックしました:

ruby -pi.bak -e 'sub(/^app\.version=(\d+)\.(\d+)\.(-?\d+)/) { "app.version=#{$1}.#{$2}.#{$3.to_i.next}" }' application.properties

このコードは、OSXのRuby1.8.7では完全に機能しますが、LinuxのRuby1.9.3では失敗します。

-e:1:in `sub': wrong number of arguments (1 for 1..2) (ArgumentError)
    from -e:1:in `sub'
    from -e:1:in `<main>'

この式は、文字列リテラルに直接適用された場合、Linuxで機能することに注意してください。

ruby -e 'puts "app.version=0.2.8".sub(/^app\.version=(\d+)\.(\d+)\.(-?\d+)/) { "app.version=#{$1}.#{$2}.#{$3.to_i.next}" }'

私もgsubを試しましたが、それも機能しませんでした(ただし別の理由で)。

ここで簡単なものが欠けているに違いありません。sub()でクロージャーを使用して他の例を試しましたが、正常に機能しているようです。

4

2 に答える 2

1

BernardKがRubyのすべてのバージョンが-pを同じように扱うわけではなく、私のコードが文字列リテラルに適用されたときに機能することを示唆したので、ここに1.8.7と1.9.3の両方で機能するソリューションがあります。incAppVersion.rbというファイルを作成します。

if $_ =~ /^\s*app\.version\s*=/
    print $_.sub(/(\d+)\.(\d+)\.(-?\d+)/) { "#{$1}.#{$2}.#{$3.to_i.next}" }
else
    print $_
end

そしてそれを実行します:

ruby -ni.bak incAppVer.rb application.properties 

-nかっこいい!

改善のための提案をお気軽に提供してください。

于 2012-12-30T12:31:40.277 に答える
0
$ ruby -pi.bak -e'$_.chomp!; $_ = $_[0..-2] + $_[-1, 1].succ + "\n" if $_[0..11] == "app.version="' application.properties

Pickaxe(*)が-pについて説明しているように、プログラムコードをループ内に配置します while gets; ...; print; end

gets読み取ったばかりの行を。に入れ$_ます。
chomp!CRLFを削除します。
print引数なしで出力$_されるため、$ _を変更する必要があります:$_ = ...
$_[0..-2]最後の文字が最後の文字であることを除いて入力行
$_[-1, 1]です。長さ1(Ruby 1.8では数字ではなく文字を取得するために必要)
$_[-1, 1].succが次に
+ "\n"置く文字/数字ですCRLFを再度実行して(Windowsでは「\ r \ n」に変更)
if $_[0..11] == "app.version="、目的のプロパティのみを処理します

$ ruby -v
ruby 1.9.2p320 (2012-04-20 revision 35421) [x86_64-darwin12.2.0]

OSXMLでテスト済み。
前のファイル:

app.version=0.2.8
line2

2回の実行後のファイル:

app.version=0.2.10
line2

(*)http://pragprog.com/book/ruby3/programming-ruby-1-9

于 2012-12-28T23:05:49.050 に答える