গ্রেড বাস্তবায়ন বনাম এপিআই কনফিগারেশন


231

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


1
আপনি কি এখানে পড়েছেন ?
ম্যাটপ্যাগ

প্রকৃতপক্ষে, আমি করেছি, তবে, যেমনটি আমি বলেছি, মন্তব্যটি এটি সম্পর্কে আশ্চর্য হয়ে গেছে। তাই আমি এখন হারিয়ে গেছি
রিনালমডোরীরা

আপনি সম্ভবত থেকে আপনার লাইব্রেরি নির্ভরতা পাল্টাবে compileকরতে api। আপনি অভ্যন্তরীণভাবে গ্রন্থাগারগুলি ব্যবহার করেন এমন কিছু ব্যক্তিগত প্রয়োগ ব্যবহার করতে পারে যা চূড়ান্ত গ্রন্থাগারে প্রকাশিত হয় না তাই তারা আপনার কাছে স্বচ্ছ। এই "অভ্যন্তরীণ-বেসরকারী" নির্ভরতাগুলি স্যুইচ করা যেতে পারে implementationএবং যখন অ্যান্ড্রয়েড গ্রেড প্লাগইন আপনার অ্যাপ্লিকেশনটি সংকলন করবে তখন এটি নির্ভরতাগুলির সংকলনটি এড়াতে পারে যার ফলে একটি ছোট বিল্ড সময় হয় (তবে সেই নির্ভরতাগুলি রানটাইম উপলভ্য হবে)। স্পষ্টত আপনি একই কাজ করতে পারেন আপনার যদি স্থানীয় মডিউল লাইব্রেরি থাকে
ম্যাটপ্যাগ

1
এখানে 'এপিআই' এবং 'বাস্তবায়ন' এর একটি সংক্ষিপ্ত গ্রাফিকাল ব্যাখ্যা রয়েছে: jeroenmols.com/blog/2017/06/14/androidstudio3
অ্যালবার্ট সি ব্রুন

1
এটি একটি দুর্দান্ত পোস্ট! আপনাকে ধন্যবাদ_আলবার্টব্রাউন
রিনালমডোরীরা

উত্তর:


418

নির্ভরতাগুলি কনফিগার করার compileজন্য গ্রেডল কীওয়ার্ডটি apiএবং implementationকীওয়ার্ডের পক্ষে অবচয় করা হয়েছিল ।

ব্যবহার apiঅবচিত ব্যবহারের সমতূল্য compile, তাই আপনি যদি সমস্ত প্রতিস্থাপন compileসঙ্গে apiসবকিছু সবসময় কাজ হবে।

implementationকীওয়ার্ডটি বুঝতে নিম্নলিখিত উদাহরণটি বিবেচনা করুন।

EXAMPLE টি

ধরুন আপনার কাছে এমন একটি লাইব্রেরি রয়েছে MyLibraryযা অভ্যন্তরীণভাবে অন্য একটি লাইব্রেরি ব্যবহার করে InternalLibrary। এটার মতো কিছু:

    // 'InternalLibrary' module
    public class InternalLibrary {
        public static String giveMeAString(){
            return "hello";
        }
    }
    // 'MyLibrary' module
    public class MyLibrary {
        public String myString(){
            return InternalLibrary.giveMeAString();
        }
    }

ধরা যাক এর মতো MyLibrary build.gradleব্যবহারগুলি apiকনফিগারেশন dependencies{}:

dependencies {
    api project(':InternalLibrary')
}

আপনি নিজের কোডটিতে ব্যবহার করতে চান MyLibraryতাই আপনার অ্যাপ্লিকেশনটিতে build.gradleআপনি এই নির্ভরতা যুক্ত করুন:

dependencies {
    implementation project(':MyLibrary')
}

apiকনফিগারেশন ব্যবহার করে (বা অবমানিত compile) আপনি InternalLibraryআপনার অ্যাপ্লিকেশন কোডটিতে অ্যাক্সেস করতে পারবেন :

// Access 'MyLibrary' (granted)
MyLibrary myLib = new MyLibrary();
System.out.println(myLib.myString());

// Can ALSO access the internal library too (and you shouldn't)
System.out.println(InternalLibrary.giveMeAString());

এইভাবে মডিউলটি MyLibraryকোনও কিছুর অভ্যন্তরীণ বাস্তবায়ন সম্ভাব্যভাবে "ফাঁস" করছে। আপনি এটি ব্যবহার করতে পারবেন না (কারণ এটি সরাসরি আপনার দ্বারা আমদানি করা হয়নি)।

implementationকনফিগারেশন এই প্রতিরোধ চালু করা হয়। সুতরাং এখন আপনি যদি এর implementationপরিবর্তে ব্যবহার apiকরেন MyLibrary:

