Rob Spieldenner
10 years ago
22 changed files with 112 additions and 417 deletions
@ -1,127 +1,20 @@ |
|||||||
// Establish version and status |
plugins { |
||||||
ext.githubProjectName = rootProject.name // Change if github project name is not the same as the root project's name |
id 'nebula.netflixoss' version '2.2.2' |
||||||
|
|
||||||
buildscript { |
|
||||||
repositories { |
|
||||||
mavenLocal() |
|
||||||
mavenCentral() |
|
||||||
} |
|
||||||
apply from: file('gradle/buildscript.gradle'), to: buildscript |
|
||||||
} |
|
||||||
|
|
||||||
allprojects { |
|
||||||
if (JavaVersion.current().isJava8Compatible()) { |
|
||||||
tasks.withType(Javadoc) { |
|
||||||
options.addStringOption('Xdoclint:none', '-quiet') // Doclint is onerous in Java 8. |
|
||||||
} |
|
||||||
} |
|
||||||
repositories { |
|
||||||
mavenLocal() |
|
||||||
mavenCentral() |
|
||||||
maven { url 'https://oss.sonatype.org/content/repositories/releases/' } |
|
||||||
} |
|
||||||
} |
} |
||||||
|
|
||||||
apply from: file('gradle/convention.gradle') |
ext { |
||||||
apply from: file('gradle/maven.gradle') |
githubProjectName = rootProject.name // Change if github project name is not the same as the root project's name |
||||||
if (!JavaVersion.current().isJava8Compatible()) { |
|
||||||
apply from: file('gradle/check.gradle') // FindBugs is incompatible with Java 8. |
|
||||||
} |
} |
||||||
apply from: file('gradle/license.gradle') |
|
||||||
apply from: file('gradle/release.gradle') |
|
||||||
apply plugin: 'idea' |
|
||||||
|
|
||||||
subprojects { |
subprojects { |
||||||
apply from: rootProject.file('dagger.gradle') |
apply plugin: 'nebula.netflixoss' |
||||||
group = "com.netflix.${githubProjectName}" // TEMPLATE: Set to organization of project |
|
||||||
} |
|
||||||
|
|
||||||
project(':feign-core') { |
|
||||||
apply plugin: 'java' |
|
||||||
|
|
||||||
test { |
|
||||||
useTestNG() |
|
||||||
} |
|
||||||
|
|
||||||
dependencies { |
|
||||||
testCompile 'com.google.guava:guava:14.0.1' |
|
||||||
testCompile 'com.google.code.gson:gson:2.2.4' |
|
||||||
testCompile 'com.fasterxml.jackson.core:jackson-databind:2.2.2' |
|
||||||
testCompile 'org.testng:testng:6.8.5' |
|
||||||
testCompile 'com.google.mockwebserver:mockwebserver:20130706' |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
project(':feign-sax') { |
|
||||||
apply plugin: 'java' |
|
||||||
|
|
||||||
test { |
|
||||||
useTestNG() |
|
||||||
} |
|
||||||
|
|
||||||
dependencies { |
|
||||||
compile project(':feign-core') |
|
||||||
testCompile 'com.google.guava:guava:14.0.1' |
|
||||||
testCompile 'org.testng:testng:6.8.5' |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
project(':feign-gson') { |
|
||||||
apply plugin: 'java' |
|
||||||
|
|
||||||
test { |
repositories { |
||||||
useTestNG() |
jcenter() |
||||||
} |
//mavenLocal() |
||||||
|
//mavenCentral() |
||||||
dependencies { |
//maven { url 'https://oss.sonatype.org/content/repositories/releases/' } |
||||||
compile project(':feign-core') |
|
||||||
compile 'com.google.code.gson:gson:2.2.4' |
|
||||||
testCompile 'org.testng:testng:6.8.5' |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
project(':feign-jackson') { |
|
||||||
apply plugin: 'java' |
|
||||||
|
|
||||||
test { |
|
||||||
useTestNG() |
|
||||||
} |
|
||||||
|
|
||||||
dependencies { |
|
||||||
compile project(':feign-core') |
|
||||||
compile 'com.fasterxml.jackson.core:jackson-databind:2.2.2' |
|
||||||
testCompile 'org.testng:testng:6.8.5' |
|
||||||
testCompile 'com.google.guava:guava:14.0.1' |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
project(':feign-jaxrs') { |
|
||||||
apply plugin: 'java' |
|
||||||
|
|
||||||
test { |
|
||||||
useTestNG() |
|
||||||
} |
|
||||||
|
|
||||||
dependencies { |
|
||||||
compile project(':feign-core') |
|
||||||
compile 'javax.ws.rs:jsr311-api:1.1.1' |
|
||||||
testCompile project(':feign-gson') |
|
||||||
testCompile 'com.google.guava:guava:14.0.1' |
|
||||||
testCompile 'org.testng:testng:6.8.5' |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
project(':feign-ribbon') { |
|
||||||
apply plugin: 'java' |
|
||||||
|
|
||||||
test { |
|
||||||
useTestNG() |
|
||||||
} |
|
||||||
|
|
||||||
dependencies { |
|
||||||
compile project(':feign-core') |
|
||||||
compile 'com.netflix.ribbon:ribbon-loadbalancer:2.0-RC5' |
|
||||||
testCompile 'org.testng:testng:6.8.5' |
|
||||||
testCompile 'com.google.mockwebserver:mockwebserver:20130706' |
|
||||||
} |
} |
||||||
|
apply from: rootProject.file('dagger.gradle') |
||||||
|
group = "com.netflix.${githubProjectName}" // TEMPLATE: Set to organization of project |
||||||
} |
} |
||||||
|
@ -1,13 +0,0 @@ |
|||||||
Copyright ${year} Netflix, Inc. |
|
||||||
|
|
||||||
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. |
|
@ -0,0 +1,15 @@ |
|||||||
|
apply plugin: 'java' |
||||||
|
|
||||||
|
sourceCompatibility = 1.6 |
||||||
|
|
||||||
|
test { |
||||||
|
useTestNG() |
||||||
|
} |
||||||
|
|
||||||
|
dependencies { |
||||||
|
testCompile 'com.google.guava:guava:14.0.1' |
||||||
|
testCompile 'com.google.code.gson:gson:2.2.4' |
||||||
|
testCompile 'com.fasterxml.jackson.core:jackson-databind:2.2.2' |
||||||
|
testCompile 'org.testng:testng:6.8.5' |
||||||
|
testCompile 'com.google.mockwebserver:mockwebserver:20130706' |
||||||
|
} |
@ -1,11 +0,0 @@ |
|||||||
// Executed in context of buildscript |
|
||||||
repositories { |
|
||||||
// Repo in addition to maven central |
|
||||||
repositories { maven { url 'http://dl.bintray.com/content/netflixoss/external-gradle-plugins/' } } // For gradle-release |
|
||||||
} |
|
||||||
dependencies { |
|
||||||
classpath 'nl.javadude.gradle.plugins:license-gradle-plugin:0.6.1' |
|
||||||
classpath 'com.mapvine:gradle-cobertura-plugin:0.1' |
|
||||||
classpath 'gradle-release:gradle-release:1.1.5' |
|
||||||
classpath 'org.ajoberstar:gradle-git:0.5.0' |
|
||||||
} |
|
@ -1,26 +0,0 @@ |
|||||||
subprojects { |
|
||||||
// Checkstyle |
|
||||||
apply plugin: 'checkstyle' |
|
||||||
checkstyle { |
|
||||||
ignoreFailures = true |
|
||||||
configFile = rootProject.file('codequality/checkstyle.xml') |
|
||||||
} |
|
||||||
|
|
||||||
// FindBugs |
|
||||||
apply plugin: 'findbugs' |
|
||||||
findbugs { |
|
||||||
ignoreFailures = true |
|
||||||
} |
|
||||||
|
|
||||||
// PMD |
|
||||||
apply plugin: 'pmd' |
|
||||||
//tasks.withType(Pmd) { reports.html.enabled true } |
|
||||||
|
|
||||||
apply plugin: 'cobertura' |
|
||||||
cobertura { |
|
||||||
sourceDirs = sourceSets.main.java.srcDirs |
|
||||||
format = 'html' |
|
||||||
includes = ['**/*.java', '**/*.groovy'] |
|
||||||
excludes = [] |
|
||||||
} |
|
||||||
} |
|
@ -1,101 +0,0 @@ |
|||||||
// GRADLE-2087 workaround, perform after java plugin |
|
||||||
status = project.hasProperty('preferredStatus')?project.preferredStatus:(version.contains('SNAPSHOT')?'snapshot':'release') |
|
||||||
|
|
||||||
subprojects { project -> |
|
||||||
apply plugin: 'java' // Plugin as major conventions |
|
||||||
|
|
||||||
sourceCompatibility = 1.6 |
|
||||||
|
|
||||||
// Restore status after Java plugin |
|
||||||
status = rootProject.status |
|
||||||
|
|
||||||
task sourcesJar(type: Jar, dependsOn:classes) { |
|
||||||
from sourceSets.main.allSource |
|
||||||
classifier 'sources' |
|
||||||
extension 'jar' |
|
||||||
} |
|
||||||
|
|
||||||
task javadocJar(type: Jar, dependsOn:javadoc) { |
|
||||||
from javadoc.destinationDir |
|
||||||
classifier 'javadoc' |
|
||||||
extension 'jar' |
|
||||||
} |
|
||||||
|
|
||||||
configurations.add('sources') |
|
||||||
configurations.add('javadoc') |
|
||||||
configurations.archives { |
|
||||||
extendsFrom configurations.sources |
|
||||||
extendsFrom configurations.javadoc |
|
||||||
} |
|
||||||
|
|
||||||
// When outputing to an Ivy repo, we want to use the proper type field |
|
||||||
gradle.taskGraph.whenReady { |
|
||||||
def isNotMaven = !it.hasTask(project.uploadMavenCentral) |
|
||||||
if (isNotMaven) { |
|
||||||
def artifacts = project.configurations.sources.artifacts |
|
||||||
def sourceArtifact = artifacts.iterator().next() |
|
||||||
sourceArtifact.type = 'sources' |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
artifacts { |
|
||||||
sources(sourcesJar) { |
|
||||||
// Weird Gradle quirk where type will be used for the extension, but only for sources |
|
||||||
type 'jar' |
|
||||||
} |
|
||||||
javadoc(javadocJar) { |
|
||||||
type 'javadoc' |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
configurations { |
|
||||||
provided { |
|
||||||
description = 'much like compile, but indicates you expect the JDK or a container to provide it. It is only available on the compilation classpath, and is not transitive.' |
|
||||||
transitive = true |
|
||||||
visible = true |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
project.sourceSets { |
|
||||||
main.compileClasspath += project.configurations.provided |
|
||||||
main.runtimeClasspath -= project.configurations.provided |
|
||||||
test.compileClasspath += project.configurations.provided |
|
||||||
test.runtimeClasspath += project.configurations.provided |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
apply plugin: 'github-pages' // Used to create publishGhPages task |
|
||||||
|
|
||||||
def docTasks = [:] |
|
||||||
[Javadoc,ScalaDoc,Groovydoc].each{ Class docClass -> |
|
||||||
def allSources = allprojects.tasks*.withType(docClass).flatten()*.source |
|
||||||
if (allSources) { |
|
||||||
def shortName = docClass.simpleName.toLowerCase() |
|
||||||
def docTask = task "aggregate${shortName.capitalize()}"(type: docClass, description: "Aggregate subproject ${shortName}s") { |
|
||||||
source = allSources |
|
||||||
destinationDir = file("${project.buildDir}/docs/${shortName}") |
|
||||||
doFirst { |
|
||||||
def classpaths = allprojects.findAll { it.plugins.hasPlugin(JavaPlugin) }.collect { it.sourceSets.main.compileClasspath } |
|
||||||
classpath = files(classpaths) |
|
||||||
} |
|
||||||
} |
|
||||||
docTasks[shortName] = docTask |
|
||||||
processGhPages.dependsOn(docTask) |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
githubPages { |
|
||||||
repoUri = "git@github.com:Netflix/${rootProject.githubProjectName}.git" |
|
||||||
pages { |
|
||||||
docTasks.each { shortName, docTask -> |
|
||||||
from(docTask.outputs.files) { |
|
||||||
into "docs/${shortName}" |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// Generate wrapper, which is distributed as part of source to alleviate the need of installing gradle |
|
||||||
task createWrapper(type: Wrapper) { |
|
||||||
gradleVersion = '1.5' |
|
||||||
} |
|
@ -1,10 +0,0 @@ |
|||||||
// Dependency for plugin was set in buildscript.gradle |
|
||||||
|
|
||||||
subprojects { |
|
||||||
apply plugin: 'license' //nl.javadude.gradle.plugins.license.LicensePlugin |
|
||||||
license { |
|
||||||
header rootProject.file('codequality/HEADER') |
|
||||||
ext.year = Calendar.getInstance().get(Calendar.YEAR) |
|
||||||
skipExistingHeaders true |
|
||||||
} |
|
||||||
} |
|
@ -1,70 +0,0 @@ |
|||||||
// Maven side of things |
|
||||||
subprojects { |
|
||||||
apply plugin: 'maven' // Java plugin has to have been already applied for the conf2scope mappings to work |
|
||||||
apply plugin: 'signing' |
|
||||||
|
|
||||||
signing { |
|
||||||
required { gradle.taskGraph.hasTask(uploadMavenCentral) } |
|
||||||
sign configurations.archives |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Publishing to Maven Central example provided from http://jedicoder.blogspot.com/2011/11/automated-gradle-project-deployment-to.html |
|
||||||
* artifactory will execute uploadArchives to force generation of ivy.xml, and we don't want that to trigger an upload to maven |
|
||||||
* central, so using custom upload task. |
|
||||||
*/ |
|
||||||
task uploadMavenCentral(type:Upload, dependsOn: signArchives) { |
|
||||||
configuration = configurations.archives |
|
||||||
onlyIf { ['release', 'snapshot'].contains(project.status) } |
|
||||||
repositories.mavenDeployer { |
|
||||||
beforeDeployment { signing.signPom(it) } |
|
||||||
|
|
||||||
// To test deployment locally, use the following instead of oss.sonatype.org |
|
||||||
//repository(url: "file://localhost/${rootProject.rootDir}/repo") |
|
||||||
|
|
||||||
def sonatypeUsername = rootProject.hasProperty('sonatypeUsername')?rootProject.sonatypeUsername:'' |
|
||||||
def sonatypePassword = rootProject.hasProperty('sonatypePassword')?rootProject.sonatypePassword:'' |
|
||||||
|
|
||||||
repository(url: 'https://oss.sonatype.org/service/local/staging/deploy/maven2') { |
|
||||||
authentication(userName: sonatypeUsername, password: sonatypePassword) |
|
||||||
} |
|
||||||
|
|
||||||
snapshotRepository(url: 'https://oss.sonatype.org/content/repositories/snapshots/') { |
|
||||||
authentication(userName: sonatypeUsername, password: sonatypePassword) |
|
||||||
} |
|
||||||
|
|
||||||
// Prevent datastamp from being appending to artifacts during deployment |
|
||||||
uniqueVersion = false |
|
||||||
|
|
||||||
// Closure to configure all the POM with extra info, common to all projects |
|
||||||
pom.project { |
|
||||||
name "${project.name}" |
|
||||||
description "${project.name} developed by Netflix" |
|
||||||
developers { |
|
||||||
developer { |
|
||||||
id 'netflixgithub' |
|
||||||
name 'Netflix Open Source Development' |
|
||||||
email 'talent@netflix.com' |
|
||||||
} |
|
||||||
} |
|
||||||
licenses { |
|
||||||
license { |
|
||||||
name 'The Apache Software License, Version 2.0' |
|
||||||
url 'http://www.apache.org/licenses/LICENSE-2.0.txt' |
|
||||||
distribution 'repo' |
|
||||||
} |
|
||||||
} |
|
||||||
url "https://github.com/Netflix/${rootProject.githubProjectName}" |
|
||||||
scm { |
|
||||||
connection "scm:git:git@github.com:Netflix/${rootProject.githubProjectName}.git" |
|
||||||
url "scm:git:git@github.com:Netflix/${rootProject.githubProjectName}.git" |
|
||||||
developerConnection "scm:git:git@github.com:Netflix/${rootProject.githubProjectName}.git" |
|
||||||
} |
|
||||||
issueManagement { |
|
||||||
system 'github' |
|
||||||
url "https://github.com/Netflix/${rootProject.githubProjectName}/issues" |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1 +0,0 @@ |
|||||||
apply from: 'http://artifacts.netflix.com/gradle-netflix-local/artifactory.gradle' |
|
@ -1,61 +0,0 @@ |
|||||||
apply plugin: 'release' |
|
||||||
|
|
||||||
[ uploadIvyLocal: 'uploadLocal', uploadArtifactory: 'artifactoryPublish', buildWithArtifactory: 'build' ].each { key, value -> |
|
||||||
// Call out to compile against internal repository |
|
||||||
task "${key}"(type: GradleBuild) { |
|
||||||
startParameter = project.gradle.startParameter.newInstance() |
|
||||||
doFirst { |
|
||||||
startParameter.projectProperties = [status: project.status, preferredStatus: project.status] |
|
||||||
} |
|
||||||
startParameter.addInitScript( file('gradle/netflix-oss.gradle') ) |
|
||||||
startParameter.getExcludedTaskNames().add('check') |
|
||||||
tasks = [ 'build', value ] |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// Marker task for following code to key in on |
|
||||||
task releaseCandidate(dependsOn: release) |
|
||||||
task forceCandidate { |
|
||||||
onlyIf { gradle.taskGraph.hasTask(releaseCandidate) } |
|
||||||
doFirst { project.status = 'candidate' } |
|
||||||
} |
|
||||||
task forceRelease { |
|
||||||
onlyIf { !gradle.taskGraph.hasTask(releaseCandidate) } |
|
||||||
doFirst { project.status = 'release' } |
|
||||||
} |
|
||||||
release.dependsOn([forceCandidate, forceRelease]) |
|
||||||
|
|
||||||
task uploadMavenCentral(dependsOn: subprojects.tasks.uploadMavenCentral) |
|
||||||
task releaseSnapshot(dependsOn: [uploadArtifactory, uploadMavenCentral]) |
|
||||||
|
|
||||||
// Ensure our versions look like the project status before publishing |
|
||||||
task verifyStatus << { |
|
||||||
def hasSnapshot = version.contains('-SNAPSHOT') |
|
||||||
if (project.status == 'snapshot' && !hasSnapshot) { |
|
||||||
throw new GradleException("Version (${version}) needs -SNAPSHOT if publishing snapshot") |
|
||||||
} |
|
||||||
} |
|
||||||
uploadArtifactory.dependsOn(verifyStatus) |
|
||||||
uploadMavenCentral.dependsOn(verifyStatus) |
|
||||||
|
|
||||||
// Ensure upload happens before taggging, hence upload failures will leave repo in a revertable state |
|
||||||
preTagCommit.dependsOn([uploadArtifactory, uploadMavenCentral]) |
|
||||||
|
|
||||||
|
|
||||||
gradle.taskGraph.whenReady { taskGraph -> |
|
||||||
def hasRelease = taskGraph.hasTask('commitNewVersion') |
|
||||||
def indexOf = { return taskGraph.allTasks.indexOf(it) } |
|
||||||
|
|
||||||
if (hasRelease) { |
|
||||||
assert indexOf(build) < indexOf(unSnapshotVersion), 'build target has to be after unSnapshotVersion' |
|
||||||
assert indexOf(uploadMavenCentral) < indexOf(preTagCommit), 'preTagCommit has to be after uploadMavenCentral' |
|
||||||
assert indexOf(uploadArtifactory) < indexOf(preTagCommit), 'preTagCommit has to be after uploadArtifactory' |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// Prevent plugin from asking for a version number interactively |
|
||||||
ext.'gradle.release.useAutomaticVersion' = "true" |
|
||||||
|
|
||||||
release { |
|
||||||
git.requireBranch = null |
|
||||||
} |
|
Binary file not shown.
@ -1,6 +1,6 @@ |
|||||||
#Tue Apr 02 11:45:56 PDT 2013 |
#Fri Jan 02 13:14:58 PST 2015 |
||||||
distributionBase=GRADLE_USER_HOME |
distributionBase=GRADLE_USER_HOME |
||||||
distributionPath=wrapper/dists |
distributionPath=wrapper/dists |
||||||
zipStoreBase=GRADLE_USER_HOME |
zipStoreBase=GRADLE_USER_HOME |
||||||
zipStorePath=wrapper/dists |
zipStorePath=wrapper/dists |
||||||
distributionUrl=http\://services.gradle.org/distributions/gradle-1.5-bin.zip |
distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-bin.zip |
||||||
|
@ -0,0 +1,13 @@ |
|||||||
|
apply plugin: 'java' |
||||||
|
|
||||||
|
sourceCompatibility = 1.6 |
||||||
|
|
||||||
|
test { |
||||||
|
useTestNG() |
||||||
|
} |
||||||
|
|
||||||
|
dependencies { |
||||||
|
compile project(':feign-core') |
||||||
|
compile 'com.google.code.gson:gson:2.2.4' |
||||||
|
testCompile 'org.testng:testng:6.8.5' |
||||||
|
} |
@ -0,0 +1,14 @@ |
|||||||
|
apply plugin: 'java' |
||||||
|
|
||||||
|
sourceCompatibility = 1.6 |
||||||
|
|
||||||
|
test { |
||||||
|
useTestNG() |
||||||
|
} |
||||||
|
|
||||||
|
dependencies { |
||||||
|
compile project(':feign-core') |
||||||
|
compile 'com.fasterxml.jackson.core:jackson-databind:2.2.2' |
||||||
|
testCompile 'org.testng:testng:6.8.5' |
||||||
|
testCompile 'com.google.guava:guava:14.0.1' |
||||||
|
} |
@ -0,0 +1,15 @@ |
|||||||
|
apply plugin: 'java' |
||||||
|
|
||||||
|
sourceCompatibility = 1.6 |
||||||
|
|
||||||
|
test { |
||||||
|
useTestNG() |
||||||
|
} |
||||||
|
|
||||||
|
dependencies { |
||||||
|
compile project(':feign-core') |
||||||
|
compile 'javax.ws.rs:jsr311-api:1.1.1' |
||||||
|
testCompile project(':feign-gson') |
||||||
|
testCompile 'com.google.guava:guava:14.0.1' |
||||||
|
testCompile 'org.testng:testng:6.8.5' |
||||||
|
} |
@ -0,0 +1,14 @@ |
|||||||
|
apply plugin: 'java' |
||||||
|
|
||||||
|
sourceCompatibility = 1.6 |
||||||
|
|
||||||
|
test { |
||||||
|
useTestNG() |
||||||
|
} |
||||||
|
|
||||||
|
dependencies { |
||||||
|
compile project(':feign-core') |
||||||
|
compile 'com.netflix.ribbon:ribbon-loadbalancer:2.0-RC5' |
||||||
|
testCompile 'org.testng:testng:6.8.5' |
||||||
|
testCompile 'com.google.mockwebserver:mockwebserver:20130706' |
||||||
|
} |
Loading…
Reference in new issue