2012-06-27 3 views
61

Znalazłem odpowiedź na temat, jak to zrobić z Groovy:Jak wykryć aktualny system operacyjny z Gradle

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

Czy istnieje lepszy sposób?

+0

to jest to, czego używam, bez części 'toLowerCase(). Zawiera()', ponieważ po prostu potrzebuję nazwy. –

+0

Możesz także pobrać wersję systemu operacyjnego z 'System.getProperty ('os.arch')' –

+6

'" WINDOWS ".toLowerCase()' jest zależne od ustawień regionalnych i zwróci 'wındows' (zwróć uwagę na kropkę i) na komputerach, gdzie lokalizacja jest turecka. Zamiast tego używaj 'toLowerCase (Locale.ROOT)' po bezpiecznej stronie. –

Odpowiedz

83

Faktycznie, spojrzałem w projekcie Gradle i wygląda to trochę czystsze, ponieważ wykorzystuje ant istniejącą strukturę

import org.apache.tools.ant.taskdefs.condition.Os 
task checkWin() << { 
    if (Os.isFamily(Os.FAMILY_WINDOWS)) { 
     println "*** WINDOWS " 
    } 
} 

Znalazłem to w następujący Gradle gałęzi i wydaje się działać dobrze gradle/gradle-core/branches/RB-0.3/build.gradle

+0

Dobra. Wygląda jeszcze lepiej dzięki importom statycznym. – JBaruch

+0

Łącze SVN ma wartość 404. Bieżący [build.gradle] (https://github.com/gradle/gradle/blob/master/build.gradle) ma wartość isWindows = org.gradle.internal.os.OperatingSystem.current () .windows – koppor

+5

Ostrzegam, Os.isFamily (Os.FAMILY_UNIX) zwróci true zarówno dla unix jak i mac (podczas gdy Os.isFamily (Os.FAMILY_MAC) jest również ważny – shabunc

4

Gradle nie udostępnia publicznego interfejsu API do wykrywania systemu operacyjnego. W związku z tym właściwości systemu os. są najlepszym wyborem.

37

Począwszy od lata'2015, odpowiedź Petera Kahna jest nadal aktualna. Aktywacja profilu w oparciu o środowisko jest nadal czymś, co można zrobić stosunkowo łatwiej w maven. Należy jednak pamiętać, że org.apache.tools.ant.taskdefs.condition.Os.isFamily nie jest wyłączny w tym sensie, że jeśli zwraca true z jednym konkretnym parametrem, nie oznacza to, że zwraca on wartość false dla dowolnego innego parametru. Na przykład:

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

zwróci true zarówno dla Os.FAMILY_MAC i Os.FAMILY_UNIX na MacOS. Zwykle nie jest to coś, czego potrzebujesz w skryptach kompilacji.

Istnieje jednak inny sposób na osiągnięcie tego przy użyciu Gradle 2+ API, a mianowicie:

import org.gradle.internal.os.OperatingSystem; 

task detect { 
    doLast { 
     println(OperatingSystem.current().isMacOsX()) 
     println(OperatingSystem.current().isLinux()) 
    } 
} 

odjazdu doc ​​dla org.gradle.nativeplatform.platform.OperatingSystem interfejsu. Warto wspomnieć, że ten interfejs jest oznaczony adnotacją incubating, czyli "funkcja jest aktualnie w toku i może się zmienić w dowolnym momencie". "Wewnętrzna" przestrzeń nazw w implementacji daje nam również wskazówkę, że powinniśmy to wiedzieć, wiedząc, że to się może zmienić.

Osobiście jednak skorzystam z tego rozwiązania. Chodzi o to, że lepiej napisać klasę wrappera, żeby nie zepsuć na wypadek, gdyby coś zmieniło się w przyszłości.

+6

Czy to się zmieniło? Korzystanie z programu Gradle 2.5 "OperatingSystem" wydaje się, że '.current()' –

+3

nie uwzględnia pakietu wewnętrznego: 'org.gradle.internal.os.OperatingSystem.current()' – Brian

11

One mogą różnić się gromadzeniu środowiska pomiędzy Linux, UNIX, Windows i OSX - natomiast Gradle nativeplatform.platform.OperatingSystem się różni cel środowisko (w tym FreeBSD i Solaris.), Zamiast.

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