2012-06-27 26 views
61

Tôi tìm thấy câu trả lời này về làm thế nào để làm điều đó với groovy:Làm thế nào để phát hiện các hệ điều hành hiện tại từ 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" 
} 

Có cách nào tốt hơn?

+0

đó là những gì tôi sử dụng, không có phần 'toLowerCase(). Contains()', vì tôi chỉ cần tên. –

+0

Bạn cũng có thể nhận được phiên bản hệ điều hành, với 'System.getProperty ('os.arch')' –

+6

'" WINDOWS ". ToLowerCase()' là phụ thuộc vào miền địa phương và sẽ trả về 'wındows' (chú ý không có dấu chấm) trên máy ngôn ngữ là tiếng Thổ Nhĩ Kỳ. Sử dụng 'toLowerCase (Locale.ROOT)' thay vì ở bên an toàn. –

Trả lời

83

Thực ra, tôi nhìn vào dự án gradle và điều này có vẻ một chút sạch hơn vì nó sử dụng cấu trúc hiện kiến ​​của

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

Tôi thấy điều này tại các chi nhánh gradle sau đây và nó dường như làm việc độc đáo gradle/gradle-core/branches/RB-0.3/build.gradle

+0

Tốt nhất. Có vẻ tốt hơn với nhập tĩnh. – JBaruch

+0

Liên kết SVN là 404. [build.gradle] hiện tại (https://github.com/gradle/gradle/blob/master/build.gradle) có isWindows = org.gradle.internal.os.OperatingSystem.current () .windows – koppor

+5

được cảnh báo, Os.isFamily (Os.FAMILY_UNIX) sẽ trả về true cho cả unix và mac (trong khi Os.isFamily (Os.FAMILY_MAC) cũng hợp lệ – shabunc

4

Gradle không cung cấp API công khai để phát hiện hệ điều hành. Do đó các thuộc tính hệ thống os. là đặt cược tốt nhất của bạn.

37

Tính đến mùa hè'2015, câu trả lời của Peter Kahn vẫn còn hiệu lực. Môi trường dựa trên kích hoạt hồ sơ vẫn còn một cái gì đó thực hiện tương đối dễ dàng hơn trong maven. Nhưng hãy nhớ rằng org.apache.tools.ant.taskdefs.condition.Os.isFamily không độc quyền theo nghĩa rằng nếu nó trả về true với một tham số cụ thể thì không cần thiết nghĩa là nó trả về false cho bất kỳ param nào khác. Ví dụ:

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

Sẽ trả lại đúng cả hai cho Os.FAMILY_MACOs.FAMILY_UNIX trên MacOS. Thông thường nó không phải là một cái gì đó bạn cần trong xây dựng kịch bản.

Có dù một cách khác để đạt được điều này sử dụng API 2+ gradle, cụ thể là:

import org.gradle.internal.os.OperatingSystem; 

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

Check-out doc cho giao diện org.gradle.nativeplatform.platform.OperatingSystem. Điều đáng nói đến là giao diện này được đánh dấu bằng chú thích incubating, đó là "đối tượng địa lý hiện đang được tiến hành và có thể thay đổi bất kỳ lúc nào". Không gian tên "nội bộ" trong triển khai cũng cho chúng ta một gợi ý rằng chúng ta nên biết điều này khi biết rằng điều này có thể thay đổi.

Nhưng cá nhân tôi muốn đi với giải pháp này. Nó chỉ là tốt hơn để viết một lớp wrapper không mess up trong trường hợp một cái gì đó sẽ thay đổi trong tương lai.

+6

Có thay đổi không? Sử dụng Gradle 2.5 'OperatingSystem' dường như không có' .current() ' –

+3

nhớ gói nội bộ:' org.gradle.internal.os.OperatingSystem.current() ' – Brian

11

Người ta có thể khác nhau các build môi trường ở giữa Linux, Unix, Windows và OSX - trong khi Gradle nativeplatform.platform.OperatingSystem khác các mục tiêu môi trường (bao gồm FreeBSD và Solaris.), Để thay thế.

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. 
} 
Các vấn đề liên quan