Ich habe diese Antwort gefunden, wie es mit Groovy geht:
Erkennen der Plattform (Windows oder Linux) durch Groovy / Grails :
if (System.properties['os.name'].toLowerCase().contains('windows')) {
println "it's Windows"
} else {
println "it's not Windows"
}
Gibt es einen besseren Weg?
toLowerCase().contains()
Teil benutze, da ich nur den Namen brauche.System.getProperty('os.arch')
"WINDOWS".toLowerCase()
ist vom Gebietsschema abhängig und wirdwındows
auf Computern mit türkischem Gebietsschema zurückgegeben (beachten Sie das punktlose i). Verwenden SietoLowerCase(Locale.ROOT)
stattdessen, um auf der sicheren Seite zu sein.Antworten:
Eigentlich habe ich mir das Gradle-Projekt angesehen, und das sieht ein wenig sauberer aus, da es die vorhandene Struktur von Ant verwendet:
Ich habe dies im folgenden Gradle-Zweig gefunden, und es scheint gut zu funktionieren. Gradle / Gradle-Core / Zweige / RB-0.3 / build.gradle
quelle
task checkWin() << {
Wieso brauchst du es? Sie können einfach schreibenif (Os.isFamily(Os.FAMILY_WINDOWS)) { println "*** WINDOWS " }
org.gradle.internal.os.OperatingSystem
undif (OperatingSystem.current() == OperatingSystem.WINDOWS)
(wenn wir über Gradle sprechen, warum nicht ihre eigenen Implementierungen verwenden)Mitte 2020 Update : Noch inkubiert:
Anfang 2019 Update :
current()
entfernt.org.gradle.nativeplatform.platform.OperatingSystem.getDisplayName()
org.gradle.nativeplatform.platform.OperatingSystem.isLinux()
Denken Sie daran, dass es immer noch inkubiert .
Mitte 2018 Update : Genau wie in den Kommentaren erwähnt, wurde diese Klasse jetzt in ein anderes Paket verschoben, daher sollte man es verwenden
org.gradle.nativeplatform.platform.OperatingSystem.current()
Ab Mitte 2015 ist die Antwort von Peter Kahn noch gültig. Die umgebungsbasierte Profilaktivierung ist in Maven immer noch relativ einfach. Beachten Sie jedoch, dass dies
org.apache.tools.ant.taskdefs.condition.Os.isFamily
nicht in dem Sinne exklusiv ist, dass wenn es mit einem bestimmten Parameter true zurückgibt, dies nicht unbedingt bedeutet, dass es für jeden anderen Parameter false zurückgibt. Zum Beispiel:Es wird sowohl für
Os.FAMILY_MAC
als auchOs.FAMILY_UNIX
unter MacOS true zurückgeben . Normalerweise benötigen Sie dies nicht für Build-Skripte.Es gibt jedoch eine andere Möglichkeit, dies mithilfe der Gradle 2+ -API zu erreichen:
Lesen Sie die Dokumentation zur Schnittstelle org.gradle.nativeplatform.platform.OperatingSystem . Es ist erwähnenswert, dass diese Schnittstelle mit Inkubationsanmerkungen gekennzeichnet ist, dh "Die Funktion ist derzeit in Arbeit und kann jederzeit geändert werden". Der "interne" Namespace in der Implementierung gibt uns auch einen Hinweis, dass wir diesen verwenden sollten, da wir wissen, dass sich dies ändern kann.
Aber ich persönlich würde mich für diese Lösung entscheiden. Es ist nur besser, eine Wrapper-Klasse zu schreiben, um nicht durcheinander zu kommen, falls sich in Zukunft etwas ändern sollte.
quelle
OperatingSystem
scheint nicht zu haben.current()
org.gradle.internal.os.OperatingSystem.current()
OperatingSystem
ohnecurrent()
?OperatingSystem os = org.gradle.nativeplatform.platform.internal.DefaultNativePlatform.currentOperatingSystem
; Ich wünschte, es gäbe eine öffentliche @PeterNiederwieserMan kann die Build- Umgebung zwischen Linux, Unix, Windows und OS X unterscheiden - während das Gradle nativeplatform.platform.OperatingSystem die Zielumgebung (inkl. FreeBSD und Solaris ) unterscheidet.
Man kann auch eine Ant-Aufgabe ( Quelle ) verwenden:
quelle
Gradle bietet keine öffentliche API zum Erkennen des Betriebssystems. Daher sind die
os.
Systemeigenschaften die beste Wahl.quelle
Oder Sie können osName als Zeichenfolge definieren ...
... und später verwenden - um beispielsweise eine native Bibliothek einzuschließen:
Aber es würde nichts ändern, da OperatingSystem genau wie Ihr Code funktioniert:
Quelle: https://github.com/gradle/gradle/blob/master/subprojects/base-services/src/main/java/org/gradle/internal/os/OperatingSystem.java
Bearbeiten:
Sie können dasselbe für die Architektur tun:
und:
Beachten Sie jedoch, dass getArch () Folgendes zurückgibt:
getArch () gibt "x86" unter Solaris oder "i386" für jede andere Plattform zurück.
Bearbeiten 2:
Oder wenn Sie einen Import vermeiden möchten, können Sie dies einfach selbst tun:
quelle
Ich mag es nicht, das Betriebssystem in Gradle anhand von Eigenschaften oder einer Ant-Aufgabe zu erkennen, und die
OperatingSystem
Klasse enthält diecurrent()
Methode nicht mehr .Meiner Meinung nach wäre der sauberste Weg, das Betriebssystem zu erkennen, also:
DefaultNativePlatform importieren:
Dann verwenden Sie
DefaultNativePlatform
in Ihrer Aufgabe:Beachten Sie, dass diese Methode nicht ideal ist, da sie die interne Gradle-API verwendet.
Es wurde mit Gradle 4.10 getestet.
quelle