2012-06-27 12 views
61

encontré esta respuesta acerca de cómo hacerlo con maravilloso:cómo detectar el sistema operativo actual de 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" 
} 

¿Hay una mejor manera?

+0

eso es lo que uso, sin la parte 'toLowerCase(). Contains()', ya que solo necesito el nombre. –

+0

También puede obtener la versión del sistema operativo, con 'System.getProperty ('os.arch')' –

+6

'" WINDOWS ".toLowerCase()' depende de la configuración regional y devolverá 'wındows' (observe el i sin puntos) en las máquinas donde la localidad es turca Use 'toLowerCase (Locale.ROOT)' en lugar de estar en el lado seguro. –

Respuesta

83

En realidad, miré el proyecto Gradle y esto se ve un poco más limpio, ya que utiliza la estructura existente de la hormiga

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

encontré esto en la siguiente rama Gradle y parece que funciona muy bien gradle/gradle-core/branches/RB-0.3/build.gradle

+0

Bueno uno. Se ve mejor con importaciones estáticas. – JBaruch

+0

El enlace SVN es 404. El [build.gradle] actual (https://github.com/gradle/gradle/blob/master/build.gradle) tiene isWindows = org.gradle.internal.os.OperatingSystem.current () .windows – koppor

+5

tenga cuidado, Os.isFamily (Os.FAMILY_UNIX) devolverá verdadero tanto para unix como para mac (mientras que Os.isFamily (Os.FAMILY_MAC) también es válido – shabunc

4

Gradle no proporciona una API pública para detectar el sistema operativo. Por lo tanto, las propiedades del sistema os. son su mejor opción.

37

A partir de Summer'2015, la respuesta de Peter Kahn sigue siendo válida. La activación del perfil basada en el entorno todavía es algo relativamente fácil en maven. Pero tenga en cuenta que org.apache.tools.ant.taskdefs.condition.Os.isFamily no es exclusivo en el sentido de que si devuelve verdadero con un parámetro en particular no significa necesariamente que devuelve falso para ningún otro parámetro. Por ejemplo:

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

devolverá true tanto para Os.FAMILY_MAC y Os.FAMILY_UNIX en MacOS. Por lo general, no es algo que necesite en los scripts de compilación.

No es sin embargo otra forma de lograr esto usando API 2+ Gradle, a saber:

import org.gradle.internal.os.OperatingSystem; 

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

Salida doc para org.gradle.nativeplatform.platform.OperatingSystem interfaz. Vale la pena mencionar que esta interfaz está marcada con la anotación incubating, que es "la función es actualmente un trabajo en progreso y puede cambiar en cualquier momento". El espacio de nombres "interno" en la implementación también nos da una pista de que debemos hacerlo sabiendo que esto puede cambiar.

Pero personalmente iría con esta solución. Es solo que es mejor escribir una clase contenedora para no meter la pata en caso de que algo cambie en el futuro.

+6

¿Ha cambiado? El uso de Gradle 2.5 'OperatingSystem' no parece tener' .current() ' –

+3

tenga en cuenta el paquete interno:' org.gradle.internal.os.OperatingSystem.current() ' – Brian

11

Uno puede diferir del entornoacumulación de entre Linux, Unix, Windows y OSX - mientras que el Gradle nativeplatform.platform.OperatingSystem difiere del objetivo medio ambiente (incluido FreeBSD y Solaris.), En su lugar.

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