Znalazłem tę odpowiedź, jak to zrobić z Groovym:
Wykrywanie platformy (Windows lub Linux) przez Groovy / Grails :
if (System.properties['os.name'].toLowerCase().contains('windows')) {
println "it's Windows"
} else {
println "it's not Windows"
}
Czy jest lepszy sposób?
toLowerCase().contains()
części, ponieważ potrzebuję tylko nazwy.System.getProperty('os.arch')
"WINDOWS".toLowerCase()
jest zależne od ustawień regionalnych i powróciwındows
(zwróć uwagę na bez kropki i) na komputerach, na których język jest turecki.toLowerCase(Locale.ROOT)
Zamiast tego użyj, aby być po bezpiecznej stronie.Odpowiedzi:
Właściwie przyjrzałem się projektowi Gradle i wygląda to trochę czyściej, ponieważ wykorzystuje istniejącą strukturę Anta :
Znalazłem to w następującej gałęzi Gradle i wydaje się, że działa dobrze. gradle / gradle-core / branches / RB-0.3 / build.gradle
źródło
task checkWin() << {
a po co ci to? możesz po prostu napisaćif (Os.isFamily(Os.FAMILY_WINDOWS)) { println "*** WINDOWS " }
org.gradle.internal.os.OperatingSystem
iif (OperatingSystem.current() == OperatingSystem.WINDOWS)
(jeśli mówimy o Gradle, dlaczego nie użyć własnych implementacji)Aktualizacja z połowy 2020 r . : Nadal inkubacja:
Aktualizacja z początku 2019 r . :
current()
usunięta.org.gradle.nativeplatform.platform.OperatingSystem.getDisplayName()
org.gradle.nativeplatform.platform.OperatingSystem.isLinux()
Pamiętaj, że nadal się inkubuje .
Aktualizacja z połowy 2018 r . : tak jak wspomniano w komentarzach, teraz ta klasa została przeniesiona do innego pakietu, więc należy użyć
org.gradle.nativeplatform.platform.OperatingSystem.current()
Od połowy 2015 roku odpowiedź Petera Kahna jest nadal aktualna. Aktywacja profilu oparta na środowisku jest nadal czymś stosunkowo łatwiejszym w Maven. Należy jednak pamiętać, że
org.apache.tools.ant.taskdefs.condition.Os.isFamily
nie jest to wykluczające w tym sensie, że jeśli zwraca prawdę z jednym określonym parametrem, niekoniecznie oznacza, że zwraca fałsz dla dowolnego innego parametru. Na przykład:Zwróci prawdę zarówno na MacOS, jak
Os.FAMILY_MAC
iOs.FAMILY_UNIX
na MacOS. Zwykle nie jest to coś, czego potrzebujesz w skryptach kompilacji.Jest jednak inny sposób osiągnięcia tego za pomocą Gradle 2+ API, a mianowicie:
Sprawdź dokumentację interfejsu org.gradle.nativeplatform.platform.OperatingSystem . Warto wspomnieć, że ten interfejs jest oznaczony inkubacją adnotacją , czyli „funkcja jest obecnie w toku i może ulec zmianie w dowolnym momencie”. „Wewnętrzna” przestrzeń nazw w implementacji również daje nam wskazówkę, że powinniśmy z niej korzystać, wiedząc, że może się to zmienić.
Ale osobiście wybrałbym to rozwiązanie. Po prostu lepiej jest napisać klasę opakowującą, aby nie zepsuć na wypadek, gdyby coś się zmieniło w przyszłości.
źródło
OperatingSystem
nie wydaje się mieć.current()
org.gradle.internal.os.OperatingSystem.current()
OperatingSystem
bezcurrent()
?OperatingSystem os = org.gradle.nativeplatform.platform.internal.DefaultNativePlatform.currentOperatingSystem
:; Szkoda, że nie było publicznego @PeterNiederwieserMożna rozróżnić środowisko kompilacji na Linux, Unix, Windows i OS X - podczas gdy Gradle nativeplatform.platform.OperatingSystem rozróżnia środowisko docelowe (w tym FreeBSD i Solaris ).
Można również użyć zadania Ant ( źródło ):
źródło
Gradle nie udostępnia publicznego interfejsu API do wykrywania systemu operacyjnego. Dlatego
os.
właściwości systemu są najlepszym rozwiązaniem.źródło
Lub możesz zdefiniować osName jako ciąg ...
... i użyj go później - aby dołączyć bibliotekę natywną, na przykład:
Ale to niczego by nie zmieniło, ponieważ OperatingSystem działa dokładnie tak, jak twój kod:
Źródło: https://github.com/gradle/gradle/blob/master/subprojects/base-services/src/main/java/org/gradle/internal/os/OperatingSystem.java
Edytować:
Możesz zrobić to samo dla architektury:
i:
Pamiętaj tylko, że funkcja getArch () zwróci:
getArch () zwróci „x86” w systemie Solaris lub „i386” na dowolnej innej platformie.
Edycja 2:
Jeśli chcesz uniknąć importu, możesz po prostu zrobić to sam:
źródło
Nie podoba mi się wykrywanie systemu operacyjnego w Gradle za pomocą właściwości lub zadania Ant, a
OperatingSystem
klasa nie zawiera jużcurrent()
metody.Moim zdaniem najczystszym sposobem na wykrycie systemu operacyjnego byłoby:
Importuj DefaultNativePlatform:
Następnie użyj
DefaultNativePlatform
w swoim zadaniu:Należy pamiętać, że ta metoda nie jest idealna, ponieważ korzysta z wewnętrznego interfejsu API Gradle.
Został przetestowany z Gradle 4.10.
źródło