Gradleから現在のOSを検出する方法


98

私はGroovyでそれを行う方法についてこの答えを見つけました:

Groovy / Grailsによるプラットフォーム(ウィンドウまたはLinux)の検出

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

もっと良い方法はありますか?


toLowerCase().contains()名前が必要なだけなので、パートなしで使用します。
Kevin Welker

また、OSバージョンも取得できますSystem.getProperty('os.arch')
Kevin Welker

13
"WINDOWS".toLowerCase()ロケールに依存しwındows、ロケールがトルコ語であるマシンでは(ドットなしのiに注意)を返します。toLowerCase(Locale.ROOT)安全のために代わりに使用してください。
Matthias Braun

回答:


125

実際、私は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


7
警告します、Os.isFamily(Os.FAMILY_UNIX)はunixとmacの両方でtrueを返します(一方、Os.isFamily(Os.FAMILY_MAC)も有効です
shabunc、2015

3
これは確かにOSであり、開始されたシェルグラドルについては何も表示されていないことに注意してください(たとえば、Mingw、Cygwin、またはその他のbashシェルなど)。そのため、環境変数を読み取るためにそれを使用する場合は、期待どおりにならない可能性があるので注意してください。
estani 2017年

2
@shabuncはorg.gradle.internal.os.OperatingSystemを使用したより良いソリューションを持っています
Peter Kahn

task checkWin() << {なぜあなたはそれが必要なのですか?あなたは書くことができますif (Os.isFamily(Os.FAMILY_WINDOWS)) { println "*** WINDOWS " }
user25

またorg.gradle.internal.os.OperatingSystemif (OperatingSystem.current() == OperatingSystem.WINDOWS)(Gradleについて話す場合は、独自の実装を使用しないのはなぜ
ですか

67

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、1つの特定のパラメーターで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_UNIXMacOSの両方で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アノテーションでマークされていること、つまり、「この機能は現在進行中の作業であり、いつでも変更される可能性がある」ことに言及する価値があります。実装の「内部」名前空間は、これが変更される可能性があることを認識してこれを使用する必要があるというヒントも与えます。

しかし、個人的には私はこの解決策を使います。将来何かが変わった場合に混乱しないようにラッパークラスを書く方が良いというだけです。


8
変わった?Gradle 2.5を使用OperatingSystemしていないようです.current()
Ross Drew

6
内部パッケージを気にします:org.gradle.internal.os.OperatingSystem.current()
ブライアン

@danblack OperatingSystemなしでインスタンスを取得するにはどうすればよいですcurrent()か?
TWiStErRob

1
1つ見つかりました:OperatingSystem os = org.gradle.nativeplatform.platform.internal.DefaultNativePlatform.currentOperatingSystem; 公開された@PeterNiederwieser
TWiStErRobが

Mac OS、Windows、Linuxだけがオペレーティングシステムではないため、z / OSが含まれていると便利です。困ったけれども、他のどれでもないという選択をすることはうまくいくかもしれません。
John Czukkermann

18

Linux、Unix、Windows、OS Xの間でビルド環境を区別できますが、Gradle nativeplatform.platform.OperatingSystemターゲット環境(FreeBSDSolarisを含む)を区別します。

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


7

または、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上の「ppc」
  • 64bの「amd64」
  • 32bでは「i386」または「x86」。

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

4

プロパティやAntタスクを介してGradleでOSを検出したくないので、OperatingSystemクラスにcurrent()メソッドが含まれなくなりました。

したがって、私の意見では、OSを検出する最もクリーンな方法は次のとおりです。

DefaultNativePlatformのインポート:

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

次にDefaultNativePlatform、タスクで使用します。

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

このメソッドはGradle内部APIを使用しているため、このメソッドは理想的ではないことに注意してください。

Gradle 4.10でテストされています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.