dependencies {
    implementation project(':InternalLibrary')
}

আপনি InternalLibrary.giveMeAString()আপনার অ্যাপ্লিকেশন কোডটিতে আর কল করতে পারবেন না।

বক্সিং কৌশল এই ধরনের অ্যান্ড্রয়েড Gradle জানাতে চাই যে, যদি তোমরা কিছু সম্পাদন করা প্লাগ ইন পারবেন InternalLibrary, এটি শুধুমাত্র এর কম্পায়লেশান আরম্ভ আবশ্যক MyLibraryএবং না আপনার সমগ্র অ্যাপের কম্পায়লেশান, কারণ আপনি অ্যাক্সেস না থাকে InternalLibrary

যখন আপনার অনেক নেস্টেড নির্ভরতা থাকে তখন এই প্রক্রিয়াটি বিল্ডকে অনেক গতিময় করতে পারে। (এর সম্পূর্ণ বোঝার জন্য ভিডিওটি লিঙ্কটি শেষে দেখুন)

উপসংহার

  • আপনি যখন নতুন অ্যান্ড্রয়েড গ্রেডল প্লাগইন 3.XX এ স্যুইচ করেন, আপনার কীওয়ার্ড (1 *)compile দিয়ে আপনার সমস্তটি প্রতিস্থাপন করা উচিত । তারপরে আপনার অ্যাপ্লিকেশনটি সংকলন করে পরীক্ষা করার চেষ্টা করুন। যদি সবকিছু ঠিক থাকে তবে কোডটি ঠিক তেমনি রেখে দিন, যদি আপনার সমস্যা হয় তবে আপনার নির্ভরতাগুলির সাথে আপনার কিছু ভুল আছে বা আপনি এমন কিছু ব্যবহার করেছেন যা এখন ব্যক্তিগত এবং আরও অ্যাক্সেসযোগ্য নয়। অ্যান্ড্রয়েড গ্রেডল প্লাগইন ইঞ্জিনিয়ার জেরোম ডোকেজ (1 ) * ) এর পরামর্শimplementation

  • আপনি যদি কোনও গ্রন্থাগার ম্যানটেনার apiহন তবে আপনার লাইব্রেরির পাবলিক এপিআইয়ের জন্য প্রয়োজনীয় প্রতিটি নির্ভরতার জন্য আপনাকে ব্যবহার করা উচিত , যখন implementationপরীক্ষা নির্ভরতা বা নির্ভরতার জন্য ব্যবহার করা উচিত যা চূড়ান্ত ব্যবহারকারীদের দ্বারা ব্যবহার করা উচিত নয়।

কার্যকর নিবন্ধ বাস্তবায়ন এবং এপিআইয়ের মধ্যে পার্থক্য প্রদর্শন করে

রেফারেন্স (সময় সাশ্রয়ের জন্য এটি একই ভিডিও বিভক্ত)

গুগল আই / ও 2017 - গ্রেডল কীভাবে গতি বাড়ায় (পুরো ভিডিও)

গুগল আই / ও 2017 - গ্রেডল কীভাবে গতি বাড়ায় (নতুন গ্রেড প্লাগইন 3.0.0 অংশ কেবলমাত্র)

গুগল আই / ও 2017 - গ্রেডল কীভাবে গতি বাড়ায় ( 1 * এর রেফারেন্স )

অ্যান্ড্রয়েড ডকুমেন্টেশন


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

1
এটি ঠিক আছে এবং ডিবাগ-বিল্ডগুলিতে কাজ করে তবে প্রোগার্ড ব্যবহার করার সময় (রিলিজ-সংস্করণগুলিতে) MyLibrary#myString()ক্র্যাশ হবে কারণ প্রোগুয়ার্ড InternalLibraryসরানো হবে। প্রোগুয়ার্ডযুক্ত অ্যাপ্লিকেশনগুলিতে অ্যান্ড্রয়েড-লিবগুলি ব্যবহার করার জন্য সেরা অনুশীলনটি কী?
হার্ডিসিম

3
আমি মনে করি উত্তরটি সঠিক নয়, অ্যাপ্লিকেশনটি মাই লাইব্রেরির জন্য যা চান তা ব্যবহার করতে পারে। এটি মাইলিবারি এপিআই / বাস্তবায়ন ব্যবহার করে কিনা তা নির্ভর করে ইন্টারনাল লাইব্রারিটি দেখতে পাবে না।
স্নিকোলাস

2
ধন্যবাদ মানুষ. অসাধারণ ব্যাখ্যা, অ্যান্ড্রয়েডের অফিশিয়াল ডক্সে দেওয়া চেয়ে অনেক ভাল
হেনরি

