Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Раннее обновление'2019: current() удалено.

org.gradle.nativeplatform.platform.OperatingSystem.getDisplayName()

org.gradle.nativeplatform.platform.OperatingSystem.isLinux()

Имейте в виду, что это все еще насиживает хотя.

Середина обновления 2011 года: так же, как это было упомянуто в комментариях, теперь этот класс перемещен в другой пакет, поэтому следует использовать 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))
    }   
}

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

Существует, однако, другой способ добиться этого с помощью API gradle 2+, а именно:

import org.gradle.internal.os.OperatingSystem;

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

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

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

Ответ 3

Можно отличать среду строить между Linux, Unix, Windows и OSX, а Gradle nativeplatform.platform.OperatingSystem отличается целевой средой (включая 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.
}

Ответ 4

Gradle не предоставляет общедоступный API для обнаружения операционной системы. Следовательно, ваши лучшие свойства os. - ваш лучший выбор.

Ответ 5

Или вы можете определить 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

Редактировать:

Вы можете сделать то же самое для Арки:

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() вернет:

  • "КПК" на 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);
}

Ответ 6

Мне не нравится обнаруживать ОС в Gradle через свойства или задачу Ant, а класс OperatingSystem больше не содержит метод current().

Так что, на мой взгляд, самый чистый способ обнаружения ОС был бы:

Импортировать DefaultNativePlatform.

import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform

Затем используйте DefaultNativePlatform в своей задаче.

if (DefaultNativePlatform.getCurrentOperatingSystem().isWindows()) {
   println 'Windows'
}

Имейте в виду, что этот метод не идеален, так как использует внутренний API Gradle. Протестировано с Gradle 4.10. Я поставлю обновление относительно Gradle 5 позже.