我正在使用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')
}
正如您所看到的,出于安全考虑,我将bintrayUser
和bintrayKey
放入local.properties
。
我知道我可以将bintrayUser
和bintrayKey
放在loacal.properties
和gradle.properties
中。是否还有其他方法来存储私人数据,而我认为不是适合在当前项目中存储私人数据吗?
一切都很好,但当我将项目推送到CI时,我得到错误:
/home/travis/build/TedaLIEz/ParsingPlayer/local.properties(没有这样的文件或目录)
所以我想知道gradle任务如何处理扩展对象,在我的例子中,publish
object。有什么方法可以修复它吗?
答案 0 :(得分:0)
首先,我必须告诉您,不建议通过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特定术语&#39;扩展&#39;但是,说实话,它与您的问题无关。这是正确的,Gradle中的大多数配置都是通过所谓的扩展对象完成的,这些扩展对象被添加到Project
对象中,但它是一个内部术语,您不需要了解它来解决这个问题。 / p>
现在我能理解你的困惑。 Gradle区分配置阶段和执行阶段。构建脚本中的几乎所有内容都在配置阶段期间执行,只有任务操作(任务执行的操作,例如复制,删除......),doFirst
和doLast
关闭(所以基本上是任务)在执行阶段期间执行。如果您定义要执行的任务列表(通过命令行),它只会影响执行阶段,但您的配置代码将在每次构建时执行,即使只执行一个独立任务之后。
要解决此问题,请按照第一个块中的解决方案,将您的私有数据添加到用户特定的Gradle目录gradle.properties
文件中。它将被添加到project
对象中,因此可以从构建文件中访问它。但是,由于CI上不存在文件(或数据),因此在构建CI时直接访问它会引发错误。您可以使用findProperty(propertyName)
方法作为访问属性值的故障安全方法。如果该属性不存在,则返回null
(在配置阶段中),因此不会发生错误,只要您不执行bintrayUpload
任务(即不是CI的目标。)