J'ai trouvé cette réponse sur la façon de le faire avec Groovy:
Détection de la plateforme (Windows ou Linux) par Groovy / Grails :
if (System.properties['os.name'].toLowerCase().contains('windows')) {
println "it's Windows"
} else {
println "it's not Windows"
}
Y a-t-il un meilleur moyen?
toLowerCase().contains()
pièce, car j'ai juste besoin du nom.System.getProperty('os.arch')
"WINDOWS".toLowerCase()
dépend de la locale et retournerawındows
(notez le i sans point) sur les machines où la locale est turque. UtiliseztoLowerCase(Locale.ROOT)
plutôt pour être du bon côté.Réponses:
En fait, j'ai regardé le projet Gradle, et cela semble un peu plus propre car il utilise la structure existante d'Ant :
J'ai trouvé cela dans la branche Gradle suivante, et cela semble bien fonctionner. gradle / gradle-core / branches / RB-0.3 / build.gradle
la source
task checkWin() << {
Pourquoi en avez-vous besoin? vous pouvez juste écrireif (Os.isFamily(Os.FAMILY_WINDOWS)) { println "*** WINDOWS " }
org.gradle.internal.os.OperatingSystem
etif (OperatingSystem.current() == OperatingSystem.WINDOWS)
(si nous parlons de Gradle, pourquoi ne pas utiliser leurs propres implémentations)Mise à jour mi-2020 : toujours en incubation:
Mise à jour début 2019 :
current()
supprimée.org.gradle.nativeplatform.platform.OperatingSystem.getDisplayName()
org.gradle.nativeplatform.platform.OperatingSystem.isLinux()
Gardez à l'esprit qu'il est toujours en incubation .
Mise à jour mi-2018 : tout comme cela a été mentionné dans les commentaires, cette classe est maintenant déplacée vers un package différent, il faut donc utiliser
org.gradle.nativeplatform.platform.OperatingSystem.current()
À la mi-2015, la réponse de Peter Kahn est toujours valable. L'activation de profil basée sur l'environnement est toujours quelque chose de relativement plus facile dans Maven. Mais gardez à l'esprit que ce
org.apache.tools.ant.taskdefs.condition.Os.isFamily
n'est pas exclusif dans le sens où s'il renvoie true avec un paramètre particulier, cela ne signifie pas nécessairement qu'il renvoie false pour tout autre paramètre. Par exemple:Cela reviendra vrai à la fois pour
Os.FAMILY_MAC
etOs.FAMILY_UNIX
sur MacOS. Ce n'est généralement pas quelque chose dont vous avez besoin dans les scripts de construction.Il existe cependant un autre moyen d'y parvenir en utilisant l'API Gradle 2+, à savoir:
Consultez la documentation de l' interface org.gradle.nativeplatform.platform.OperatingSystem . Il convient de mentionner que cette interface est marquée d'une annotation d' incubation , c'est-à-dire que "la fonctionnalité est actuellement en cours de travail et peut changer à tout moment". L'espace de noms "interne" dans l'implémentation nous donne également une indication que nous devrions l'utiliser en sachant que cela peut changer.
Mais personnellement, j'irais avec cette solution. C'est juste qu'il vaut mieux écrire une classe wrapper pour ne pas gâcher au cas où quelque chose changerait dans le futur.
la source
OperatingSystem
ne semble pas avoir.current()
org.gradle.internal.os.OperatingSystem.current()
OperatingSystem
sanscurrent()
?OperatingSystem os = org.gradle.nativeplatform.platform.internal.DefaultNativePlatform.currentOperatingSystem
; souhaite qu'il y en ait un public @PeterNiederwieserOn peut différencier l' environnement de construction entre Linux, Unix, Windows et OS X - tandis que Gradle nativeplatform.platform.OperatingSystem différencie l' environnement cible (y compris FreeBSD et Solaris ).
On peut également utiliser une tâche Ant ( source ):
la source
Gradle ne fournit pas d'API publique pour détecter le système d'exploitation. Par conséquent, les
os.
propriétés du système sont votre meilleur choix.la source
Ou vous pouvez définir osName comme une chaîne ...
... et l'utiliser plus tard - pour inclure une bibliothèque native par exemple:
Mais cela ne changerait rien puisque OperatingSystem fonctionne exactement comme votre code:
Source: https://github.com/gradle/gradle/blob/master/subprojects/base-services/src/main/java/org/gradle/internal/os/OperatingSystem.java
Éditer:
Vous pouvez faire de même pour l'architecture:
et:
Sachez simplement que getArch () retournera:
getArch () retournera "x86" sur Solaris ou "i386" pour toute autre plate-forme.
Modifier 2:
Ou si vous souhaitez éviter toute importation, vous pouvez simplement le faire vous-même:
la source
Je n'aime pas détecter le système d'exploitation dans Gradle via des propriétés ou une tâche Ant, et la
OperatingSystem
classe ne contient plus lacurrent()
méthode.Donc, à mon avis, le moyen le plus propre de détecter le système d'exploitation serait:
Importer DefaultNativePlatform:
Ensuite, utilisez
DefaultNativePlatform
dans votre tâche:Gardez à l'esprit que cette méthode n'est pas idéale car elle utilise l'API interne de Gradle.
Il a été testé avec Gradle 4.10.
la source