我是juste 在我的项目中添加了一些flavors
(或者productFlavors
如果你想要的话).
事实是,当我将库发布到bintray时,所有的风格都被上传(这很棒),但我无法使用它们.使用该插件是官方的一个在这里.
上传的aar:
androidsdk-0.0.4-fullRelease.aar androidsdk-0.0.4-fullDebug.aar androidsdk-0.0.4-lightRelease.aar androidsdk-0.0.4-lightDebug.aar
如您所知,它fullRelease
被命名为classifier
,参见文档章节23.4.1.3.
我正在寻找一种解决方案来选择我要上传的口味.
我已经看过bintray的例子(这里和这里)和这个,还有其他例子,但我仍然卡住了.
这是我目前的脚本:
apply plugin: 'com.android.library' apply plugin: 'com.github.dcendents.android-maven' apply plugin: 'com.jfrog.bintray' buildscript { repositories { jcenter() } } android { compileSdkVersion 23 buildToolsVersion "23.0.1" defaultConfig { minSdkVersion 9 targetSdkVersion 23 versionCode 64 versionName "0.0.4" } publishNonDefault true productFlavors { full { } light { } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.android.support:recyclerview-v7:23.1.1' fullCompile 'com.squareup.picasso:picasso:2.5.0' } version = android.defaultConfig.versionName uploadArchives { repositories.mavenDeployer { pom.project { packaging 'aar' } } } //////////////////////////////// // Bintray Upload configuration Properties properties = new Properties() properties.load(project.rootProject.file('local.properties').newDataInputStream()) bintray { user = properties.getProperty("bintray.user") key = properties.getProperty("bintray.apikey") configurations = ['archives'] pkg { repo = "MyRepo" // repo name userOrg = 'hugo' name = "AndroidSDK" // Package name websiteUrl = siteUrl vcsUrl = gitUrl publish = true } }
要导入我正在使用的库:
compile ('com.example.lib:sdk:0.0.8:fullRelease@aar') { transitive = true; }
Louis CAD.. 12
我面临同样的挑战,这是我能做的最好的事情:
使用mavenPublications
bintray maven-publish
插件中的gradle插件,您可以将任何变体发布到mavenLocal和bintray.
这是publish.gradle
我在我想要发布的所有项目库模块末尾应用的文件:
def pomConfig = { licenses { license { name 'The Apache Software License, Version 2.0' url 'http://www.apache.org/licenses/LICENSE-2.0.txt' } } developers { developer { id 'louiscad' name 'Louis CAD' email 'louis.cognault@gmail.com' } } scm { connection 'https://github.com/LouisCAD/Splitties.git' developerConnection 'https://github.com/LouisCAD/Splitties.git' url siteUrl } } def publicationNames = [] publishing.publications { android.libraryVariants.all { variant -> if (variant.buildType.name == "debug") return // Prevents publishing debug library def flavored = !variant.flavorName.isEmpty() /** * Translates "_" in flavor names to "-" for artifactIds, because "-" in flavor name is an * illegal character, but is well used in artifactId names. */ def variantArtifactId = flavored ? variant.flavorName.replace('_', '-') : project.name /** * If the javadoc destinationDir wasn't changed per flavor, the libraryVariants would * overwrite the javaDoc as all variants would write in the same directory * before the last javadoc jar would have been built, which would cause the last javadoc * jar to include classes from other flavors that it doesn't include. * * Yes, tricky. * * Note that "${buildDir}/docs/javadoc" is the default javadoc destinationDir. */ def javaDocDestDir = file("${buildDir}/docs/javadoc ${flavored ? variantArtifactId : ""}") /** * Includes */ def sourceDirs = variant.sourceSets.collect { it.javaDirectories // Also includes kotlin sources if any. } def javadoc = task("${variant.name}Javadoc", type: Javadoc) { description "Generates Javadoc for ${variant.name}." source = variant.javaCompile.source // Yes, javaCompile is deprecated, // but I didn't find any working alternative. Please, tweet @Louis_CAD if you find one. destinationDir = javaDocDestDir classpath += files(android.getBootClasspath().join(File.pathSeparator)) classpath += files(configurations.compile) options.links("http://docs.oracle.com/javase/7/docs/api/"); options.links("http://d.android.com/reference/"); exclude '**/BuildConfig.java' exclude '**/R.java' failOnError false } def javadocJar = task("${variant.name}JavadocJar", type: Jar, dependsOn: javadoc) { description "Puts Javadoc for ${variant.name} in a jar." classifier = 'javadoc' from javadoc.destinationDir } def sourcesJar = task("${variant.name}SourcesJar", type: Jar) { description "Puts sources for ${variant.name} in a jar." from sourceDirs classifier = 'sources' } def publicationName = "splitties${variant.name.capitalize()}Library" publicationNames.add(publicationName) "$publicationName"(MavenPublication) { artifactId variantArtifactId group groupId version libraryVersion artifact variant.outputs[0].packageLibrary // This is the aar library artifact sourcesJar artifact javadocJar pom { packaging 'aar' withXml { def root = asNode() root.appendNode("name", 'Splitties') root.appendNode("url", siteUrl) root.children().last() + pomConfig def depsNode = root["dependencies"][0] ?: root.appendNode("dependencies") def addDep = { if (it.group == null) return // Avoid empty dependency nodes def dependencyNode = depsNode.appendNode('dependency') dependencyNode.appendNode('groupId', it.group) dependencyNode.appendNode('artifactId', it.name) dependencyNode.appendNode('version', it.version) if (it.hasProperty('optional') && it.optional) { dependencyNode.appendNode('optional', 'true') } } // Add deps that everyone has configurations.compile.allDependencies.each addDep // Add flavor specific deps if (flavored) { configurations["${variant.flavorName}Compile"].allDependencies.each addDep } // NOTE: This library doesn't use builtTypes specific dependencies, so no need to add them. } } } } } group = groupId version = libraryVersion afterEvaluate { bintray { user = bintray_user key = bintray_api_key publications = publicationNames override = true pkg { repo = 'splitties' name = project.name desc = libraryDesc websiteUrl = siteUrl issueTrackerUrl = 'https://github.com/LouisCAD/Splitties/issues' vcsUrl = gitUrl licenses = ['Apache-2.0'] labels = ['aar', 'android'] publicDownloadNumbers = true githubRepo = 'LouisCAD/Splitties' } } }
为了使其工作,我需要定义bintray_user
和bintray_api_key
属性.我个人只是将它们放在我的~/.gradle/gradle.properties
文件中,如下所示:
bintray_user=my_bintray_user_name bintray_api_key=my_private_bintray_api_key
我还需要publish.gradle
在我的根项目文件中定义我在文件中使用的以下ext属性build.gradle
:
allprojects { ... ext { ... // Libraries groupId = "xyz.louiscad.splitties" libraryVersion = "1.2.1" siteUrl = 'https://github.com/LouisCAD/Splitties' gitUrl = 'https://github.com/LouisCAD/Splitties.git' } }
现在,我终于可以在我的android库模块中使用它,我有多个productFlavors
.这是可发布的库模块build.gradle
文件的片段:
plugins { id "com.jfrog.bintray" version "1.7.3" // Enables publishing to bintray id "com.github.dcendents.android-maven" version "1.5" // Allows aar in mavenPublications } apply plugin: 'com.android.library' apply plugin: 'maven-publish' // Used for mavenPublications android { ... defaultPublishConfig "myLibraryDebug" // Allows using this library in another // module in this project without publishing to mavenLocal or Bintray. // Useful for debug purposes, or for your library's sample app. defaultConfig { ... versionName libraryVersion ... } ... productFlavors { myLibrary myLibrary_logged // Here, the "_" will be replaced "-" in artifactId when publishing. myOtherLibraryFlavor } ... } dependencies { ... // Timber, a log utility. myLibrary_loggedCompile "com.jakewharton.timber:timber:${timberVersion}"; // Just an example } ... ext { libraryDesc = "Delegates for kotlin on android that check UI thread" } apply from: '../publish.gradle' // Makes this library publishable
当您正确地使用所有这些设置时,使用您的库的名称而不是我的(您可以将其用作示例),您可以尝试通过首先发布到mavenLocal来发布您的风味库的版本.为此,请运行以下命令:
myLibrary $ ../gradlew publishToMavenLocal
然后,您可以尝试添加mavenLocal
应用程序的存储库(此处为示例)并尝试将库添加为依赖项(artifactId应为flavor名称,"_"替换为" - ")并构建它.您还可以使用文件资源管理器(在Finder中使用cmd + shift + G来访问隐藏文件夹)~/.m2
查看目录并查找您的库.
什么时候发布到bintray/jcenter,你只需要运行这个命令:
myLibrary $ ../gradlew bintrayUpload
重要:
在将库发布到mavenLocal,Bintray或其他maven存储库之前,您通常需要针对使用该库的示例应用程序尝试使用您的库.这个示例应用程序应该是同一个项目中的另一个模块,只需要具有项目依赖性,它应该如下所示:compile project(':myLibrary')
.但是,由于您的库有多个productFlavor,因此您需要测试所有这些.不幸的是,目前无法从示例应用程序的build.gradle
文件中指定要使用的配置(除非您publishNonDefault true
在库的build.gradle
文件中使用,这会破坏maven和bintray出版物),但您可以在库中指定默认配置(即buildVariant)模块如此:defaultPublishConfig "myLibraryDebug"
在android
闭包中.您可以在Android Studio的"Build Variants"工具Windows中查看库的可用构建变体.
如果您需要一个例子,请随意浏览我的图书馆"Splitties".风味模块已命名concurrency
,但我也将我的脚本用于无味的库模块,并且我在项目中的所有库模块上进行了全面测试.
如果您需要帮助,可以联系我.
我面临同样的挑战,这是我能做的最好的事情:
使用mavenPublications
bintray maven-publish
插件中的gradle插件,您可以将任何变体发布到mavenLocal和bintray.
这是publish.gradle
我在我想要发布的所有项目库模块末尾应用的文件:
def pomConfig = { licenses { license { name 'The Apache Software License, Version 2.0' url 'http://www.apache.org/licenses/LICENSE-2.0.txt' } } developers { developer { id 'louiscad' name 'Louis CAD' email 'louis.cognault@gmail.com' } } scm { connection 'https://github.com/LouisCAD/Splitties.git' developerConnection 'https://github.com/LouisCAD/Splitties.git' url siteUrl } } def publicationNames = [] publishing.publications { android.libraryVariants.all { variant -> if (variant.buildType.name == "debug") return // Prevents publishing debug library def flavored = !variant.flavorName.isEmpty() /** * Translates "_" in flavor names to "-" for artifactIds, because "-" in flavor name is an * illegal character, but is well used in artifactId names. */ def variantArtifactId = flavored ? variant.flavorName.replace('_', '-') : project.name /** * If the javadoc destinationDir wasn't changed per flavor, the libraryVariants would * overwrite the javaDoc as all variants would write in the same directory * before the last javadoc jar would have been built, which would cause the last javadoc * jar to include classes from other flavors that it doesn't include. * * Yes, tricky. * * Note that "${buildDir}/docs/javadoc" is the default javadoc destinationDir. */ def javaDocDestDir = file("${buildDir}/docs/javadoc ${flavored ? variantArtifactId : ""}") /** * Includes */ def sourceDirs = variant.sourceSets.collect { it.javaDirectories // Also includes kotlin sources if any. } def javadoc = task("${variant.name}Javadoc", type: Javadoc) { description "Generates Javadoc for ${variant.name}." source = variant.javaCompile.source // Yes, javaCompile is deprecated, // but I didn't find any working alternative. Please, tweet @Louis_CAD if you find one. destinationDir = javaDocDestDir classpath += files(android.getBootClasspath().join(File.pathSeparator)) classpath += files(configurations.compile) options.links("http://docs.oracle.com/javase/7/docs/api/"); options.links("http://d.android.com/reference/"); exclude '**/BuildConfig.java' exclude '**/R.java' failOnError false } def javadocJar = task("${variant.name}JavadocJar", type: Jar, dependsOn: javadoc) { description "Puts Javadoc for ${variant.name} in a jar." classifier = 'javadoc' from javadoc.destinationDir } def sourcesJar = task("${variant.name}SourcesJar", type: Jar) { description "Puts sources for ${variant.name} in a jar." from sourceDirs classifier = 'sources' } def publicationName = "splitties${variant.name.capitalize()}Library" publicationNames.add(publicationName) "$publicationName"(MavenPublication) { artifactId variantArtifactId group groupId version libraryVersion artifact variant.outputs[0].packageLibrary // This is the aar library artifact sourcesJar artifact javadocJar pom { packaging 'aar' withXml { def root = asNode() root.appendNode("name", 'Splitties') root.appendNode("url", siteUrl) root.children().last() + pomConfig def depsNode = root["dependencies"][0] ?: root.appendNode("dependencies") def addDep = { if (it.group == null) return // Avoid empty dependency nodes def dependencyNode = depsNode.appendNode('dependency') dependencyNode.appendNode('groupId', it.group) dependencyNode.appendNode('artifactId', it.name) dependencyNode.appendNode('version', it.version) if (it.hasProperty('optional') && it.optional) { dependencyNode.appendNode('optional', 'true') } } // Add deps that everyone has configurations.compile.allDependencies.each addDep // Add flavor specific deps if (flavored) { configurations["${variant.flavorName}Compile"].allDependencies.each addDep } // NOTE: This library doesn't use builtTypes specific dependencies, so no need to add them. } } } } } group = groupId version = libraryVersion afterEvaluate { bintray { user = bintray_user key = bintray_api_key publications = publicationNames override = true pkg { repo = 'splitties' name = project.name desc = libraryDesc websiteUrl = siteUrl issueTrackerUrl = 'https://github.com/LouisCAD/Splitties/issues' vcsUrl = gitUrl licenses = ['Apache-2.0'] labels = ['aar', 'android'] publicDownloadNumbers = true githubRepo = 'LouisCAD/Splitties' } } }
为了使其工作,我需要定义bintray_user
和bintray_api_key
属性.我个人只是将它们放在我的~/.gradle/gradle.properties
文件中,如下所示:
bintray_user=my_bintray_user_name bintray_api_key=my_private_bintray_api_key
我还需要publish.gradle
在我的根项目文件中定义我在文件中使用的以下ext属性build.gradle
:
allprojects { ... ext { ... // Libraries groupId = "xyz.louiscad.splitties" libraryVersion = "1.2.1" siteUrl = 'https://github.com/LouisCAD/Splitties' gitUrl = 'https://github.com/LouisCAD/Splitties.git' } }
现在,我终于可以在我的android库模块中使用它,我有多个productFlavors
.这是可发布的库模块build.gradle
文件的片段:
plugins { id "com.jfrog.bintray" version "1.7.3" // Enables publishing to bintray id "com.github.dcendents.android-maven" version "1.5" // Allows aar in mavenPublications } apply plugin: 'com.android.library' apply plugin: 'maven-publish' // Used for mavenPublications android { ... defaultPublishConfig "myLibraryDebug" // Allows using this library in another // module in this project without publishing to mavenLocal or Bintray. // Useful for debug purposes, or for your library's sample app. defaultConfig { ... versionName libraryVersion ... } ... productFlavors { myLibrary myLibrary_logged // Here, the "_" will be replaced "-" in artifactId when publishing. myOtherLibraryFlavor } ... } dependencies { ... // Timber, a log utility. myLibrary_loggedCompile "com.jakewharton.timber:timber:${timberVersion}"; // Just an example } ... ext { libraryDesc = "Delegates for kotlin on android that check UI thread" } apply from: '../publish.gradle' // Makes this library publishable
当您正确地使用所有这些设置时,使用您的库的名称而不是我的(您可以将其用作示例),您可以尝试通过首先发布到mavenLocal来发布您的风味库的版本.为此,请运行以下命令:
myLibrary $ ../gradlew publishToMavenLocal
然后,您可以尝试添加mavenLocal
应用程序的存储库(此处为示例)并尝试将库添加为依赖项(artifactId应为flavor名称,"_"替换为" - ")并构建它.您还可以使用文件资源管理器(在Finder中使用cmd + shift + G来访问隐藏文件夹)~/.m2
查看目录并查找您的库.
什么时候发布到bintray/jcenter,你只需要运行这个命令:
myLibrary $ ../gradlew bintrayUpload
重要:
在将库发布到mavenLocal,Bintray或其他maven存储库之前,您通常需要针对使用该库的示例应用程序尝试使用您的库.这个示例应用程序应该是同一个项目中的另一个模块,只需要具有项目依赖性,它应该如下所示:compile project(':myLibrary')
.但是,由于您的库有多个productFlavor,因此您需要测试所有这些.不幸的是,目前无法从示例应用程序的build.gradle
文件中指定要使用的配置(除非您publishNonDefault true
在库的build.gradle
文件中使用,这会破坏maven和bintray出版物),但您可以在库中指定默认配置(即buildVariant)模块如此:defaultPublishConfig "myLibraryDebug"
在android
闭包中.您可以在Android Studio的"Build Variants"工具Windows中查看库的可用构建变体.
如果您需要一个例子,请随意浏览我的图书馆"Splitties".风味模块已命名concurrency
,但我也将我的脚本用于无味的库模块,并且我在项目中的所有库模块上进行了全面测试.
如果您需要帮助,可以联系我.
设置:
buildTypes { debug { } release { } } publishNonDefault true
修复:
defaultPublishConfig 'release' // Fix for defaultPublishConfig not working as expected // ref: https://github.com/dcendents/android-maven-gradle-plugin/issues/11 libraryVariants.all { variant -> if( publishNonDefault && variant.name == defaultPublishConfig ) { def bundleTask = tasks["bundle${variant.name.capitalize()}"] artifacts { archives(bundleTask.archivePath) { classifier null //necessary to get rid of the suffix in the artifact builtBy bundleTask name name.replace('-' + variant.name, '')//necessary to get rid of the suffix from the folder name } } } }
此修复程序仍将发布所有工件,但它将发布没有flavor后缀的默认工件,这足以使其全部工作.
仅上传默认工件的修复程序就是这样(如果bintray插件知道POM过滤器是什么):
install { repositories.mavenInstaller { /* POM filters can be used to block artifacts from certain build variants. However, Bintray does not respect POM filters, therefore this only works for maven deploy plugin. Also, bintray crashes with named filters, since it always expects a /build/pom/pom-default.xml, which does not happen with named filters. */ filter { artifact, file -> // this how the default classifier is identified in case the defaultPublishConfig fix is applied artifact.attributes.classifier == null } } }