2
এটি একটি সুন্দর ব্যাখ্যা। তত্ত্ব এবং কংক্রিট উজ্জ্বল মিশ্রিত। সাবাশ. এর জন্য ধন্যবাদ
পিটার কাহন

133

আমি জনসাধারণapi হিসাবে নির্ভরতা (অন্যান্য মডিউল দ্বারা প্রদর্শিত) সম্পর্কে ভাবতে চাই, যদিও নির্ভরতা ব্যক্তিগত হিসাবে (কেবলমাত্র এই মডিউল দ্বারা দেখা হয়)।implementation

দ্রষ্টব্য, public/ privateবৈকল্পিক এবং পদ্ধতিগুলি থেকে পৃথক api/ implementationনির্ভরতা রানটাইম দ্বারা প্রয়োগ করা হয় না। এটি নিছক একটি বিল্ড-টাইম অপ্টিমাইজেশন, Gradleএটি নির্ভর করতে পারে যে কোনও নির্ভরতাগুলির একটিতে তার এপিআই পরিবর্তিত হলে কোন মডিউলগুলি পুনরায় সংকলন করা প্রয়োজন।


15
এই উত্তরের সরলতা ভালোবাসি আপনাকে অনেক ধন্যবাদ
কেভিন গিলস

2
আসল পার্থক্য (এএএফআইসিটি) হ'ল উত্পন্ন পম ফাইলটি api"সংকলন" সুযোগের উপর নির্ভরশীলতা রাখে (এগুলি আপনার গ্রন্থাগারে নির্ভরতা এবং আপনার লাইব্রেরির উপর নির্ভরশীল যে কোনও কিছু হিসাবে অন্তর্ভুক্ত করা হবে) এবং implementation"রানটাইম" স্কোপে নির্ভরতা (তারা আরও ভাল হতে পারে ক্লাসপথ যখন আপনার কোডটি চলছে তখন তাদের পাঠাগার ব্যবহার করে এমন অন্যান্য কোড সংকলন করার দরকার নেই)।
শ্যাডো ম্যান

@ শ্যাডোম্যান এটি প্লাগইনটির একটি বাস্তবায়ন বিশদ, পিওএম ফাইল তৈরির জন্য দায়ী, এটি কীভাবে গ্র্যাডল স্কোপগুলিকে ম্যাভেন স্কোপে ম্যাপ করে ।
dev.bmax

1
আপনার implementationচালনার জন্য প্রয়োজনীয় যে কোনও নির্ভরতার জন্য ব্যবহার করা উচিত (এবং আপনার গ্রন্থাগারটি সংকলন করার জন্য), তবে এটি স্বয়ংক্রিয়ভাবে আপনার লাইব্রেরি ব্যবহার করে এমন প্রকল্পগুলিতে টানা উচিত নয়। একটি উদাহরণ জ্যাক্স-আরএসের হতে পারে, আপনার গ্রন্থাগারটি রিস্টেসি ব্যবহার করতে পারে তবে আপনার লাইব্রেরি ব্যবহার করে এমন কোনও প্রকল্পের মধ্যে এই লিবগুলি টানা উচিত নয়, কারণ তারা পরিবর্তে জার্সি ব্যবহার করতে পারে।
শ্যাডো ম্যান

1
এইভাবে আপনি কীভাবে জানেন যে কেউ তার স্টাফ পেয়েছে: সহজ এবং স্পষ্ট উত্তরের জন্য ডি ধন্যবাদ
এলিয়াস ফাজেল

12

আপনার appমডিউলটি বিবেচনা করুন যা lib1একটি গ্রন্থাগার হিসাবে lib1ব্যবহার করে lib2এবং একটি লাইব্রেরি হিসাবে ব্যবহার করে । ভালো কিছু: app -> lib1 -> lib2

এখন যখন ব্যবহার api lib2মধ্যে lib1, তারপর app দেখতে পারেন lib2 যখন ব্যবহার কোড: api lib1বা implementation lib1মধ্যে appমডিউল।

তবে ব্যবহার implementation lib2করার lib1পরে, কোডগুলি app দেখতে পাচ্ছেন না lib2


5

@ ম্যাটপ্যাগ এবং @ দেব-বিম্যাক্সের উত্তরগুলি বাস্তবায়ন এবং এপিআইয়ের মধ্যে বিভিন্ন ব্যবহারকে মানুষ বোঝার জন্য যথেষ্ট স্পষ্ট। আমি কেবল অন্য একটি কোণ থেকে একটি অতিরিক্ত ব্যাখ্যা দিতে চাই, একই প্রশ্নযুক্ত লোকদের জন্য সহায়তা আশা করি।

