66

我的一个构建脚本导入了那个 nebula 插件:

plugins {
  id 'nebula.ospackage' version '3.5.0'
}

我一直在将所有版本信息移动到一个单独的文件中,所有项目都可以访问该文件,并且想知道转换为以下内容的正确语法是什么:

plugins {
  id 'nebula.ospackage' version "$versions.nebula_gradle_ospackage_plugin"
}

当我尝试使用“gradle clean build”运行上述内容时,出现以下错误:

构建文件'build.gradle':2:参数列表必须恰好是1个文字非空字符串

有关plugins {} 块的信息,请参阅 https://docs.gradle.org/2.7/userguide/plugins.html#sec:plugins_block

@ 第 2 行,第 33 列。id 'nebula.ospackage' 版本 "$versions.nebula_gradle_ospackage_plugin"

链接的文章显示了如何使用“buildscript”块,它有效,但似乎必须有一种方法可以在一行中完成这项工作?

4

4 回答 4

43

你不能在这里使用变量:

其中 «plugin version» 和 «plugin id» 必须是常量、文字、字符串。不允许有其他陈述;它们的存在会导致编译错误。

于 2016-06-10T13:21:55.470 回答
36

从 Gradle 5.6 开始,您可以在文件中声明您的插件版本,并在块gradle.properties中引用这些属性。plugins

例如gradle.properties文件:</p>

springBootVersion=2.2.0.RELEASE

中的pluginsbuild.gradle

plugins {
    id "org.springframework.boot" version "${springBootVersion}"
}

请参阅:https ://github.com/gradle/gradle/issues/1697#issuecomment-506910915 。

也可以看看:

  1. https://docs.gradle.org/5.6/release-notes.html#central-management-of-plugin-versions-with-settings-script
  2. https://docs.gradle.org/5.6/userguide/plugins.html#sec:plugin_management
于 2019-11-04T10:28:28.507 回答
9

这是一个旧帖子,但错误仍然存​​在,我发现这个帖子正在寻找解决方法。

似乎您已经意识到这一点,并且实际上有BoygeniusDexter 的回答,但我认为这可能会帮助其他人像我一样找到这篇文章。以下解决方法基于Gradle 文档并为我解决了问题:

buildscript {
    ext {
        springBootVersion = '2.0.4.RELEASE'
    }
    repositories {
        jcenter()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

plugins {
    id 'java'
    // and other plugins
    id 'io.spring.dependency-management' version '1.0.6.RELEASE'
}
// but the one with the variable version is applied the old way:
apply plugin: 'org.springframework.boot'

// We can use the variable in dependencies, too:
dependencies {
    compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: springBootVersion
    // ...
}
于 2018-10-04T09:47:56.283 回答
2

概括

  1. plugin从块中省略版本
  2. 移动/指定buildscript.dependencies块中的版本,而不是
  3. 在该块中使用一个变量,该变量是一个const变量

简而言之,plugin块需要字符串文字或属性,而dependency块允许变量。最初的问题要求在“单行”中执行此操作,并且使用这种方法,您的插件块更短,并且所有模块的所有依赖项都位于一个位置。根据您的目标,这可能比“一条龙”做所有事情要好。

完整示例

对于 Android,我可以通过省略plugin块中的版本然后const在 buildscript 依赖项中将其指定为 a 来做到这一点。该块允许变量,而插件块只允许字符串文字。从那里开始,我使用一个对象,buildSrc因为它提供了最大的灵活性,同时将所有模块的所有依赖项信息保存在一个文件中。所以我的设置如下所示:

├── project/
│   ├── build.gradle
|   └── app/
|       └── build.gradle
|   └── buildSrc/
|       └── build.gradle.kts
|       └── src/main/java/com/example/package/Deps.kt

从那里,要在一个地方将任何插件版本指定为变量,app/build.gradle文件会省略版本(以 kotlin 为例,但相同的方法适用于任何插件):

应用程序/build.gradle
plugins {
    id 'kotlin-android' // omit version property here but provide it in buildscript dependencies
    ...
}
...
dependencies {
    ...
    // Dagger
    implementation Deps.Dagger.ANDROID_SUPPORT
    kapt Deps.Dagger.ANDROID_PROCESSOR
    kapt Deps.Dagger.COMPILER
}

然后 buildscript 依赖部分(通常在父build.gradle文件中,但也可以在同一个文件中)提供使用变量的版本!

项目/build.gradle
import com.example.package.Deps // object in the buildSrc folder with all version info
buildscript {
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${Deps.kotlinVersion}"
    }
}

最后,所有版本信息都在 buildSrc 中管理,在 Deps.kt 文件中有一个对象(有很多关于在 Android 项目中使用 buildSrc 的博客文章):

部门.kt
object Deps {
    // For use in the top-level buildscript dependency section which only works with a constant rather than `Deps.Kotlin.version`
    const val kotlinVersion = "1.3.72"

    object Kotlin :             Version(kotlinVersion) {
        val STDLIB =            "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$version"
    }

    object Dagger :             Version("2.25.2") {
        val ANDROID_SUPPORT =   "com.google.dagger:dagger-android-support:$version"
        val ANDROID_PROCESSOR = "com.google.dagger:dagger-android-processor:$version"
        val COMPILER =          "com.google.dagger:dagger-compiler:$version"
    }

}
open class Version(@JvmField val version: String)

总的来说,我真的很喜欢这个设置。它很灵活,所有依赖信息都在一个地方,甚至跨多个模块,最重要的是,它允许在输入依赖项时在 gradle 文件中完成代码!

于 2020-06-01T04:40:20.850 回答