গ্রেডল থেকে বর্তমান ওএস কীভাবে সনাক্ত করা যায়


104

গ্রোভির সাথে এটি কীভাবে করা যায় সে সম্পর্কে আমি এই উত্তরটি পেয়েছি:

গ্রোভি / গ্রিলস দ্বারা প্ল্যাটফর্ম (উইন্ডো বা লিনাক্স) সনাক্ত করা :

if (System.properties['os.name'].toLowerCase().contains('windows')) {
    println "it's Windows"
} else {
    println "it's not Windows"
}

একটি ভাল উপায় আছে কি?


toLowerCase().contains()অংশটি ছাড়াই আমি যা ব্যবহার করি, কেবলমাত্র নামটিই আমার দরকার।
কেভিন ওয়েলকার

আপনি ওএস সংস্করণটিও পেতে পারেনSystem.getProperty('os.arch')
কেভিন ওয়েলকার

13
"WINDOWS".toLowerCase()লোকেল নির্ভরশীল এবং wındowsলোকেল তুর্কি এমন মেশিনে ফিরে আসবে (ডটলেস আই নোট করুন)। ব্যবহার করুন toLowerCase(Locale.ROOT)পরিবর্তে নিরাপদ পাশ হতে হবে।
ম্যাথিয়াস ব্রাউন

উত্তর:


130

বাস্তবিক, আমি Gradle প্রকল্পের দিকে তাকিয়ে, এবং এই সৌন্দর্য একটু ক্লিনার এটি ব্যবহার করে যেমন অ্যান্ট এর বিদ্যমান কাঠামো:

import org.apache.tools.ant.taskdefs.condition.Os

task checkWin() << {
    if (Os.isFamily(Os.FAMILY_WINDOWS)) {
        println "*** Windows "
    }
}

আমি এটি নীচের গ্রেডল শাখায় পেয়েছি এবং এটি দুর্দান্তভাবে কাজ করছে বলে মনে হচ্ছে। গ্রেডেল / গ্রেডেল-কোর / শাখা / আরবি-0.3 / বিল্ড অ্যাড্রেডল


