গ্রেডল বিল্ড স্ক্রিপ্ট থেকে সাধারণ পদ্ধতিগুলি বের করুন


86

আমার একটি গ্রেডল বিল্ড স্ক্রিপ্ট রয়েছে (build.gradle ) রয়েছে, যাতে আমি কিছু কাজ তৈরি করেছি। এই কাজগুলিতে বেশিরভাগ মেথড কল থাকে। কথিত পদ্ধতিগুলি বিল্ড স্ক্রিপ্টেও রয়েছে।

এখন, পরিস্থিতি এখানে:

আমি ন্যায্য পরিমাণে বিল্ড স্ক্রিপ্ট তৈরি করছি, যার মধ্যে বিভিন্ন টাস্ক রয়েছে তবে মূল স্ক্রিপ্ট থেকে একই পদ্ধতি ব্যবহার করে। সুতরাং, আমি কোনওভাবে এই "সাধারণ পদ্ধতিগুলি" বের করতে চাই, তাই আমি তৈরি প্রতিটি নতুন স্ক্রিপ্টের জন্য তাদের অনুলিপি না করে সহজেই এগুলি পুনরায় ব্যবহার করতে পারি।

গ্রেডল যদি পিএইচপি হত তবে নিম্নলিখিতগুলির মতো কিছু আদর্শ হবে:

//script content
...
require("common-methods.gradle");
...
//more script content

তবে অবশ্যই তা সম্ভব নয়। অথবা এটা?

যাইহোক, আমি কীভাবে এই ফলাফলটি অর্জন করতে পারি? এটি করার সর্বোত্তম সম্ভাব্য পদ্ধতি কোনটি? আমি ইতিমধ্যে গ্রেডল ডকুমেন্টেশন পড়েছি, তবে কোন পদ্ধতিটি এর পক্ষে সবচেয়ে সহজ এবং সবচেয়ে উপযুক্ত হবে তা নির্ধারণ করতে পারছি না can't

আগাম ধন্যবাদ!


হালনাগাদ:

আমি অন্য ফাইলটিতে পদ্ধতিগুলি নিষ্কাশন করতে পরিচালিত করেছি

(ব্যবহার করে apply from: 'common-methods.gradle'),

সুতরাং কাঠামোটি নিম্নরূপ:

parent/
      /build.gradle              // The original build script
      /common-methods.gradle     // The extracted methods
      /gradle.properties         // Properties used by the build script

কোনও কাজ সম্পাদন করার পরে build.gradle, আমি একটি নতুন সমস্যায় ফেটে পড়েছি: স্পষ্টতই, পদ্ধতিগুলি যখন থাকে তখন তারা স্বীকৃতি পায় না common-methods.gradle

এটি ঠিক করার জন্য কোনও ধারণা?


আপনি কি নিশ্চিত যে আপনার পদ্ধতিগুলি আদৌ লিখতে হবে? পদ্ধতিগুলির নিরিখে আপনার বিল্ড স্ক্রিপ্টগুলি লিখলে আপনি কিছু গ্রেডল গুডিজ মিস করতে পারেন, সবচেয়ে গুরুত্বপূর্ণটি হল সঠিকভাবে কাজ করার জন্য ইনক্রিমেন্টাল বিল্ড পেতে অতিরিক্ত কাজ লাগবে। উদ্দেশ্যে বিমূর্ততা টাস্ক গুলি ব্যবহার এবং পুনরায় ব্যবহার করা । আপনি কাস্টম টাস্কও তৈরি করতে পারেন । আপনার এখন পদ্ধতিতে কার্যাদি প্রয়োগের প্রয়োগটি সম্ভবত বিবেচনা করা উচিত।
আল্পার

@ আল্পার এবং অন্যান্য ; কী উদ্দেশ্য হিসাবে কিছু timestamp()বা currentWorkingDirectory()পদ্ধতিগুলির মতো কিছু তৈরি করা হয় task(উদাহরণস্বরূপ)। ইউটিলিটি ফাংশন এবং অনুরূপ জিনিসগুলি নামমাত্র স্কেলার - গ্রেডল এবং সর্বাধিক বিল্ড সিস্টেমের সাথে অন্তর্নির্মিত কোড-পুনঃব্যবহারের সীমাবদ্ধতা ব্যতীত এগুলি কাজ হবে না। আমি ডিআরওয়াই বিশ্ব পছন্দ করি যেখানে আমি একবারে কোনও জিনিস তৈরি করতে পারি এবং এটি আবার ব্যবহার করতে পারি। বস্তুত, @Pieter VDE উদাহরণ ব্যাপ্ত আমি একটি "ব্যবহার root.gradle" প্যাটার্ন আমার পিতা বা মাতা প্রকল্পের জন্য - build.gradle ফাইল সাধারণত কিছু প্রকল্পের সুনির্দিষ্ট সংজ্ঞায়িত এবং তারপর মাত্র apply ${ROOT}...
হবে

: আপনি বৈশিষ্ট্য সঙ্গে কাজ করার জন্য একটি কেন্দ্রীভূত উপায় প্রয়োজন তাহলে হয়তো এই প্রশ্নের আপনাকে সহায়তা করতে পারে stackoverflow.com/questions/60251228/...
GarouDan

উত্তর:


76

