Groovy: 如何将一个被操作的字符串定义为一个变量?

Groovy: How to define a manipulated string as a variable?

我正在编写 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" 中只用一行就可以达到相同的结果吗?就像上面的例子 artifact_name...

如果你想在 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[1..-1] 而不是 BUILDTYPE.substring(1)

愚蠢的 down/different 解释方式 对于任何想知道如何在一般层面上做到这一点的人:

  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

如果您需要值 appended/prepended,您可以执行
def map = [newString: "some_String"+Label.toUpperCase()]