diff --git a/android/build.gradle b/android/build.gradle index d8b20849..e7feddbd 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -3,8 +3,8 @@ apply plugin: 'com.android.library' apply plugin: 'com.github.dcendents.android-maven' apply plugin: 'maven-publish' -version = '1.4.1' -group = 'com.facebook.yoga.android' +version = VERSION_NAME +group = GROUP android { compileSdkVersion rootProject.compileSdkVersion @@ -42,8 +42,4 @@ task javadocJar(type: Jar, dependsOn: javadoc) { from javadoc.destinationDir } -ext { - bintrayName = 'com.facebook.yoga.android:yoga-layout' -} - -apply from: rootProject.file('gradle/android-jcenter-install.gradle') +apply from: rootProject.file('gradle/release.gradle') diff --git a/android/gradle.properties b/android/gradle.properties new file mode 100644 index 00000000..e03c3c0c --- /dev/null +++ b/android/gradle.properties @@ -0,0 +1,5 @@ +GROUP=com.facebook.yoga.android +POM_NAME=YogaLayout +POM_DESCRIPTION=YogaLayout +POM_ARTIFACT_ID=yoga-layout +POM_PACKAGING=aar diff --git a/gradle.properties b/gradle.properties index 62de2e58..ffcceb81 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,14 @@ -bintrayUsername= -bintrayApiKey= -bintrayGpgPassword= -dryRun=false +# Project-wide Gradle settings. + +org.gradle.jvmargs=-Xmx1536M + +VERSION_NAME=1.4.3-SNAPSHOT +POM_URL=https://github.com/facebook/yoga +POM_SCM_URL=https://github.com/facebook/yoga.git +POM_SCM_CONNECTION=scm:git:https://github.com/facebook/yoga.git +POM_SCM_DEV_CONNECTION=scm:git:git@github.com:facebook/yoga.git +POM_LICENSE_NAME=BSD License +POM_LICENSE_URL=https://github.com/facebook/yoga/blob/master/LICENSE +POM_LICENSE_DIST=repo +POM_DEVELOPER_ID=facebook +POM_DEVELOPER_NAME=facebook diff --git a/gradle/android-jcenter-install.gradle b/gradle/android-jcenter-install.gradle deleted file mode 100644 index 72af7ca5..00000000 --- a/gradle/android-jcenter-install.gradle +++ /dev/null @@ -1,92 +0,0 @@ -ext { - bintrayUserOrg = 'facebook' - bintrayRepo = 'maven' - siteURL = "https://facebook.github.io/yoga/" - projectLicenses = { - license { - name 'BSD License' - url 'https://github.com/facebook/yoga/blob/master/LICENSE' - distribution 'repo' - } - } -} - -def getBintrayUsername() { - return property('bintrayUsername') || System.getenv('BINTRAY_USERNAME') -} - -def getBintrayApiKey() { - return property('bintrayApiKey') || System.getenv('BINTRAY_API_KEY') -} - -def getBintrayGpgPassword() { - return property('bintrayGpgPassword') || System.getenv('BINTRAY_GPG_PASSWORD') -} - -def dryRunOnly() { - return hasProperty('dryRun') ? property('dryRun').toBoolean() : false -} - -def pomConfig = { - licenses { - // TODO Can we grab this from above? - license { - name 'BSD License' - url 'https://github.com/facebook/yoga/blob/master/LICENSE' - distribution 'repo' - } - } -} - -publishing { - publications { - primaryPublication(MavenPublication) { - groupId group - artifact(sourcesJar) - artifact(javadocJar) - pom.packaging='aar' - pom.withXml { - def root = asNode() - root.appendNode('name', 'Yoga') - root.appendNode('url', siteURL) - root.children().last() + pomConfig - def dependenciesNode = root.appendNode('dependencies') - //Iterate over the compile dependencies (we don't want the test ones), adding a node for each - configurations.compile.allDependencies.each { - if(it.group != null && (it.name != null || "unspecified".equals(it.name)) && it.version != null) { - def dependencyNode = dependenciesNode.appendNode('dependency') - dependencyNode.appendNode('groupId', it.group) - dependencyNode.appendNode('artifactId', it.name) - dependencyNode.appendNode('version', it.version) - } - } - } - } - } -} - - -bintray { - user = getBintrayUsername() - key = getBintrayApiKey() - publications = ['primaryPublication'] - configurations = ['archives'] - pkg { - repo = bintrayRepo - userOrg = bintrayUserOrg - name = project.bintrayName - dryRun = dryRunOnly() - licenses = projectLicenses - override = true - publish = true - publicDownloadNumbers = true - version { - name = project.version - released = new Date() - gpg { - sign = true - passphrase = getBintrayGpgPassword() - } - } - } -} diff --git a/gradle/android-maven-install.gradle b/gradle/android-maven-install.gradle new file mode 100644 index 00000000..e18f078c --- /dev/null +++ b/gradle/android-maven-install.gradle @@ -0,0 +1,37 @@ +// Configure the Android maven publication + +apply plugin: 'com.github.dcendents.android-maven' + +version = VERSION_NAME +group = GROUP +// Set the .aar / .jar base file name to match the artifact ID +// in case the module has a different name +project.archivesBaseName = POM_ARTIFACT_ID + +install { + repositories.mavenInstaller { + // This generates POM.xml with proper parameters + pom.project { + name POM_NAME + artifactId POM_ARTIFACT_ID + packaging POM_PACKAGING + description POM_DESCRIPTION + url projectUrl + + scm { + url scmUrl + connection scmConnection + developerConnection scmDeveloperConnection + } + + licenses projectLicenses + + developers { + developer { + id developerId + name developerName + } + } + } + } +} diff --git a/gradle/android-tasks.gradle b/gradle/android-tasks.gradle new file mode 100644 index 00000000..ef58d626 --- /dev/null +++ b/gradle/android-tasks.gradle @@ -0,0 +1,47 @@ +// Android tasks for Javadoc and sources.jar generation + +afterEvaluate { project -> + if (POM_PACKAGING == 'aar') { + task androidJavadoc(type: Javadoc) { + source = android.sourceSets.main.java.srcDirs + exclude '**/pom.xml' + exclude '**/proguard_annotations.pro' + classpath += files(android.bootClasspath) + } + + task androidJavadocJar(type: Jar) { + classifier = 'javadoc' + from androidJavadoc.destinationDir + } + + task androidSourcesJar(type: Jar) { + classifier = 'sources' + from android.sourceSets.main.java.srcDirs + } + + android.libraryVariants.all { variant -> + def name = variant.name.capitalize() + task "jar${name}"(type: Jar, dependsOn: variant.javaCompile) { + from variant.javaCompile.destinationDir + } + } + + artifacts.add('archives', androidJavadocJar) + artifacts.add('archives', androidSourcesJar) + } + + if (POM_PACKAGING == 'jar') { + task javadocJar(type: Jar, dependsOn: javadoc) { + classifier = 'javadoc' + from javadoc.destinationDir + } + + task sourcesJar(type: Jar, dependsOn: classes) { + classifier = 'sources' + from sourceSets.main.allSource + } + + artifacts.add('archives', javadocJar) + artifacts.add('archives', sourcesJar) + } +} diff --git a/gradle/bintray.gradle b/gradle/bintray.gradle new file mode 100644 index 00000000..91f8b009 --- /dev/null +++ b/gradle/bintray.gradle @@ -0,0 +1,63 @@ +// Upload to Bintray +apply plugin: 'com.jfrog.bintray' + +def getBintrayUsername() { + return project.hasProperty('bintrayUsername') ? property('bintrayUsername') : System.getenv('BINTRAY_USERNAME') +} + +def getBintrayApiKey() { + return project.hasProperty('bintrayApiKey') ? property('bintrayApiKey') : System.getenv('BINTRAY_API_KEY') +} + +def getBintrayGpgPassword() { + return project.hasProperty('bintrayGpgPassword') ? property('bintrayGpgPassword') : System.getenv('BINTRAY_GPG_PASSWORD') +} + +def getMavenCentralUsername() { + return project.hasProperty('mavenCentralUsername') ? property('mavenCentralUsername') : System.getenv('MAVEN_CENTRAL_USERNAME') +} + +def getMavenCentralPassword() { + return project.hasProperty('mavenCentralPassword') ? property('mavenCentralPassword') : System.getenv('MAVEN_CENTRAL_PASSWORD') +} + +def shouldSyncWithMavenCentral() { + return project.hasProperty('syncWithMavenCentral') ? property('syncWithMavenCentral').toBoolean() : false +} + +def dryRunOnly() { + return project.hasProperty('dryRun') ? property('dryRun').toBoolean() : false +} + +bintray { + user = getBintrayUsername() + key = getBintrayApiKey() + configurations = ['archives'] + pkg { + repo = bintrayRepo + userOrg = bintrayUserOrg + name = bintrayName + desc = bintrayDescription + websiteUrl = projectUrl + issueTrackerUrl = issuesUrl + vcsUrl = scmUrl + licenses = projectLicenses + dryRun = dryRunOnly() + override = true + publish = true + publicDownloadNumbers = true + version { + desc = bintrayDescription + gpg { + sign = true + passphrase = getBintrayGpgPassword() + } + mavenCentralSync { + sync = shouldSyncWithMavenCentral() + user = getMavenCentralUsername() + password = getMavenCentralPassword() + close = '1' // If set to 0, you have to manually click release + } + } + } +} diff --git a/gradle/gradle-mvn-push.gradle b/gradle/gradle-mvn-push.gradle new file mode 100644 index 00000000..f7b6f1a1 --- /dev/null +++ b/gradle/gradle-mvn-push.gradle @@ -0,0 +1,96 @@ +/* + * Copyright 2013 Chris Banes + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +apply plugin: 'signing' + +version = VERSION_NAME +group = GROUP + +def isReleaseBuild() { + return VERSION_NAME.contains('SNAPSHOT') == false +} + +def getReleaseRepositoryUrl() { + return hasProperty('RELEASE_REPOSITORY_URL') ? RELEASE_REPOSITORY_URL + : "https://oss.sonatype.org/service/local/staging/deploy/maven2/" +} + +def getSnapshotRepositoryUrl() { + return hasProperty('SNAPSHOT_REPOSITORY_URL') ? SNAPSHOT_REPOSITORY_URL + : "https://oss.sonatype.org/content/repositories/snapshots/" +} + +def getRepositoryUsername() { + return hasProperty('SONATYPE_NEXUS_USERNAME') ? SONATYPE_NEXUS_USERNAME : "" +} + +def getRepositoryPassword() { + return hasProperty('SONATYPE_NEXUS_PASSWORD') ? SONATYPE_NEXUS_PASSWORD : "" +} + +afterEvaluate { project -> + uploadArchives { + repositories { + mavenDeployer { + beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) } + + pom.groupId = GROUP + pom.artifactId = POM_ARTIFACT_ID + pom.version = VERSION_NAME + + repository(url: getReleaseRepositoryUrl()) { + authentication(userName: getRepositoryUsername(), password: getRepositoryPassword()) + } + snapshotRepository(url: getSnapshotRepositoryUrl()) { + authentication(userName: getRepositoryUsername(), password: getRepositoryPassword()) + } + + pom.project { + name POM_NAME + packaging POM_PACKAGING + description POM_DESCRIPTION + url POM_URL + + scm { + url POM_SCM_URL + connection POM_SCM_CONNECTION + developerConnection POM_SCM_DEV_CONNECTION + } + + licenses { + license { + name POM_LICENSE_NAME + url POM_LICENSE_URL + distribution POM_LICENSE_DIST + } + } + + developers { + developer { + id POM_DEVELOPER_ID + name POM_DEVELOPER_NAME + } + } + } + } + } + } + + signing { + required { isReleaseBuild() && gradle.taskGraph.hasTask('uploadArchives') } + sign configurations.archives + } +} diff --git a/gradle/release-bintray.gradle b/gradle/release-bintray.gradle new file mode 100644 index 00000000..3b23a234 --- /dev/null +++ b/gradle/release-bintray.gradle @@ -0,0 +1,33 @@ +// Set up everything required for releasing on Bintray +ext { + bintrayRepo = 'maven' + bintrayUserOrg = 'facebook' + bintrayName = "${GROUP}:${POM_ARTIFACT_ID}" + bintrayDescription = POM_DESCRIPTION + projectUrl = POM_URL + issuesUrl = 'https://github.com/facebook/yoga/issues' + scmUrl = POM_SCM_URL + scmConnection = POM_SCM_CONNECTION + scmDeveloperConnection = POM_SCM_DEV_CONNECTION + + publishedGroupId = GROUP + libraryName = 'yoga' + artifact = 'yoga' + + developerId = POM_DEVELOPER_ID + developerName = POM_DEVELOPER_NAME + + projectLicenses = { + license { + name = POM_LICENSE_NAME + url = POM_LICENSE_URL + distribution = POM_LICENSE_DIST + } + } +} + +// Set up the Android Maven publication (POM etc.) +apply from: rootProject.file('gradle/android-maven-install.gradle') + +// Upload to Bintray +apply from: rootProject.file('gradle/bintray.gradle') diff --git a/gradle/release.gradle b/gradle/release.gradle new file mode 100644 index 00000000..2f1a74d1 --- /dev/null +++ b/gradle/release.gradle @@ -0,0 +1,8 @@ +// Common Android tasks for all releases that generate Javadocs, sources, etc. +apply from: rootProject.file('gradle/android-tasks.gradle') + +// Upload to Bintray +apply from: rootProject.file('gradle/release-bintray.gradle') + +// Upload directly to standard Maven Central (for SNAPSHOTs) +apply from: rootProject.file('gradle/gradle-mvn-push.gradle') diff --git a/java/build.gradle b/java/build.gradle index 3284dbad..998f57c8 100644 --- a/java/build.gradle +++ b/java/build.gradle @@ -3,8 +3,8 @@ apply plugin: 'com.android.library' apply plugin: 'com.github.dcendents.android-maven' apply plugin: 'maven-publish' -version = '1.4.2' -group = 'com.facebook.yoga' +group = GROUP +version = VERSION_NAME android { compileSdkVersion rootProject.compileSdkVersion @@ -73,4 +73,4 @@ ext { bintrayName = 'com.facebook.yoga:yoga' } -apply from: rootProject.file('gradle/android-jcenter-install.gradle') +apply from: rootProject.file('gradle/release.gradle') diff --git a/java/gradle.properties b/java/gradle.properties new file mode 100644 index 00000000..1679cf1d --- /dev/null +++ b/java/gradle.properties @@ -0,0 +1,5 @@ +GROUP=com.facebook.yoga +POM_NAME=Yoga +POM_DESCRIPTION=Java bindings to libyoga +POM_ARTIFACT_ID=yoga +POM_PACKAGING=aar