gradle任务如何处理扩展对象

时间:2017-05-25 05:05:53

标签: android gradle groovy android-gradle

关于Bintray-release插件

我正在使用bintray-release将我的库上传到maven.Its doc说明如何使用它:

  

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

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

正如您所看到的,出于安全考虑,我将bintrayUserbintrayKey放入local.properties

我的问题

第一

我知道我可以将bintrayUserbintrayKey放在loacal.propertiesgradle.properties中。是否还有其他方法来存储私人数据,而我认为不是适合在当前项目中存储私人数据吗?

第二

一切都很好,但当我将项目推送到CI时,我得到错误:

  

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

所以我想知道gradle任务如何处理扩展对象,在我的例子中,publish object。有什么方法可以修复它吗?

1 个答案:

答案 0 :(得分:0)

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

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

第一

使用其他属性文件(在您的情况下为local.properties)不是Gradle方法。它实际上是纯Java。您应该只在极少数情况下自己阅读属性,在构建脚本中只能从不。如果您确实需要其他属性文件,请开发一个处理文件访问的Gradle插件。

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

第二

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

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

附录

您的问题包括Gradle特定术语&#39;扩展&#39;但是,说实话,它与您的问题无关。这是正确的,Gradle中的大多数配置都是通过所谓的扩展对象完成的,这些扩展对象被添加到Project对象中,但它是一个内部术语,您不需要了解它来解决这个问题。 / p>

编辑:评论答案

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

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