8
সতর্কতা অবলম্বন করুন, ওস.ইসফ্যামিলি (ওস.ফ্যামিলি_উনিক্স) ইউনিক্স এবং ম্যাক উভয়ের জন্যই সত্য ফিরে আসবে (যখন ওস.আইসফ্যামিলি (ওস.ফ্যামিলি_এমএসি )ও বৈধ
শাবুনক

4
সতর্কতা অবলম্বন করুন এটি হ'ল ওএস এবং শেল গ্রেডেল শুরু হওয়ার বিষয়ে কিছুই বলে না (যেমন এটি মিংডউ, সাইগউইন বা অন্যান্য ব্যাশ শেল হতে পারে)) সুতরাং আপনি যদি পরিবেশের ভেরিয়েবলগুলি পড়তে এটি ব্যবহার করেন তবে সাবধান হন।
ইস্তানী

4
orb.gradle.intern.os.OperatingSystem
পিটার কাহন

task checkWin() << {কেন তোমার এটা দরকার? আপনি কেবল লিখতে পারেনif (Os.isFamily(Os.FAMILY_WINDOWS)) { println "*** WINDOWS " }
ব্যবহারকারী 25

এছাড়াও এটি ব্যবহার করা ভাল org.gradle.internal.os.OperatingSystemএবং if (OperatingSystem.current() == OperatingSystem.WINDOWS)(যদি আমরা গ্র্যাডলের কথা বলি তবে কেন তাদের নিজস্ব প্রয়োগগুলি ব্যবহার করা হয় না)
ব্যবহারকার 25

72

মিড 2020 আপডেট : এখনও ইনকিউবেটিং:

OperatingSystem os = org.gradle.nativeplatform.platform.internal.DefaultNativePlatform.currentOperatingSystem; 

প্রথম দিকে 2019 আপডেট : current()সরানো হয়েছে।

org.gradle.nativeplatform.platform.OperatingSystem.getDisplayName()

org.gradle.nativeplatform.platform.OperatingSystem.isLinux()

মনে রাখবেন যে এটি এখনও উত্সাহিত করছে

মধ্য 2018 আপডেট : ঠিক যেমন এটি মন্তব্যে উল্লিখিত হয়েছিল, এখন এই শ্রেণিটি একটি পৃথক প্যাকেজে স্থানান্তরিত হয়েছে, সুতরাং একটিকে ব্যবহার করা উচিতorg.gradle.nativeplatform.platform.OperatingSystem.current()


২০১৫ সালের মাঝামাঝি পর্যন্ত পিটার কানের উত্তর এখনও বৈধ। পরিবেশ-ভিত্তিক প্রোফাইল অ্যাক্টিভেশন মাভেনে তুলনামূলক সহজতর কিছু এখনও। তবে মনে রাখবেন যে org.apache.tools.ant.taskdefs.condition.Os.isFamilyএই অর্থে একচেটিয়া নয় যে এটি যদি কোনও নির্দিষ্ট পরামিতি দিয়ে সত্য হয় তবে এর অর্থ এই নয় যে এটি অন্য কোনও প্যারামিটারের জন্য মিথ্যা প্রত্যাবর্তন করে। এই ক্ষেত্রে:

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

এটি Os.FAMILY_MACএবং উভয় ক্ষেত্রেই সত্য ফিরে আসবেOs.FAMILY_UNIX ম্যাকওএসের । সাধারণত স্ক্রিপ্টগুলি তৈরি করতে এটি আপনার প্রয়োজন হয় না।

গ্রেডল 2+ এপিআই ব্যবহার করে এটি অর্জনের আরও একটি উপায় রয়েছে, যথা:

import org.gradle.internal.os.OperatingSystem;

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

Org.gradle.nativeplatfor.platform.OperatingSystem ইন্টারফেসের জন্য ডকুমেন্টেশন দেখুন । এটি উল্লেখ করার মতো যে এই ইন্টারফেসটি ইনকিউবেটিংয়ের সাথে চিহ্নিত এন্টোটেশন , অর্থাৎ, "বৈশিষ্ট্যটি বর্তমানে একটি কার্য-অগ্রগতি এবং যে কোনও সময়ে পরিবর্তন হতে পারে"। বাস্তবায়নের "অভ্যন্তরীণ" নেমস্পেসটি আমাদেরকে একটি ইঙ্গিত দেয় যা আমাদের এটি ব্যবহার করে ব্যবহার করা উচিত তা জেনেও যে এটি পরিবর্তন হতে পারে।

তবে ব্যক্তিগতভাবে আমি এই সমাধানটি নিয়ে যেতে চাই। ভবিষ্যতে কিছু পরিবর্তিত হওয়ার ক্ষেত্রে গণ্ডগোল না করার জন্য একটি র‌্যাপার ক্লাস লেখাই ভাল।


8
এটা কি পরিবর্তন হয়েছে? গ্রেডেল 2.5 ব্যবহার করা দেখে OperatingSystemমনে হচ্ছে না.current()
রস ড্র

6
অভ্যন্তরীণ প্যাকেজটি মনে রাখবেন:org.gradle.internal.os.OperatingSystem.current()
ব্রায়ান

@ উদ্যানব্ল্যাক আপনি কীভাবে উদাহরণ OperatingSystemছাড়াই পাবেন current()?
TWiStErRob

4
এক পাওয়া গেছে: OperatingSystem os = org.gradle.nativeplatform.platform.internal.DefaultNativePlatform.currentOperatingSystem; আশা করি সেখানে একটি প্রকাশ্য @
পিটারনিডেরউইজার

যেহেতু ম্যাক ওএস, উইন্ডোজ এবং লিনাক্স কেবল অপারেটিং সিস্টেম নয়, z / OS অন্তর্ভুক্ত করা ভাল হবে। যদিও এক চিমটি মধ্যে, অন্যের কেউ না হয়ে পছন্দ করে নেওয়া কাজ করতে পারে।
জন সিজুক্করম্যান

18

লিনাক্স, ইউনিক্স, উইন্ডোজ এবং ওএস এক্স এর মধ্যে বিল্ড এনভায়রনমেন্টকে আলাদা করতে পারে - যখন গ্রেডল নেটিপ্ল্যাটফর্ম.প্ল্যাটফর্ম। অপারেটিং সিস্টেম সিস্টেম টার্গেট এনভায়রনমেন্ট (ইনক। ফ্রিবিএসডি এবং সোলারিস ) কে পার্থক্য দেয় ।

import org.gradle.internal.os.OperatingSystem

String osName = OperatingSystem.current().getName();
String osVersion = OperatingSystem.current().getVersion();
println "*** $osName $osVersion was detected."

if (OperatingSystem.current().isLinux()) {
    // Consider Linux.
} else if (OperatingSystem.current().isUnix()) {
    // Consider UNIX.
} else if (OperatingSystem.current().isWindows()) {
    // Consider Windows.
} else if (OperatingSystem.current().isMacOsX()) {
    // Consider OS X.
} else {
    // Unknown OS.
}

একটি পিঁপড়া টাস্ক ( উত্স ) ব্যবহার করতে পারেন :

import org.apache.tools.ant.taskdefs.condition.Os

task checkWin() << {
    if (Os.isFamily(Os.FAMILY_WINDOWS)) {
        // Consider Windows.
    }
}

8

অথবা আপনি ওসনেমকে স্ট্রিং হিসাবে সংজ্ঞায়িত করতে পারেন ...

import org.gradle.internal.os.OperatingSystem

switch (OperatingSystem.current()) {
    case OperatingSystem.LINUX:
        project.ext.osName = "Linux";
        break;
    case OperatingSystem.MAC_OS:
        project.ext.osName = "macOS";
        break;
    case OperatingSystem.WINDOWS:
        project.ext.osName = "Windows";
        break;
}

... এবং এটি পরে ব্যবহার করুন - একটি নেটিভ লাইব্রেরি অন্তর্ভুক্ত করার জন্য:

run {
    systemProperty "java.library.path", "lib/$osName"
}

অপারেটিং সিস্টেমটি আপনার কোডের মতো কাজ করে বলে এটি কোনও পরিবর্তন করতে পারে না:

public static OperatingSystem forName(String os) {
    String osName = os.toLowerCase();
    if (osName.contains("Windows")) {
        return WINDOWS;
    } else if (osName.contains("mac os x") || osName.contains("darwin") || osName.contains("osx")) {
        return MAC_OS;
    } else if (osName.contains("sunos") || osName.contains("solaris")) {
        return SOLARIS;
    } else if (osName.contains("linux")) {
        return LINUX;
    } else if (osName.contains("freebsd")) {
        return FREE_BSD;
    } else {
        // Not strictly true
        return UNIX;
    }
}

সূত্র: https://github.com/gradle/gradle/blob/master/subprojects/base-services/src/main/java/org/gradle/ আন্তঃ / os / অপারেটিংসিস্টেম.জভা

সম্পাদনা করুন:

আপনি স্থাপত্যের জন্য একই কাজ করতে পারেন:

project.ext.osArch = OperatingSystem.current().getArch();
if ("x86".equals(project.ext.osArch)) {
    project.ext.osArch = "i386";
}

এবং:

run {
    systemProperty "java.library.path", "lib/$osName/$osArch"
}

শুধু সচেতন হন যে getArch () ফিরে আসবে:

  • পাওয়ারপিসিতে "পিপিসি"
  • "amd64" 64 বি তে
  • "আই 386" বা "এক্স 86" 32 বি তে।

getArch () সোলারিসে "x86" বা অন্য কোনও প্ল্যাটফর্মের জন্য "i386" ফেরত দেবে।

সম্পাদনা 2:

বা আপনি যদি কোনও আমদানি এড়াতে চান তবে আপনি কেবল নিজেরাই এটি করতে পারেন:

def getOsName(project) {
    final String osName = System.getProperty("os.name").toLowerCase();

    if (osName.contains("linux")) {
        return ("linux");
    } else if (osName.contains("mac os x") || osName.contains("darwin") || osName.contains("osx")) {
        return ("macos");
    } else if (osName.contains("windows")) {
        return ("windows");
    } else if (osName.contains("sunos") || osName.contains("solaris")) {
        return ("solaris");
    } else if (osName.contains("freebsd")) {
        return ("freebsd");
    }
    return ("unix");
}

def getOsArch(project) {
    final String osArch = System.getProperty("os.arch");

    if ("x86".equals(osArch)) {
        return ("i386");
    }
    else if ("x86_64".equals(osArch)) {
        return ("amd64");
    }
    else if ("powerpc".equals(osArch)) {
        return ("ppc");
    }
    return (osArch);
}

আর্কিটেকচারের জন্য জিজ্ঞাসা করা হয়নি - এবং চাকাটি পুনর্বহাল করা ব্যর্থ প্রচেষ্টা। এটি ব্যক্তিগত পছন্দ হতে পারে তবে বেশিরভাগ প্রোগ্রামাররা আমদানি ব্যবহার করতে পারে, যখনই কোনও আমদানি ব্যবহার করা যায় (ফ্রেমওয়ার্ক ব্যবহার করে, তবে এটি ব্যবহার না করে, কেবল নকল কোড তৈরি করতে পারে)।
মার্টিন জিটলার

7

গ্রেডল অপারেটিং সিস্টেম সনাক্ত করার জন্য একটি সর্বজনীন API সরবরাহ করে না। সুতরাং os.সিস্টেম বৈশিষ্ট্য আপনার সেরা বাজি।


4

আমি সম্পত্তি বা একটি পিঁপড়া টাস্কের মাধ্যমে গ্রেডলে ওএস সনাক্তকরণ পছন্দ করি না এবং OperatingSystemক্লাসে আর থাকে নাcurrent() পদ্ধতি ।

সুতরাং, আমার মতে, ওএস সনাক্ত করার সবচেয়ে সহজ উপায় হ'ল:

ডিফল্ট নেটিভ প্ল্যাটফর্ম আমদানি করুন:

import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform

তারপরে DefaultNativePlatformআপনার কাজে ব্যবহার করুন:

if (DefaultNativePlatform.getCurrentOperatingSystem().isWindows()) {
   println 'Windows'
}

মনে রাখবেন যে এই পদ্ধতিটি গ্রেডল অভ্যন্তরীণ এপিআই ব্যবহার করার কারণে এটি আদর্শ নয়।

এটি গ্রেডেল 4.10 দিয়ে পরীক্ষা করা হয়েছিল।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.