গ্রেডল: ক্লাসপথ এবং সংকলন নির্ভরতার মধ্যে পার্থক্য কী?


92

আমার প্রকল্পে নির্ভরতা যুক্ত করার সময় আমি কখনই নিশ্চিত নই যে তাদের কী উপসর্গ দেওয়া উচিত, যেমন "classpath"বা"compile".

উদাহরণস্বরূপ, নীচে আমার নির্ভরতাগুলি কি সময় বা ক্লাসপথ সংকলন করা উচিত?

এছাড়াও, এটি আমার অ্যাপ্লিকেশনগুলিতে build.gradle বা মডিউল নির্দিষ্ট বিল্ড.gradle এ থাকা উচিত?

বর্তমান বিল্ড.gradle (অ্যাপ্লিকেশন স্তরে):

apply plugin: 'java'

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.hibernate:hibernate-core:5.0.5.Final'
    compile 'mysql:mysql-connector-java:5.1.38'
} 

4
আমি নিশ্চিত নই যে আমি বুঝেছি. classpathকোনও বৈধ নির্ভরতার সুযোগ নয়।
টুনাকি

সম্ভবত আমি বিভ্রান্ত হয়ে যাচ্ছি, বৈধ নির্ভরতার স্কোপগুলি কী কী?
java123999

এই দস্তাবেজটি একবার দেখুন: docs.gradle.org/current/userguide/…
টুনাকি

একটি জিনিস আমি লক্ষ্য করেছি যে compileOnlyনির্ভরতাগুলি project.configurations.compileClasspathকিন্তু সেখানে যায় না project.configurations.compile, যেমন এখানে উল্লিখিত হয়েছে github.com/iboyko/gradle-plugins/issues/5
ভাইটেনিস বিভেইনিস

উত্তর:


47

আমি যে আপনি উল্লেখ করছি যাচ্ছি compileএবং classpathমধ্যে dependencies {}ব্লক। যদি তা হয় তবে সেগুলি হ'ল নির্ভরতা কনফিগারেশন

একটি কনফিগারেশন কেবল নির্ভরযোগ্যতার একটি নামকরণ সেট।

compileকনফিগারেশন জাভা প্লাগইন করে নির্মিত হয়। classpathকনফিগারেশন সাধারণভাবে দেখা যায় buildSrc {}ব্লক যেখানে এক নির্ভরতা ঘোষণা করার প্রয়োজন build.gradle, নিজেই জন্য (প্লাগিন জন্য, সম্ভবত)।


ধন্যবাদ, তাহলে আমার মূল বিল্ড.gradle এর জন্য আমার ক্লাসপথ ব্যবহার করা উচিত নয়?
java123999

@ java123999 না, যদি না আপনি কাস্টম-লিখিত প্লাগইন ব্যবহার করেন
এরিক ওয়েন্ডেলিন

@ এরিকওয়েন্ডেলিন আপনি যেখানে "নির্ভরতাগুলির মধ্যে}} ব্লক" বলতে চান "বিল্ডস্ক্রিপ্টের মধ্যে {নির্ভরতা {}} ব্লক" এর মধ্যে আপনি কী বোঝাতে চান? (আমি নিশ্চিত না, কেবল জিজ্ঞাসা করছি))
পাওলো মেরসন

4
এর dependencies {}ভিতরে buildscript {}এবং বাইরে উভয়দিকেই একটি ব্লক ঘোষণা করা যেতে পারে । ভিতরে থাকা অবস্থায় আপনি classpathবিল্ড স্ক্রিপ্টটিই সংকলনের জন্য প্রয়োজনীয় নির্ভরতার জন্য কনফিগারেশনটি ব্যবহার করেন ।
এরিক ভেন্ডেলিন

55

তাহলে buildscript নিজেই চালানোর জন্য কিছু, ব্যবহার প্রয়োজন ক্লাসপাথ

আপনার প্রকল্পটি চালনার জন্য যদি কিছু প্রয়োজন হয় তবে সংকলনটি ব্যবহার করুন ।

buildscript{}ব্লক build.gradle নিজেই জন্য হয়।

মাল্টি-প্রজেক্ট বিল্ডিংয়ের জন্য, শীর্ষ স্তরের বিল্ড ফাইলটি মূল প্রকল্পের জন্য, নির্দিষ্ট বিল্ড ফাইলটি সাব-প্রকল্পের (মডিউল) জন্য।

শীর্ষ স্তরের বিল্ড ফাইল যেখানে আপনি সমস্ত উপ-প্রকল্প / মডিউলগুলিতে সাধারণ কনফিগারেশন বিকল্প যুক্ত করতে পারেন।

আপনার অ্যাপ্লিকেশন নির্ভরতাগুলি শীর্ষ-স্তরের বিল্ড ফাইলে রাখবেন না, এগুলি পৃথক মডিউল বিল্ড.gradle ফাইলের অন্তর্গত


নিশ্চিত করার জন্য: এর অর্থ কি প্রানড্রয়েডওয়েড.com/… ব্যবহার করা উচিত compileএবং একটি নয় classpath?
উইলসি

4
তবে যদি প্রকল্পটির সাধারণ অ্যান্ড্রয়েড অ্যাপ্লিকেশনগুলির মতো মাত্র একটি মডিউল থাকে তবে শীর্ষস্থানীয় ফাইলটিতে অ্যাপ্লিকেশন নির্ভরতা কেন রাখবেন না?
হর্ষ

18

যদি আমি সঠিকভাবে বুঝতে পারি তবে আপনি Project.dependenciesস্ক্রিপ্ট ব্লকটির সাথে স্ক্রিপ্ট ব্লককে বিভ্রান্ত করছেন Project.buildscript.dependencies(ঠিক যেমন আমি এই প্রশ্নটিতে পৌঁছানোর পরেছিলাম)।

