【问题标题】:How gradle task deal with extension objectsgradle 任务如何处理扩展对象
【发布时间】:2017-05-25 05:05:52
【问题描述】:

关于 Bintray-release 插件

我正在使用bintray-release 将我的库上传到 maven。它的文档说明了如何使用它:

使用发布闭包来设置你的包的信息:

publish {
    userOrg = 'novoda'
    groupId = 'com.novoda'
    artifactId = 'bintray-release'
    publishVersion = '0.3.4'
    desc = 'Oh hi, this is a nice description for a project, right?'
    website = 'https://github.com/novoda/bintray-release'
}

最后使用任务bintrayUpload发布

 $ ./gradlew clean build bintrayUpload -PbintrayUser=BINTRAY_USERNAME -PbintrayKey=BINTRAY_KEY -PdryRun=false

就我而言

然后我定义我的publish 闭包:

publish {
    groupId = 'com.uniquestudio'
    artifactId = 'parsingplayer'
    publishVersion = '2.0.6'
    website = 'https://github.com/TedaLIEz/ParsingPlayer'
    Properties properties = new Properties()
    InputStream inputStream = project.rootProject.file('local.properties').newDataInputStream() ;
    properties.load( inputStream )
    bintrayUser = properties.getProperty('bintrayUser')
    bintrayKey = properties.getProperty('bintrayKey')
}

如您所见,出于安全考虑,我将bintrayUser 和bintrayKey 放入local.properties。

我的问题

首先

我知道我可以将bintrayUser 和bintrayKey 放在loacal.properties 和gradle.properties 中。有没有其他方法来存储私有数据,而我认为不适合在当前项目中存储私有数据?

第二

一切正常,但是当我将项目推送到 CI 时,出现错误:

/home/travis/build/TedaLIEz/ParsingPlayer/local.properties(没有这样的文件或目录)

所以我想知道 gradle 任务如何处理扩展对象,在我的情况下,publish 对象。有没有办法解决它?

【问题讨论】:

    标签: android gradle groovy android-gradle-plugin


    【解决方案1】:

    首先,我必须告诉你,不建议通过 StackOverflow 一次问两个问题,主要是因为如果两个答案对你提出的不同问题有帮助,可能很难选择正确的答案。

    无论如何,我会尽力回答你的两个问题:

    首先

    使用附加属性文件(在您的情况下为local.properties)不是 Gradle 方法。它实际上是纯 Java。您应该只在极少数情况下自行读取属性,并且从不在构建脚本中。如果你真的需要一个额外的属性文件,开发一个 Gradle 插件来处理文件访问。

    Gradle 自动读取 gradle.properties 文件,但不仅在项目目录中,而且在用户特定的 gradle 主目录中(例如 C:\Users\*<User>*\.gradle)。这有助于定义私有数据,即使您忘记手动忽略文件,这些数据也不会进入版本控制。任何项目都可以访问定义的数据。

    第二

    好吧,我假设文件 local.properties 不存在,因为您既没有将其置于版本控制之下,也没有让 CI 自动添加它。登录数据应该从哪里来?

    解决方案很简单。只需将所需的数据添加到 CI 用户 gradle 主目录(例如 /home/travis/.gradle)gradle.properties 文件中。这样,您还可以通过输入 CI 用户的登录数据来简单地添加访问权限管理。本地构建将由您的本地用户帐户(如果允许)发布,CI 构建由 CI 系统发布。

    附录

    您的问题包含 Gradle 特定术语“扩展”,但老实说,它与您的问题无关。没错,Gradle 中的大部分配置都是通过所谓的扩展对象完成的,这些对象被添加到 Project 对象中,但它是一个内部术语,你不需要理解它来解决这个问题。

    编辑:评论答案

    现在我可以理解你的困惑了。 Gradle 区分了配置阶段和执行阶段。构建脚本中的几乎所有内容都在配置阶段执行,只有任务操作(任务执行的操作,例如复制、删除...)、doFirst 和 doLast 闭包(基本上是任务) 在执行阶段执行。如果您定义要执行的任务列表(通过命令行),它只影响执行阶段,但您的配置代码将在每次构建时执行,即使只执行一个独立任务之后。

    要解决此问题,请按照 First 块中的解决方案,将您的私有数据添加到用户特定的 Gradle 目录 gradle.properties 文件中。它将被添加到project 对象中,因此可以从构建文件中访问它。但是,由于文件(或数据)在您的 CI 上不存在,因此在 CI 上构建时直接访问它会引发错误。您可以使用findProperty(propertyName) 方法作为访问属性值的故障安全方法。如果属性不存在,则返回null(在配置阶段),所以不会发生错误,只要你不执行bintrayUpload任务(这不是你的目标CI)。

    【讨论】:

    • 我认为它与extension无关。因为我不调用./gradlew bintrayUpload int CI,所以会自动调用publish扩展然后它找不到@987654338 @.
    • @cole:我终于明白你的问题并在答案中添加了解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多