পদ্ধতিগুলি ভাগ করা সম্ভব নয়, তবে আপনি একটি ক্লোজার যুক্ত অতিরিক্ত সম্পত্তি ভাগ করতে পারেন যা একই জিনিসটিতে ফোটে। উদাহরণস্বরূপ, ডিক্লেয়ার ext.foo = { ... }মধ্যে common-methods.gradle, ব্যবহারের apply from:স্ক্রিপ্ট প্রয়োগ করতে, এবং তারপর সঙ্গে অবসান কল foo()


4
এটা সত্যিই কৌতুক করে! তবে আমার এই সম্পর্কে একটি প্রশ্ন আছে: কীভাবে কোনও কিছু ফেরত দেওয়ার পদ্ধতিগুলি সম্পর্কে? ফে File foo(String f)হয়ে যাবে ext.foo = { f -> ... }, আমি তখন মাত্র ভালো কিছু করতে পারেন: File f = foo(...)?
পিটার ভিডিই

4
স্পষ্টতই, আমার আগের মন্তব্যে প্রশ্নটি সম্ভব। তাই পিটারকে ধন্যবাদ, এই প্রশ্নের উত্তর দেওয়ার জন্য!
পিটার ভিডিই

4
@ পিটারনিডেরওয়িজার কেন এটি সম্ভব নয়? গ্রেডলি.আরগ অন্যথায় চিন্তা করে: ডক্টস.আরডল.আর।
বর্তমান

4
লিঙ্কটির জন্য @ ইগরগানাপলস্কি ধন্যবাদ। আমি অবাক হয়েছি কিভাবে গ্রেড.বিল্ডে পৃথক বিল্ড ফাইলের উত্পন্ন মানটি আমি ব্যবহার করতে পারি - এইভাবে এটি খুব দরকারী হবে :)
kiedysktos

@ আইগরগানাপলস্কি পিটার ভিডিইএস প্রশ্নের প্রসঙ্গে আপনি যে লিঙ্কটি ভাগ করেছেন তা কীভাবে সহায়তা করা উচিত?
t0r0X

161

উপর নির্মাণের পিটার্স উত্তর , এই আমি আমার পদ্ধতি রপ্তানি হল:

এর বিষয়বস্তু helpers/common-methods.gradle:

// Define methods as usual
def commonMethod1(param) {
    return true
}
def commonMethod2(param) {
    return true
}

// Export methods by turning them into closures
ext {
    commonMethod1 = this.&commonMethod1
    otherNameForMethod2 = this.&commonMethod2
}

এবং এইভাবেই আমি অন্য পদ্ধতিতে এই পদ্ধতিগুলি ব্যবহার করি:

// Use double-quotes, otherwise $ won't work
apply from: "$rootDir/helpers/common-methods.gradle"

// You can also use URLs
//apply from: "https://bitbucket.org/mb/build_scripts/raw/master/common-methods.gradle"

task myBuildTask {
    def myVar = commonMethod1("parameter1")
    otherNameForMethod2(myVar)
}

গ্রোভির ক্লোজারগুলিতে রূপান্তর পদ্ধতিতে এখানে আরও রয়েছে।


বন্ধের নাম এক্সট্রা হিসাবে ব্যবহার করার কোনও নির্দিষ্ট কারণ আছে কি?
অনূপ

4
@ অানুপস আমরা গ্র্যাডেলের অতিরিক্ত বৈশিষ্ট্যগুলিতে দুটি ক্লোজার যুক্ত করব । এই অতিরিক্ত বৈশিষ্ট্যগুলি বলা একটি বস্তুতে বান্ডিল হয় ext
ম্যাথিয়াস ব্রাউন

অন্তর্ভুক্ত ফাইলের মধ্যে সংজ্ঞায়িত আমরা কি কোনওভাবে, আমাদের একটি শ্রেণি হিসাবে মানটি ফেলতে পারি?
গারউডান

এটি সম্পর্কে উদাহরণ কোড সহ একটি পৃথক প্রশ্ন পোস্ট করা সম্ভবত একটি ভাল ধারণা, @ গারউডান।
ম্যাথিয়াস ব্রাউন

7

কোটলিন ডিএসএল ব্যবহার করে এটি এটির মতো কাজ করে:

build.gradle.kts :

apply {
  from("external.gradle.kts")
}

val foo = extra["foo"] as () -> Unit
foo()

বহিরাগত.gradle.kts :

extra["foo"] = fun() {
  println("Hello world!")
}

4
অ্যাক্টুয়াল টাইপ ভাগ করে নেওয়ার উপায় কি দুর্দান্ত? আপনি মূলত সুরক্ষা এবং সংকলকগুলির সহায়তা হারাচ্ছেন ... আপনি যদি আপনার পদ্ধতিগুলি সহ শ্রেণীর ভাগ করে নিতে পারেন তবে আপনি সংকলকটি ব্যবহার করতে পারেন।
ওয়াচ

0

কোটলিন ডিএসএল এর জন্য আরেকটি পদ্ধতি হতে পারে:

আমার-প্লাগইন.gradle.kts

extra["sum"] = { x: Int, y: Int -> x + y }

settings.gradle.kts

@Suppress("unchecked_cast", "nothing_to_inline")
inline fun <T> uncheckedCast(target: Any?): T = target as T

apply("my-plugin.gradle.kts")

val sum = uncheckedCast<(Int, Int) -> Int>(extra["sum"])

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