Как определить текущую ОС из gradle
Я нашел этот ответ о том, как это сделать с groovy:
обнаружение платформы (окна или Linux) с помощью groovy / grails:
if (System.properties['os.name'].toLowerCase().contains('windows')) {
println "it's Windows"
} else {
println "it's not Windows"
}
есть ли лучший способ?
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; } }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