在Gradle构建脚本中使用变量

时间:2016-01-08 11:24:26

标签: groovy gradle

我在项目中使用Gradle。我有一个任务是用我的战争做一些额外的配置。我需要构建一个在我的任务中使用的字符串,比如说,我有:

task extraStuff{
    doStuff 'org.springframework:spring-web:3.0.6.RELEASE@war'
}

这很好用。我需要做的是定义版本(实际上已在属性文件中定义)并在以下任务中使用它:

springVersion=3.0.6.RELEASE

task extraStuff{
    doStuff 'org.springframework:spring-web:${springVersion}@war'
}

我的问题是spring版本不被识别为变量。那么如何在字符串中传递它呢?

3 个答案:

答案 0 :(得分:23)

我认为问题可能出在字符串文字分隔符上:

  1. 字符串文字的定义与groovy完全相同,因此请将其用单引号或双引号括起来(例如"3.0.6.RELEASE");
  2. 如果我没记错的话,
  3. Gstrings不会用单引号字符串解析(单'...'或三'''...'''个);
  4. 所以代码将是:

    springVersion = '3.0.6.RELEASE' //or with double quotes "..."
    
    task extraStuff{
        doStuff "org.springframework:spring-web:${springVersion}@war"
    }
    

答案 1 :(得分:21)

如果您正在使用 Gradle 开发 Android应用,要声明变量(即保留一些依赖版本),您应该使用关键字 { {1}} 如下所示:

def

答案 2 :(得分:0)

在android上,实际上有两种方法可以实现此目的。这取决于您的需求。这两种可能性各有利弊。您可以使用def变量或ext{}块。变量def很棒,因为它可以让您单击该变量,并与文件中未指向该变量的ext{}块相比,准确地指出它在文件中定义的位置。另一方面,ext{}有一个很好的优势,那就是您可以将变量project_name/build.gradle引用到project_name/app/build.gradle,这在某些情况下非常有用,但正如我所说,如果您单击该变量,说仅在一个文件中就不会指出该变量的定义,这很不好,因为如果依赖列表增加,它会花费更多的搜索时间。

1)def选项,这可能是最好的选择,它可以节省您的搜索时间。

def lifecycle = '2.0.0'

dependencies {
    implementation 'androidx.lifecycle:lifecycle-extensions:$lifecycle'
}

2)第二个ext {}块。如果依赖项列表不是很大,还可以。

ext {
    lifecycle = '1.1.1'
}

dependencies {
    implementation 'androidx.lifecycle:lifecycle-extensions:$lifecycle'
}

3)在某些情况下,如果您想在 project_name/build.gradle project_name/app/build.gradle 之间使用ext {} 共享变量>

project_name / build.gradle 中的

您定义kotlin_shared_variable

buildscript {
    ext.kotlin_shared_variable = '1.3.41'

    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_shared_variable"
    }
}
您可以在 project_name / app / build.gradle

中使用的

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_shared_variable"
}

当然可以将它们组合在一起。