如何从gradle中检测当前的操作系统

时间:2012-06-27 22:22:08

标签: gradle

我找到了关于如何使用groovy做到这一点的答案:

Detecting the platform (Window or Linux) by groovy/grails

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

有更好的方法吗?

6 个答案:

答案 0 :(得分:106)

实际上,我看了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

答案 1 :(得分:54)

早期&#39; 2019更新current()已移除。

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

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

请注意,它仍然是incubating

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))
    }   
}

MacOS上的Os.FAMILY_MACOs.FAMILY_UNIX都会返回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注释,即&#34;该功能目前正在进行中,可能随时更改&#34;。 &#34;内部&#34;实现中的命名空间也给了我们一个暗示,我们应该知道这可以改变。

但我个人认为这个解决方案。只是最好编写一个包装类,以防万一以后会发生变化。

答案 2 :(得分:13)

可以区分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.
}

答案 3 :(得分:6)

Gradle不提供用于检测操作系统的公共API。因此,os.系统属性是您最好的选择。

答案 4 :(得分:2)

或者您可以将osName定义为String ...

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

编辑:

你可以为Arch做同样的事情:

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上的”ppc“
  • “amd64”on 64b
  • “i386”或32b上的“x86”。

getArch()将在Solaris上返回“x86”,在任何其他平台上返回“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);
}

答案 5 :(得分:0)

我不喜欢通过属性或Ant任务在Gradle中检测操作系统,并且OperatingSystem类不再包含current()方法。

因此,我认为检测操作系统最干净的方法是:

导入DefaultNativePlatform。

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

然后在任务中使用DefaultNativePlatform

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

请注意,此方法不理想,因为它使用了Gradle内部API。 经过Gradle 4.10测试。稍后,我将发布有关Gradle 5的更新。