আমি যা খুজে পেয়েছি তার উত্তর দেওয়ার চেষ্টা করব।

আমি মনে করি আপনার ইতিমধ্যে Project.dependenciesস্ক্রিপ্ট ব্লকের সাথে পরিচিত হওয়া উচিত । এই ব্লকে, আমরা আমাদের উত্স কোড দ্বারা প্রয়োজনীয় যে নির্ভরতাগুলি ঘোষণা করি। প্রকল্পের জন্য আমাদের যে নির্ভরতা প্রয়োজন তা ঘোষণা করার বিভিন্ন উপায় রয়েছে। গ্রেডল টিউটোরিয়াল দেখুন : নির্ভরতা প্রকার । আমি কেবল সেই অংশটিই উল্লেখ করব যা এই সমস্যার সাথে সবচেয়ে প্রাসঙ্গিক:

compile 'org.hibernate:hibernate-core:5.0.5.Final'একটি মডিউল নির্ভরতা ঘোষণা। সংকলন কনফিগারেশন (যা এখন বাস্তবায়ন কনফিগারেশন দ্বারা অবচয় করা হয়েছে) এটি কেবল একটি কীওয়ার্ড Implementation only dependencies.নয় এটি কোন ধরণের নির্ভরতা তা বর্ণনা করে এমন কোনও কীওয়ার্ড নয় (এখানে টাইপ করে আমি টিউটোরিয়ালে সংজ্ঞায়িত তিনটি ধরণের অনুসরণ করছি, অর্থাৎ মডিউল, ফাইল এবং প্রকল্প।)

ইন Gradle টিউটোরিয়াল: লজিক বিল্ড সংগঠিত এটা বলেছেন:

যদি আপনার বিল্ড স্ক্রিপ্টটির বাহ্যিক লাইব্রেরিগুলি ব্যবহার করার প্রয়োজন হয় তবে আপনি সেগুলি বিল্ড স্ক্রিপ্টের মধ্যেই স্ক্রিপ্টের ক্লাসপাথে যুক্ত করতে পারেন। আপনি বিল্ডস্ক্রিপ্ট () পদ্ধতিটি ব্যবহার করে এটি বন্ধের মধ্যে দিয়ে যা বিল্ড স্ক্রিপ্ট ক্লাসপাথ ঘোষণা করে।

আপনি যেমন ঘোষণা করেন ঠিক তেমনই এটি জাভা সংকলন শ্রেণিপথ। প্রকল্প নির্ভরতা বাদে নির্ভরতা প্রকারভেদে বর্ণিত যে কোনও নির্ভরতা প্রকারগুলি আপনি ব্যবহার করতে পারেন।

বিল্ড স্ক্রিপ্টের ক্লাসপথ ঘোষণা করার পরে, আপনি ক্লাসপথের অন্য কোনও ক্লাসগুলির মতো আপনার বিল্ড স্ক্রিপ্টের ক্লাসগুলি ব্যবহার করতে পারেন।

আমি আশা করি বিষয়গুলি এখন আপনার কাছে স্পষ্ট হয়ে উঠবে।

সঙ্গে classpath "com.android.tools.build:gradle:${Versions.android_gradle_plugin}"আমরা সেটিং করছি classpathপদ্ধতি সঙ্গে com.android.tools.build:gradle:${Versions.android_gradle_plugin}যা একটি মডিউল নির্ভরতা যে বিল্ড স্ক্রিপ্ট নিজেই বদলে আপনার প্রকল্পের মধ্যে উৎস দ্বারা ব্যবহার করা হয়।

অন্যদিকে, compile 'org.hibernate:hibernate-core:5.0.5.Final'সংকলন কনফিগারেশন সহ আমরা আপনার প্রকল্পের জন্য প্রয়োজনীয় একটি মডিউল নির্ভরতা ঘোষণা করছি ।

tl; dr: the classpath, compileএবং implementationসমস্ত কীওয়ার্ড যা বিভিন্ন পরিস্থিতিতে নির্ভরতার বিরুদ্ধে ব্যবহার করা যেতে পারে। পূর্ববর্তীটি ব্যবহৃত হয় যখন আপনি বিল্ড স্ক্রিপ্টের উপর নির্ভরশীলতার মধ্যে যেতে চান, এবং পরবর্তীটি আপনি যে কনফিগারেশনটি ঘোষণা করতে চাইতে পারেন তার মধ্যে একটি।


4
ভাল উত্তর. আমার যোগ করতে হবে, যা কেবলমাত্র কীওয়ার্ডগুলিকে নিজের দিকে তাকাতে হবে তা উপরের মতো সুন্দরভাবে ব্যাখ্যা করা উচিত নয়, তবে এর পাশাপাশি আমাদের অবশ্যই অনুরোধ করা শৈল্পিকতার বিষয়টিও বিবেচনায় নিতে হবে কারণ কেবলমাত্র কীওয়ার্ডই সম্পূর্ণ প্রসঙ্গটি সংজ্ঞায়িত করে না। উদাহরণস্বরূপ, 'org.projectlombok:lombok:1.18.4'কোনও classpathসংযুক্তি নেই কারণ এটি একটি জার যা কেবলমাত্র সংকলনের javacসময় প্রয়োজন তবে javaরানটাইমের প্রয়োজন হয় না । সুতরাং, সঠিক ব্যবহার সংজ্ঞায়িত কীওয়ার্ড এবং শৈল্পিকের একটি ইন্টারপ্লে। এর অর্থ, একজনের কাছে পূর্ব-জ্ঞান প্রয়োজন।
ইগেনফিল্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.