misc/androidstudio: source code for gomobile bind gradle plugin.
Currently version 0.2.1 I messed up previous versions and plugins.gradle.org doesn't let me remove the bad versions. Change-Id: I9eef512633b461ff5a7fcbe11a3e104efb250d61 Reviewed-on: https://go-review.googlesource.com/12538 Reviewed-by: David Crawshaw <crawshaw@golang.org>
This commit is contained in:
parent
103c0611a8
commit
8c8ee830af
2
misc/androidstudio/.gitignore
vendored
Normal file
2
misc/androidstudio/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
.gradle
|
||||
/build
|
28
misc/androidstudio/README.md
Normal file
28
misc/androidstudio/README.md
Normal file
@ -0,0 +1,28 @@
|
||||
gobindPlugin invokes gomobile bind command on the specified package.
|
||||
|
||||
# Usage
|
||||
|
||||
build.gradle:
|
||||
<pre>
|
||||
plugins {
|
||||
id "org.golang.mobile.bind" version "0.2.1"
|
||||
}
|
||||
|
||||
gobind {
|
||||
// package to bind
|
||||
pkg "github.com/someone/somepackage"
|
||||
|
||||
// GOPATH
|
||||
GOPATH "/home/gopher"
|
||||
|
||||
// PATH to directories with "go" and "gomobile" tools.
|
||||
PATH "path1:path2:"
|
||||
}
|
||||
</pre>
|
||||
|
||||
For details:
|
||||
https://plugins.gradle.org/plugin/org.golang.mobile.bind
|
||||
|
||||
# TODO
|
||||
|
||||
* Find the stale aar file (how?)
|
39
misc/androidstudio/build.gradle
Normal file
39
misc/androidstudio/build.gradle
Normal file
@ -0,0 +1,39 @@
|
||||
apply plugin: 'groovy'
|
||||
|
||||
buildscript {
|
||||
repositories {
|
||||
maven {
|
||||
url "https://plugins.gradle.org/m2/"
|
||||
}
|
||||
}
|
||||
dependencies {
|
||||
classpath "com.gradle.publish:plugin-publish-plugin:0.9.1"
|
||||
}
|
||||
}
|
||||
|
||||
apply plugin: "com.gradle.plugin-publish"
|
||||
repositories {
|
||||
jcenter()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compile gradleApi()
|
||||
compile localGroovy()
|
||||
|
||||
testCompile 'junit:junit:4.11'
|
||||
}
|
||||
|
||||
pluginBundle {
|
||||
website = 'https://golang.org'
|
||||
vcsUrl = 'https://github.com/golang/mobile'
|
||||
description = 'Plugin for gomobile projects (beta)'
|
||||
version = '0.2.1'
|
||||
|
||||
plugins {
|
||||
gobindPlugin {
|
||||
id = 'org.golang.mobile.bind'
|
||||
displayName = 'gomobile bind plugin'
|
||||
tags = ['golang', 'gomobile', 'gobind']
|
||||
}
|
||||
}
|
||||
}
|
1
misc/androidstudio/settings.gradle
Normal file
1
misc/androidstudio/settings.gradle
Normal file
@ -0,0 +1 @@
|
||||
rootProject.name = 'gobindPlugin'
|
@ -0,0 +1,89 @@
|
||||
/**
|
||||
* Copyright 2015 The Go Authors. All rights reserved.
|
||||
* Use of this source code is governed by a BSD-style
|
||||
* license that can be found in the LICENSE file.
|
||||
*/
|
||||
|
||||
package org.golang.mobile;
|
||||
|
||||
import org.golang.mobile.OutputFileTask;
|
||||
|
||||
import org.gradle.api.Task;
|
||||
import org.gradle.api.artifacts.PublishArtifact;
|
||||
import org.gradle.api.tasks.TaskDependency;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* custom implementation of PublishArtifact for published AAR
|
||||
*/
|
||||
public class AARPublishArtifact implements PublishArtifact {
|
||||
|
||||
private final String name;
|
||||
private final String classifier;
|
||||
private final OutputFileTask task;
|
||||
private final TaskDependency taskDependency;
|
||||
|
||||
private static final class DefaultTaskDependency implements TaskDependency {
|
||||
|
||||
private final Set<Task> tasks;
|
||||
|
||||
DefaultTaskDependency(Task task) {
|
||||
this.tasks = Collections.singleton(task);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<? extends Task> getDependencies(Task task) {
|
||||
return tasks;
|
||||
}
|
||||
}
|
||||
|
||||
public AARPublishArtifact(
|
||||
String name,
|
||||
String classifier,
|
||||
OutputFileTask task) {
|
||||
this.name = name;
|
||||
this.classifier = classifier;
|
||||
this.task = task;
|
||||
this.taskDependency = new DefaultTaskDependency((Task) task);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getExtension() {
|
||||
return "aar";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getType() {
|
||||
return "aar";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getClassifier() {
|
||||
return classifier;
|
||||
}
|
||||
|
||||
@Override
|
||||
public File getFile() {
|
||||
return task.getOutputFile();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Date getDate() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TaskDependency getBuildDependencies() {
|
||||
return taskDependency;
|
||||
}
|
||||
}
|
@ -0,0 +1,103 @@
|
||||
/*
|
||||
* Copyright 2015 The Go Authors. All rights reserved.
|
||||
* Use of this source code is governed by a BSD-style
|
||||
* license that can be found in the LICENSE file.
|
||||
*/
|
||||
|
||||
package org.golang.mobile
|
||||
|
||||
import org.gradle.api.DefaultTask
|
||||
import org.gradle.api.GradleException
|
||||
import org.gradle.api.Project
|
||||
import org.gradle.api.Plugin
|
||||
import org.gradle.api.Task
|
||||
import org.gradle.api.tasks.OutputFile
|
||||
import org.gradle.api.tasks.TaskAction
|
||||
|
||||
import org.golang.mobile.OutputFileTask
|
||||
import org.golang.mobile.AARPublishArtifact
|
||||
|
||||
/*
|
||||
* GobindPlugin configures the default project that builds .AAR file
|
||||
* from a go package, using gomobile bind command.
|
||||
* For gomobile bind command, see https://golang.org/x/mobile/cmd/gomobile
|
||||
*/
|
||||
class GobindPlugin implements Plugin<Project> {
|
||||
void apply(Project project) {
|
||||
project.configurations.create("default")
|
||||
project.extensions.create('gobind', GobindExtension)
|
||||
|
||||
Task gobindTask = project.tasks.create("gobind", GobindTask)
|
||||
gobindTask.outputFile = project.file(project.name+".aar")
|
||||
project.artifacts.add("default", new AARPublishArtifact(
|
||||
'mylib',
|
||||
null,
|
||||
gobindTask))
|
||||
|
||||
Task cleanTask = project.tasks.create("clean", {
|
||||
project.delete(project.name+".aar")
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
class GobindTask extends DefaultTask implements OutputFileTask {
|
||||
@OutputFile
|
||||
File outputFile
|
||||
|
||||
@TaskAction
|
||||
def gobind() {
|
||||
def pkg = project.gobind.pkg.trim()
|
||||
def gopath = project.gobind.GOPATH.trim()
|
||||
def paths = project.gobind.PATH.trim() + File.pathSeparator + System.getenv("PATH")
|
||||
if (!pkg || !gopath) {
|
||||
throw new GradleException('gobind.pkg and gobind.GOPATH must be set')
|
||||
}
|
||||
def gomobile = findGomobile()
|
||||
|
||||
Properties properties = new Properties()
|
||||
properties.load(project.rootProject.file('local.properties').newDataInputStream())
|
||||
def androidHome = properties.getProperty('sdk.dir')
|
||||
if (!androidHome?.trim()) {
|
||||
// fallback to ANDROID_HOME
|
||||
androidHome = System.getenv("ANDROID_HOME")
|
||||
}
|
||||
|
||||
project.exec {
|
||||
executable(gomobile)
|
||||
|
||||
args("bind", "-target=android", "-i", "-o", project.name+".aar", pkg)
|
||||
if (!androidHome?.trim()) {
|
||||
throw new GradleException('Neither sdk.dir or ANDROID_HOME is set')
|
||||
}
|
||||
environment("GOPATH", gopath)
|
||||
environment("PATH", paths)
|
||||
environment("ANDROID_HOME", androidHome)
|
||||
}
|
||||
}
|
||||
|
||||
def findGomobile() {
|
||||
def gomobile = "gomobile"
|
||||
if (System.getProperty("os.name").startsWith("Windows")) {
|
||||
gomobile = "gomobile.exe"
|
||||
}
|
||||
def paths = project.gobind.PATH + File.pathSeparator + System.getenv("PATH")
|
||||
for (p in paths.split(File.pathSeparator)) {
|
||||
def f = new File(p + File.separator + gomobile)
|
||||
if (f.exists()) {
|
||||
return p + File.separator + gomobile
|
||||
}
|
||||
}
|
||||
throw new GradleException('failed to find gomobile command from ' + paths)
|
||||
}
|
||||
}
|
||||
|
||||
class GobindExtension {
|
||||
// Package to bind.
|
||||
def String pkg = ""
|
||||
|
||||
// GOPATH: necessary for gomobile tool.
|
||||
def String GOPATH = System.getenv("GOPATH")
|
||||
|
||||
// PATH: must include path to 'gomobile' and 'go' binary.
|
||||
def String PATH = ""
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
/**
|
||||
* Copyright 2015 The Go Authors. All rights reserved.
|
||||
* Use of this source code is governed by a BSD-style
|
||||
* license that can be found in the LICENSE file.
|
||||
*/
|
||||
|
||||
package org.golang.mobile;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
/**
|
||||
* A task that outputs a file.
|
||||
*/
|
||||
public interface OutputFileTask {
|
||||
File getOutputFile();
|
||||
}
|
@ -0,0 +1 @@
|
||||
implementation-class=org.golang.mobile.GobindPlugin
|
@ -0,0 +1,22 @@
|
||||
/**
|
||||
* Copyright 2015 The Go Authors. All rights reserved.
|
||||
* Use of this source code is governed by a BSD-style
|
||||
* license that can be found in the LICENSE file.
|
||||
*/
|
||||
|
||||
package org.golang.mobile
|
||||
|
||||
import org.junit.Test
|
||||
import org.gradle.testfixtures.ProjectBuilder
|
||||
import org.gradle.api.Project
|
||||
import static org.junit.Assert.*
|
||||
|
||||
class GobindPluginTest {
|
||||
@Test
|
||||
public void gobindPluginAddsGobindTaskToProject() {
|
||||
Project project = ProjectBuilder.builder().build()
|
||||
project.apply plugin: 'org.golang.mobile.bind'
|
||||
|
||||
assertTrue(project.tasks.gobind instanceof GobindTask)
|
||||
}
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
/**
|
||||
* Copyright 2015 The Go Authors. All rights reserved.
|
||||
* Use of this source code is governed by a BSD-style
|
||||
* license that can be found in the LICENSE file.
|
||||
*/
|
||||
|
||||
package org.golang.mobile
|
||||
|
||||
import org.junit.Test
|
||||
import org.gradle.testfixtures.ProjectBuilder
|
||||
import org.gradle.api.Project
|
||||
import static org.junit.Assert.*
|
||||
|
||||
class GobindTaskTest {
|
||||
@Test
|
||||
public void canAddTaskToProject() {
|
||||
Project project = ProjectBuilder.builder().build()
|
||||
def task = project.task('gobind', type: GobindTask)
|
||||
assertTrue(task instanceof GobindTask)
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user