web-dev-qa-db-ja.com

Groovy:操作された文字列を変数として定義する方法は?

JenkinsパイプラインをAndroidアプリケーションのコードとして記述しています。

次の文字列があります。

BUILDFLAV = "Staging"
BUILDTYPE = "Debug"

次のようなartifact_nameという別の変数を定義したいと思います。

product_name-BUILDFLAV(in lowercase)-BUILDTYPE(in lowercase).apk

例えば:

App01-staging-debug.apk

私はgroovyに慣れていないので、正しくやっているかどうかはわかりません。

2つの変数を定義しました。

aa = BUILDFLAV[0].toLowerCase()+BUILDFLAV.substring(1)
bb = BUILDTYPE[0].toLowerCase()+BUILDTYPE.substring(1)

これにより、各文字列の最初の文字を大文字から小文字に変更できます。

次に、artifact_name変数を次のようにします。

App01-$(aa}-${bb}.apk

だから私はそのようなことを試しました:

artifact_name = "App01-${BUILDFLAV[0]}.toLowerCase()+${BUILDFLAV}.substring(1)+${BUILDTYPE[0]}.toLowerCase()+${BUILDTYPE}.substring(1).apk"

しかし、それは私にエラーを投げます。

しかし、これを行うことはうまくいきましたが、それを行うよりエレガントな方法があるようです:

BUILDFLAV = "Staging"
BUILDTYPE = "Debug"
aa = BUILDFLAV[0].toLowerCase()+BUILDFLAV.substring(1)
bb = BUILDTYPE[0].toLowerCase()+BUILDTYPE.substring(1)
ARTIFACT_NAME = "App01-${aa}-${bb}.apk"

なぜ最初から小文字で変数を設定しないのかと自問しているのは、ビルドで実行されるgradleタスクが最初の文字の大文字の規則を使用していて、私が達成しようとしていることがより高度なステップに関連しているためですビルドの。

Vars "aa"と "bb"で実行したことを1行で実行しても同じ結果を得ることができますか?上記の例と同様にartifact_name ...

6
Itai Ganot

Groovyの文字列でテンプレートを使用する場合は、すでに行ったように、テンプレートを_${..}_内に配置できます。ただし、実行する必要があるすべてのものをその中に配置する必要があります。

だから使う

_ARTIFACT_NAME = "App01-${BUILDFLAV[0].toLowerCase()}${BUILDFLAV.substring(1).toLowerCase()-${BUILDTYPE[0].toLowerCase()}${BUILDTYPE.substring(1).toLowerCase()}.apk"`
_

ただし、最初の文字を小文字にキャストしてから残りを追加する必要がないことに注意してください。次は同じ結果になります

_`ARTIFACT_NAME = "App01-${BUILDFLAV.toLowerCase()}-${BUILDTYPE.toLowerCase()}.apk"`
_

何らかの理由でとにかくそのようにしたい場合は、BUILDTYPE.substring(1)の代わりに_BUILDTYPE[1..-1]_を使用できます。

10
Rik

一般的なレベルでこれを行う方法を知りたいと思っている人のために Rikの答え を説明するための馬鹿げた/異なる方法:

  1. Groovyスクリプトを介して変数を注入できるプラグインを取得する
  2. _Evaluated Groovy script_フィールドで、_%_のように_%Var%_でラップされた変数を実際の値で次のテキストブロックに置き換えます。

def map = [%New_Var%: %Old_Var%.toUpperCase()]
_return map_

その後、次のようにLinuxで機能していることを確認できます:_echo $New_Var_
Windowsの場合:_echo %New_Var%_

例として、

Labelというパラメータがあり、Helloに設定したとします。

def map = [ucase_Label: Label.toUpperCase()]
_return map_

_echo $ucase_Label_

HELLO

そして、値を追加/追加する必要がある場合は、次のようなことができます:
def map = [newString: "some_String"+Label.toUpperCase()]

2