Saya menemukan jawaban ini tentang cara melakukannya dengan Groovy:
Mendeteksi platform (Window atau Linux) oleh Groovy / Grails :
if (System.properties['os.name'].toLowerCase().contains('windows')) {
println "it's Windows"
} else {
println "it's not Windows"
}
Apakah ada cara yang lebih baik?
toLowerCase().contains()
bagian, karena saya hanya butuh nama.System.getProperty('os.arch')
"WINDOWS".toLowerCase()
bergantung pada lokal dan akan kembaliwındows
(perhatikan i dotless) pada mesin yang lokalnya adalah Turki. GunakantoLowerCase(Locale.ROOT)
sebagai gantinya untuk berada di sisi yang aman.Jawaban:
Sebenarnya, saya melihat proyek Gradle, dan ini terlihat sedikit lebih bersih karena menggunakan struktur Ant yang ada:
Saya menemukan ini di cabang Gradle berikut, dan tampaknya berfungsi dengan baik. gradle / gradle-core / Branches / RB-0.3 / build.gradle
sumber
task checkWin() << {
kenapa kamu membutuhkannya Anda bisa menulisif (Os.isFamily(Os.FAMILY_WINDOWS)) { println "*** WINDOWS " }
org.gradle.internal.os.OperatingSystem
danif (OperatingSystem.current() == OperatingSystem.WINDOWS)
(jika kita berbicara tentang Gradle mengapa tidak menggunakan implementasinya sendiri)Pembaruan Pertengahan 2020 : Masih dalam inkubasi:
Pembaruan Awal 2019 :
current()
dihapus.org.gradle.nativeplatform.platform.OperatingSystem.getDisplayName()
org.gradle.nativeplatform.platform.OperatingSystem.isLinux()
Perlu diingat bahwa itu masih dalam proses inkubasi .
Pembaruan Pertengahan 2018 : seperti yang disebutkan di komentar, sekarang kelas ini dipindahkan ke paket yang berbeda, jadi harus digunakan
org.gradle.nativeplatform.platform.OperatingSystem.current()
Sampai pertengahan 2015, jawaban Peter Kahn masih berlaku. Aktivasi profil berbasis lingkungan masih merupakan sesuatu yang relatif lebih mudah dilakukan di Maven. Namun perlu diingat bahwa
org.apache.tools.ant.taskdefs.condition.Os.isFamily
tidak eksklusif dalam arti bahwa jika mengembalikan nilai benar dengan satu parameter tertentu, itu tidak berarti bahwa ia mengembalikan salah untuk parameter lainnya. Misalnya:Ini akan mengembalikan true baik untuk
Os.FAMILY_MAC
danOs.FAMILY_UNIX
di MacOS. Biasanya itu bukan sesuatu yang Anda butuhkan dalam skrip build.Ada cara lain untuk mencapai ini menggunakan Gradle 2+ API, yaitu:
Lihat dokumentasi untuk antarmuka org.gradle.nativeplatform.platform.OperatingSystem . Perlu disebutkan bahwa antarmuka ini ditandai dengan anotasi inkubasi , yaitu, "fitur saat ini sedang dalam proses dan dapat berubah kapan saja". Namespace "internal" dalam implementasi juga memberi kita petunjuk bahwa kita harus menggunakan ini dengan kesadaran bahwa ini bisa berubah.
Tetapi secara pribadi saya akan menggunakan solusi ini. Hanya saja lebih baik menulis kelas pembungkus agar tidak mengacaukan jika sesuatu akan berubah di masa depan.
sumber
OperatingSystem
sepertinya tidak harus.current()
org.gradle.internal.os.OperatingSystem.current()
OperatingSystem
tanpacurrent()
?OperatingSystem os = org.gradle.nativeplatform.platform.internal.DefaultNativePlatform.currentOperatingSystem
:; berharap ada yang publik @PeterNiederwieserOrang dapat membedakan lingkungan build di antara Linux, Unix, Windows, dan OS X - sedangkan Gradle nativeplatform.platform.OperatingSystem membedakan lingkungan target (termasuk FreeBSD dan Solaris ).
Seseorang juga dapat menggunakan tugas Ant ( sumber ):
sumber
Gradle tidak menyediakan API publik untuk mendeteksi sistem operasi. Karenanya
os.
properti sistem adalah pilihan terbaik Anda.sumber
Atau Anda dapat mendefinisikan osName sebagai string ...
... dan gunakan nanti - untuk menyertakan perpustakaan asli misalnya:
Tetapi itu tidak akan mengubah apa pun karena OperatingSystem bekerja persis seperti kode Anda:
Sumber: https://github.com/gradle/gradle/blob/master/subprojects/base-services/src/main/java/org/gradle/internal/os/OperatingSystem.java
Edit:
Anda dapat melakukan hal yang sama untuk arsitektur:
dan:
Ketahuilah bahwa getArch () akan mengembalikan:
getArch () akan mengembalikan "x86" pada Solaris atau "i386" untuk platform lain.
Edit 2:
Atau jika Anda ingin menghindari impor apa pun, Anda dapat melakukannya sendiri:
sumber
Saya tidak suka mendeteksi OS di Gradle melalui properti atau tugas Ant, dan
OperatingSystem
kelas tersebut tidak lagi berisicurrent()
metode tersebut.Jadi, menurut saya, cara terbersih untuk mendeteksi OS adalah:
Impor DefaultNativePlatform:
Kemudian gunakan
DefaultNativePlatform
dalam tugas Anda:Ingatlah bahwa metode ini tidak ideal karena menggunakan API internal Gradle.
Itu telah diuji dengan Gradle 4.10.
sumber