Как определить текущую ОС из gradle



Я нашел этот ответ о том, как это сделать с groovy:



обнаружение платформы (окна или Linux) с помощью groovy / grails:



if (System.properties['os.name'].toLowerCase().contains('windows')) {
println "it's Windows"
} else {
println "it's not Windows"
}


есть ли лучший способ?

510   5  

5 ответов:

на самом деле, я посмотрел на проект gradle, и это выглядит немного чище, поскольку он использует существующую структуру ant

import org.apache.tools.ant.taskdefs.condition.Os
task checkWin() << {
    if (Os.isFamily(Os.FAMILY_WINDOWS)) {
        println "*** WINDOWS "
    }
}

Я нашел это в следующей ветке gradle, и это, кажется, работает хорошо gradle/gradle-core/branch/RB-0.3 / build.gradle

Mid'2018 Update: так же, как это было упомянуто в комментариях, теперь этот класс перешел в другой пакет, поэтому следует использовать org.gradle.nativeplatform.platform.OperatingSystem.current()

имейте в виду, что это все-таки закладки хотя.


по состоянию на лето ' 2015, ответ Питера Кана все еще действителен. Активация профиля на основе среды по-прежнему является чем-то относительно простым в maven. Но имейте в виду, что org.apache.tools.ant.taskdefs.condition.Os.isFamily - это не эксклюзивное смысл в том, что если он возвращает true с одним конкретным параметром, это не обязательно означает, что он возвращает false для любого другого параметра. Например:

import org.apache.tools.ant.taskdefs.condition.Os
task detect {
    doLast {
        println(Os.isFamily(Os.FAMILY_WINDOWS))
        println(Os.isFamily(Os.FAMILY_MAC))
        println(Os.isFamily(Os.FAMILY_UNIX))
    }   
}

вернет true как для Os.FAMILY_MAC и Os.FAMILY_UNIX на MacOS. Обычно это не то, что вам нужно в скриптах сборки.

есть еще один способ добиться этого с помощью gradle 2 + API, а именно:

import org.gradle.internal.os.OperatingSystem;

task detect {
    doLast {
        println(OperatingSystem.current().isMacOsX())
        println(OperatingSystem.current().isLinux())
    }   
}

Проверьте doc для org.градля.nativeplatform.платформа.Операционной системы взаимодействие. Стоит отметить, что этот интерфейс помечается закладки аннотация, то есть"объект в настоящее время находится в стадии разработки и может измениться в любое время". "Внутреннее" пространство имен в реализации также дает нам намек на то, что мы должны это знать, зная, что это может измениться.

но лично я бы пошел с этим решением. Просто лучше написать класс-оболочку, чтобы не испортить, если что-то изменится в будущем.

можно отличить построить среда между Linux, Unix, Windows и OSX-в то время как Gradle nativeplatform.платформа.Операционной системы отличается цель окружающая среда (ВКЛ. FreeBSD и Solaris), вместо этого.

String osName = org.gradle.internal.os.OperatingSystem.current().getName();
String osVersion = org.gradle.internal.os.OperatingSystem.current().getVersion();
println "*** $osName $osVersion was detected."

if (org.gradle.internal.os.OperatingSystem.current().isLinux()) {
    // consider Linux.
} else if (org.gradle.internal.os.OperatingSystem.current().isUnix()) {
    // consider UNIX.
} else if (org.gradle.internal.os.OperatingSystem.current().isWindows()) {
    // consider Windows.
} else if (org.gradle.internal.os.OperatingSystem.current().isMacOsX()) {
    // consider OSX.
} else {
    // unknown OS.
}

Gradle не предоставляет публичный API для обнаружения операционной системы. Отсюда и os. свойства системы - это ваш лучший выбор.

или вы можете определить osName как строку ...

import org.gradle.internal.os.OperatingSystem

switch (OperatingSystem.current()) {
    case OperatingSystem.LINUX:
        project.ext.osName = "linux";
        break ;
    case OperatingSystem.MAC_OS:
        project.ext.osName = "macos";
        break ;
    case OperatingSystem.WINDOWS:
        project.ext.osName = "windows";
        break ;
}

... и используйте его позже-чтобы включить родную библиотеку, например:

run {
    systemProperty "java.library.path", "lib/$osName"
}

но это ничего не изменит, так как OperatingSystem работает точно так же, как ваш код:

public static OperatingSystem forName(String os) {
    String osName = os.toLowerCase();
    if (osName.contains("windows")) {
        return WINDOWS;
    } else if (osName.contains("mac os x") || osName.contains("darwin") || osName.contains("osx")) {
        return MAC_OS;
    } else if (osName.contains("sunos") || osName.contains("solaris")) {
        return SOLARIS;
    } else if (osName.contains("linux")) {
        return LINUX;
    } else if (osName.contains("freebsd")) {
        return FREE_BSD;
    } else {
        // Not strictly true
        return UNIX;
    }
}

источник: https://github.com/gradle/gradle/blob/master/subprojects/base-services/src/main/java/org/gradle/internal/os/OperatingSystem.java

Edit:

вы можете сделать то же самое для арка:

project.ext.osArch = OperatingSystem.current().getArch();
if ("x86".equals(project.ext.osArch)) {
    project.ext.osArch = "i386";
}

и:

run {
    systemProperty "java.library.path", "lib/$osName/$osArch"
}

просто знайте, что getArch () вернется:

  • " ppc " на PowerPC
  • "amd64" на 64b
  • "i386" или " x86 " на 32b.

getArch () вернет "x86" на Solaris или "i386" для любой другой платформы.

Edit2:

или если вы хотите избежать любого импорта, вы можете просто сделать это самостоятельно:

def getOsName(project) {
    final String    osName = System.getProperty("os.name").toLowerCase();

    if (osName.contains("linux")) {
        return ("linux");
    } else if (osName.contains("mac os x") || osName.contains("darwin") || osName.contains("osx")) {
        return ("macos");
    } else if (osName.contains("windows")) {
        return ("windows");
    } else if (osName.contains("sunos") || osName.contains("solaris")) {
        return ("solaris");
    } else if (osName.contains("freebsd")) {
        return ("freebsd");
    }
    return ("unix");
}

def getOsArch(project) {
    final String    osArch = System.getProperty("os.arch");

    if ("x86".equals(osArch)) {
        return ("i386");
    }
    else if ("x86_64".equals(osArch)) {
        return ("amd64");
    }
    else if ("powerpc".equals(osArch)) {
        return ("ppc");
    }
    return (osArch);
}

Comments

    Ничего не найдено.