Eu encontrei esta resposta sobre como fazer isso com o Groovy:
Detectando a plataforma (Windows ou Linux) por Groovy / Grails :
if (System.properties['os.name'].toLowerCase().contains('windows')) {
println "it's Windows"
} else {
println "it's not Windows"
}
Existe uma maneira melhor?
toLowerCase().contains()
parte, pois só preciso do nome.System.getProperty('os.arch')
"WINDOWS".toLowerCase()
depende da localidade e retornaráwındows
(observe o i sem ponto) em máquinas nas quais a localidade é turco. Use emtoLowerCase(Locale.ROOT)
vez disso para estar do lado seguro.Respostas:
Na verdade, eu olhei para o projeto Gradle, e ele parece um pouco mais limpo, pois usa a estrutura existente do Ant :
Eu encontrei isso no seguinte branch do Gradle e parece funcionar bem. gradle / gradle-core / branches / RB-0.3 / build.gradle
fonte
task checkWin() << {
por que você precisa disso? você pode simplesmente escreverif (Os.isFamily(Os.FAMILY_WINDOWS)) { println "*** WINDOWS " }
org.gradle.internal.os.OperatingSystem
eif (OperatingSystem.current() == OperatingSystem.WINDOWS)
(se falamos sobre Gradle, por que não usar suas próprias implementações)Atualização de meados de 2020 : Ainda incubando:
Atualização do início de 2019 :
current()
removida.org.gradle.nativeplatform.platform.OperatingSystem.getDisplayName()
org.gradle.nativeplatform.platform.OperatingSystem.isLinux()
Tenha em mente que ainda está incubando .
Atualização de meados de 2018 : assim como foi mencionado nos comentários, agora esta classe mudou para um pacote diferente, portanto, deve-se usar
org.gradle.nativeplatform.platform.OperatingSystem.current()
Em meados de 2015, a resposta de Peter Kahn ainda é válida. A ativação do perfil com base no ambiente ainda é algo relativamente mais fácil no Maven. Mas tenha em mente que isso
org.apache.tools.ant.taskdefs.condition.Os.isFamily
não é exclusivo no sentido de que se retornar verdadeiro com um parâmetro específico, não significa necessariamente que retornará falso para qualquer outro parâmetro. Por exemplo:Ele retornará verdadeiro para
Os.FAMILY_MAC
eOs.FAMILY_UNIX
no MacOS. Normalmente não é algo que você precisa em scripts de construção.No entanto, existe outra maneira de fazer isso usando a API Gradle 2+, a saber:
Verifique a documentação da interface org.gradle.nativeplatform.platform.OperatingSystem . Vale ressaltar que esta interface é marcada com anotação de incubação , ou seja, "o recurso está em andamento e pode ser alterado a qualquer momento". O namespace "interno" na implementação também nos dá uma dica de que devemos usá-lo sabendo que isso pode mudar.
Mas pessoalmente, eu escolheria essa solução. É só que é melhor escrever uma classe de wrapper para não bagunçar caso algo mude no futuro.
fonte
OperatingSystem
não parece ter.current()
org.gradle.internal.os.OperatingSystem.current()
OperatingSystem
semcurrent()
?OperatingSystem os = org.gradle.nativeplatform.platform.internal.DefaultNativePlatform.currentOperatingSystem
:; gostaria que houvesse um público @PeterNiederwieserPode-se diferenciar o ambiente de construção entre Linux, Unix, Windows e OS X - enquanto o Gradle nativeplatform.platform.OperatingSystem diferencia o ambiente de destino (incl. FreeBSD e Solaris ).
Também se pode usar uma tarefa Ant ( fonte ):
fonte
O Gradle não fornece uma API pública para detectar o sistema operacional. Portanto, as
os.
propriedades do sistema são sua melhor aposta.fonte
Ou você pode definir osName como uma string ...
... e usá-lo mais tarde - para incluir uma biblioteca nativa, por exemplo:
Mas isso não mudaria nada, já que OperatingSystem funciona exatamente como seu código:
Fonte: https://github.com/gradle/gradle/blob/master/subprojects/base-services/src/main/java/org/gradle/internal/os/OperatingSystem.java
Editar:
Você pode fazer o mesmo para a arquitetura:
e:
Esteja ciente de que getArch () retornará:
getArch () retornará "x86" no Solaris ou "i386" para qualquer outra plataforma.
Editar 2:
Ou, se quiser evitar qualquer importação, pode simplesmente fazer você mesmo:
fonte
Não gosto de detectar o sistema operacional no Gradle por meio de propriedades ou uma tarefa Ant, e a
OperatingSystem
classe não contém mais ocurrent()
método.Portanto, na minha opinião, a maneira mais limpa de detectar o sistema operacional seria:
Importar DefaultNativePlatform:
Em seguida, use
DefaultNativePlatform
em sua tarefa:Lembre-se de que esse método não é ideal, pois usa a API interna do Gradle.
Ele foi testado com Gradle 4.10.
fonte