【问题标题】:Using variables in Gradle build script在 Gradle 构建脚本中使用变量
【发布时间】:2016-04-13 01:39:29
【问题描述】:

我在我的项目中使用 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 版本不被识别为变量。那么如何在字符串中传递呢?

【问题讨论】:

  • 别忘了,你也可以破解:doStuff group: 'org.springframework', name: 'spring-web', version: ${springVersion}, ext: 'war'
  • 别忘了,你也可以把${spingVersion}中的括号{}去掉:doStuff group: 'org.springframework', name: 'spring-web', version: $springVersion, ext: 'war'

标签: groovy gradle


【解决方案1】:

如果您正在使用 Gradle 开发一个 Android 应用程序,要声明一个变量(即持有一个依赖版本),您需要使用关键字 @987654321 @ 如下:

def version = '1.2'

dependencies {
  compile "groupId:artifactId:${version}"
}

希望有所帮助!

【讨论】:

    【解决方案2】:

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

    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"
    }
    

    【讨论】:

    • 是的。从单引号更改为双引号解决了我的问题
    【解决方案3】:

    在 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'
    }
    

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

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

    3) 在某些情况下,如果您想在 project_name/build.gradle project_name/app/build.gradle 使用分机{}

    之间共享变量>

    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"
    }
    

    当然你也可以把它们组合起来。

    【讨论】:

    • 所以,ext{} 选项有效,但我无法使用-Plifecycle=2.0.0 命令行标志覆盖该属性。我见过的唯一方法是在gradle.properties 中提供该属性。这是推荐的方法吗?
    【解决方案4】:

    here

    如果没有插值表达式,双引号字符串是纯 java.lang.String,但如果存在插值,则为 groovy.lang.GString 实例。

    Gradle 使用 Groovy 作为 DSL。这里“${springVersion}”是占位符,你要的是插值,所以你应该使用双引号,只有GString中的双引号才有插值的能力。

    【讨论】:

      猜你喜欢
      • 2016-12-23
      • 2014-12-06
      • 1970-01-01
      • 2016-01-25
      • 2015-05-04
      • 2014-07-31
      • 1970-01-01
      • 2018-10-03
      • 1970-01-01
      相关资源
      最近更新 更多