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