Лучший способ справиться с образцом Gradle? - PullRequest
1 голос
/ 08 октября 2019

Я использую машину с двойной загрузкой. В основном я буду писать код в Linux (Linux Mint 18.3), но иногда в разделе W10.

В данном проекте Gradle я всегда хочу, чтобы вывод exeutables, используя "installDist", перемещался в одно и то же место. Поэтому я включил следующие строки в свой build.gradle:

def currentOS = org.gradle.internal.os.OperatingSystem.current()
def platform
if (currentOS.isWindows()) {
    platform = 'win'
} else if (currentOS.isLinux()) {
    platform = 'linux'
} else if (currentOS.isMacOsX()) {
    // platform = 'mac'
    throw new Exception( "not configured for Mac OS: $currentOS" )
}
else {
    throw new Exception( "attempt to run on unknown platform: $currentOS" )
}
println "OS/platform |$platform|"
String operativeDir
def homePath = System.properties['user.home']
// in W10 homePath is apparently "D:\My Documents"
// in linux homePath is "/home/mike"
// no doubt I could use java.nio.file.Path for a more elegant solution:
String pathSeparator = platform == 'linux'? '/' : '\\'
// would be better to get the My Documents path from an Env Var in Linux:
String myDoxPath = platform == 'linux'? '/media/mike/W10 D drive/My Documents' : homePath 
operativeDir = "$myDoxPath${pathSeparator}software projects${pathSeparator}operative${pathSeparator}${name}"
// get version number: must be a version.properties file at the path indicated
ConfigObject conf = new ConfigSlurper().parse( file("src/main/resources/version.properties").toURI().toURL())
version = conf.versionNumber
println "version is $version"

installDist{
    destinationDir = file( "$operativeDir/$version" )
}

... дело в том, что все это шаблонно: я хочу включить его в каждый разрабатываемый мной проект. На данный момент это загромождает мой build.gradle. Каков стандартный / лучший способ «загрузить» этот шаблон как модуль для Gradle?

1 Ответ

1 голос
/ 09 октября 2019

Как отмечалось в комментариях usr-local-ΕΨΗΕΛΩΝ, пользовательский плагин Gradle является решением, если вы обнаружите дублирующую логику сборки во многих проектах.

Вы можете использовать Плагин инициализации сборки , чтобысоздать скелет Gradle плагин. Вы захотите установить Gradle глобально, чтобы вызывать gradle где угодно. См. Инструкции здесь для установки Gradle.

Так, например, чтобы определить свойство platform, ваш плагин может сделать следующее:

import org.gradle.api.GradleException;
import org.gradle.api.Project;
import org.gradle.api.Plugin;
import org.gradle.internal.os.OperatingSystem;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ExamplePlugin implements Plugin<Project> {

    private static final Logger log = LoggerFactory.getLogger(ExamplePlugin.class);

    public void apply(Project project) {
        String platform = inferPlatform(project);
        project.getExtensions().getExtraProperties().set("platform", platform);
        log.info("OS/platform |{}|", platform);
    }

    private String inferPlatform(Project project) {
        // OperatingSystem is an INTERNAL package.
        // It is strongly recommended you not use internal Gradle APIs.
        OperatingSystem currentOS = OperatingSystem.current();
        if (currentOS.isWindows()) {
            return "win";
        } else if (currentOS.isLinux()) {
            return "linux";
        } else {
            throw new GradleException("unsupported OS: " + currentOS.toString());
        }
    }
}

I 'Мы привели пример Java, но вы также можете написать свой плагин на Groovy или Kotlin.

Когда у вас есть плагин, просто опубликуйте его локально или на портале плагинов Gradle.

...