在Gradle构建脚本中使用变量

huz*_*yfe 26 groovy gradle

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

task extraStuff{
    doStuff 'org.springframework:spring-web:3.0.6.RELEASE@war'
}
Run Code Online (Sandbox Code Playgroud)

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

springVersion=3.0.6.RELEASE

task extraStuff{
    doStuff 'org.springframework:spring-web:${springVersion}@war'
}
Run Code Online (Sandbox Code Playgroud)

我的问题是spring版本不被识别为变量.那我怎么能把它传递到字符串里呢?

hzi*_*oun 32

如果您正在使用Gradle开发Android应用程序,要声明变量(即保留一些依赖项版本),您应该使用如下关键字:def

def version = '1.2'

dependencies {
  compile "groupId:artifactId:${version}"
}
Run Code Online (Sandbox Code Playgroud)


Giu*_*ero 30

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

  1. 字符串文字的定义完全如下所示,groovy将其用单引号或双引号括起来(例如"3.0.6.RELEASE");
  2. Gstrings如果我没记错的话,不会在单引号字符串中解析(单引号'...'或三引号'''...''');

所以代码将是:

springVersion = '3.0.6.RELEASE' //or with double quotes "..."

task extraStuff{
    doStuff "org.springframework:spring-web:${springVersion}@war"
}
Run Code Online (Sandbox Code Playgroud)

  • 真的。从单引号更改为双引号解决了我的问题 (2认同)

Keb*_*bby 9

在 android 上,实际上有 2 种可能性如何实现这一点。这真的取决于哪个适合您的需求。这两种可能性各有利弊。您可以使用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'
}
Run Code Online (Sandbox Code Playgroud)

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

ext {
    lifecycle = '1.1.1'
}

dependencies {
    implementation 'androidx.lifecycle:lifecycle-extensions:$lifecycle'
}
Run Code Online (Sandbox Code Playgroud)

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"
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以在project_name/app/build.gradle 中使用

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_shared_variable"
}
Run Code Online (Sandbox Code Playgroud)

当然,您可以将它们组合起来。