আমি পরীক্ষার জন্য দুটি প্রকল্প তৈরি করেছি:

  • প্রকল্পের একটি একটি জাভা লাইব্রেরি প্রকল্প হিসেবে 'অবকাঠামো ওয়েব-gradle-প্লাগইন' নামক উপর নির্ভর করে 'org.springframework.boot: বসন্ত-বুট gradle-প্লাগইন: 1.5.20.RELEASE'
  • প্রকল্প বি প্রকল্পের উপর নির্ভর করে প্রকল্পের উপর নির্ভর করে 'com.example.frameworks.gradle: ফ্রেমওয়ার্কস-ওয়েব-গ্রেডেল-প্লাগইন: 0.0.1-এসএনএপিএসএইচটি

উপরে বর্ণিত নির্ভরতা শ্রেণিবিন্যাসের মতো দেখতে:

[প্রকল্প-বি] -> [প্রকল্প-এ] -> [বসন্ত-বুট-গ্রেডেল-প্লাগইন]

তারপরে আমি নিম্নলিখিত পরিস্থিতিগুলি পরীক্ষা করেছি:

  1. প্রকল্পটি তৈরি করুন 'org.springframework.boot: বসন্ত-বুট-গ্রেডেল-প্লাগইন: 1.5.20.RELEASE' প্রয়োগের মাধ্যমে নির্ভর করে ।

    gradle dependenciesপোজেক্ট বি রুট ডিরের টার্মিনালে রান কমান্ড , নিম্নলিখিত স্ক্রিনশটের আউটপুট সহ আমরা দেখতে পাচ্ছি যে 'স্প্রিং-বুট-গ্রেডেল-প্লাগইন' রানটাইমক্লাসপাথ নির্ভরতা গাছের মধ্যে প্রদর্শিত হয়, তবে সংকলন ক্লাসপাথের নয়, আমি মনে করি ঠিক তাই কারণ আমরা তৈরি করতে পারি না বাস্তবায়ন ব্যবহার করে ঘোষণা করা লাইব্রেরির ব্যবহার, এটি কেবল সংকলনের মাধ্যমে হবে না।

    এখানে চিত্র বর্ণনা লিখুন

  2. প্রজেক্ট এ তৈরি করুন 'org.springframework.boot' এর উপর নির্ভর করে: স্প্রিং-বুট-গ্রেডেল-প্লাগইন: 1.5.20.RELEASE ' এপিআই দ্বারা

    gradle dependenciesবি কে রুট দির আবার টার্মিনালে কমান্ড চালান । এখন 'স্প্রিং-বুট-গ্রেডেল-প্লাগইন' উভয়ই কম্পাইলক্লাসপথ এবং রানটাইমক্লাসপাথ নির্ভরতা গাছের মধ্যে উপস্থিত হয়।

    এখানে চিত্র বর্ণনা লিখুন

একটি উল্লেখযোগ্য পার্থক্য আমি লক্ষ্য করেছি যে প্রযোজক / গ্রন্থাগার প্রকল্পের বাস্তবায়ন উপায়ে ঘোষিত নির্ভরতা ভোক্তা প্রকল্পগুলির সংকলন ক্লাসপাঠে উপস্থিত হবে না, যাতে আমরা ভোক্তা প্রকল্পগুলিতে সংশ্লিষ্ট লিব ব্যবহার করতে না পারি।


2

গ্রেডল ডকুমেন্টেশন থেকে :

আসুন জেভিএম ভিত্তিক প্রকল্পের জন্য খুব সাধারণ বিল্ড স্ক্রিপ্টটি দেখে নেওয়া যাক।

plugins {
    id 'java-library'
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.hibernate:hibernate-core:3.6.7.Final'
    api 'com.google.guava:guava:23.0'
    testImplementation 'junit:junit:4.+'
}

বাস্তবায়ন

প্রকল্পের উত্স উত্স সংকলনের জন্য নির্ভরতা যা প্রকল্পের দ্বারা প্রকাশিত API এর অংশ নয়। উদাহরণস্বরূপ, প্রকল্পটি অভ্যন্তরীণ দৃ .়তা স্তর প্রয়োগের জন্য হাইবারনেট ব্যবহার করে।

API

প্রকল্পের উত্স উত্স সংকলনের জন্য নির্ভরতা যা প্রকল্পের দ্বারা প্রকাশিত API এর অংশ। উদাহরণস্বরূপ, প্রকল্পটি পেয়ারা ব্যবহার করে এবং তাদের পদ্ধতি স্বাক্ষরে পেয়ারা ক্লাসগুলির সাথে সার্বজনীন ইন্টারফেস প্রকাশ করে।

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