我找到了这个关于如何使用 Groovy 的答案:
通过 Groovy/Grails 检测平台(Window 或 Linux):
if (System.properties['os.name'].toLowerCase().contains('windows')) {
println "it's Windows"
} else {
println "it's not Windows"
}
有没有更好的办法?
我找到了这个关于如何使用 Groovy 的答案:
通过 Groovy/Grails 检测平台(Window 或 Linux):
if (System.properties['os.name'].toLowerCase().contains('windows')) {
println "it's Windows"
} else {
println "it's not Windows"
}
有没有更好的办法?
实际上,我查看了 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
2020 年中期更新:仍在孵化中:
OperatingSystem os = org.gradle.nativeplatform.platform.internal.DefaultNativePlatform.currentOperatingSystem;
2019 年初更新:current()
已删除。
org.gradle.nativeplatform.platform.OperatingSystem.getDisplayName()
org.gradle.nativeplatform.platform.OperatingSystem.isLinux()
请记住,它仍在孵化中。
2018 年中更新:就像评论中提到的一样,现在这个类移到了不同的包,所以应该使用org.gradle.nativeplatform.platform.OperatingSystem.current()
截至 2015 年年中,Peter Kahn 的回答仍然有效。在 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))
}
}
它将在 MacOSOs.FAMILY_MAC
和Os.FAMILY_UNIX
MacOS 上返回 true。通常它不是你在构建脚本中需要的东西。
还有另一种使用 Gradle 2+ API 实现此目的的方法,即:
import org.gradle.internal.os.OperatingSystem;
task detect {
doLast {
println(OperatingSystem.current().isMacOsX())
println(OperatingSystem.current().isLinux())
}
}
查看org.gradle.nativeplatform.platform.OperatingSystem接口的文档。值得一提的是,该界面标有incubating annotation,即“该功能目前正在开发中,可能随时更改”。实现中的“内部”命名空间也给了我们一个提示,我们应该知道这可以改变,我们应该使用它。
但就我个人而言,我会选择这个解决方案。只是最好写一个包装类,以免弄乱,以防将来发生变化。
可以区分 Linux、Unix、Windows 和 OS X 之间的构建环境 - 而 Gradle nativeplatform.platform.OperatingSystem区分目标环境(包括FreeBSD和Solaris)。
import org.gradle.internal.os.OperatingSystem
String osName = OperatingSystem.current().getName();
String osVersion = OperatingSystem.current().getVersion();
println "*** $osName $osVersion was detected."
if (OperatingSystem.current().isLinux()) {
// Consider Linux.
} else if (OperatingSystem.current().isUnix()) {
// Consider UNIX.
} else if (OperatingSystem.current().isWindows()) {
// Consider Windows.
} else if (OperatingSystem.current().isMacOsX()) {
// Consider OS X.
} else {
// Unknown OS.
}
也可以使用 Ant 任务(source):
import org.apache.tools.ant.taskdefs.condition.Os
task checkWin() << {
if (Os.isFamily(Os.FAMILY_WINDOWS)) {
// Consider Windows.
}
}
或者您可以将 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;
}
}
编辑:
您可以对架构执行相同的操作:
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() 将返回:
getArch() 将在 Solaris 上返回“x86”或在任何其他平台上返回“i386”。
编辑2:
或者如果你想避免任何导入,你可以自己做:
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);
}
Gradle 不提供用于检测操作系统的公共 API。因此,os.
系统属性是您最好的选择。
我不喜欢通过属性或 Ant 任务检测 Gradle 中的操作系统,并且OperatingSystem
该类不再包含该current()
方法。
因此,在我看来,检测操作系统的最简洁方法是:
导入 DefaultNativePlatform:
import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform
然后DefaultNativePlatform
在您的任务中使用:
if (DefaultNativePlatform.getCurrentOperatingSystem().isWindows()) {
println 'Windows'
}
请注意,这种方法并不理想,因为它使用的是 Gradle 内部 API。
它使用 Gradle 4.10 进行了测试。
没有任何导入,我从System
类中获得了这些值,如下所示:
def osName = System.getProperty("os.name").toLowerCase(Locale.ENGLISH)
def osArch = System.getProperty("os.arch").toLowerCase(Locale.ENGLISH)
def osVersion = System.getProperty("os.version").toLowerCase(Locale.ENGLISH)