আমি কেন একটি ভাগ করা লাইব্রেরির একাধিক সংস্করণ ইনস্টল করতে পারি না?


10

প্রায়শই এমন উদাহরণ রয়েছে যেখানে একটি নির্দিষ্ট প্রোগ্রাম লাইব্রেরি সংস্করণ xy এবং অন্যটি এক্স জেড এর উপর নির্ভর করবে তবে যতদূর আমি জানি, কোনও প্যাকেজ ম্যানেজার আমাকে xy এবং xz উভয়ই ইনস্টল করতে দেয় না কখনও কখনও তারা উভয় প্রধান সংস্করণকে অনুমতি দেয় (যেমন qt4 এবং qt5, যা একই সাথে ইনস্টল করা যেতে পারে), তবে (মনে হয়) কখনও ছোটখাটো সংস্করণ নয়।

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

উত্তর:


13

আসলে, আপনি যদি ভাগ করা লাইব্রেরিটি সঠিকভাবে করা হয় তবে একাধিক সংস্করণ ইনস্টল করতে পারেন।

ভাগ করা লাইব্রেরিগুলি সাধারণত নিম্নলিখিত হিসাবে নামকরণ করা হয়:

lib<name>.so.<api-version>.<minor>

এরপরে, নীচের নামে লাইব্রেরিতে প্রতিলিপি রয়েছে:

lib<name>.so
lib<name>.so.<api-version>

যখন বিকাশকারী কোনও বাইনারি তৈরি করার জন্য কোনও বিকাশকারী লাইব্রেরির বিপরীতে লিঙ্ক .soকরেন, লিঙ্কার সন্ধান করে এটিই ফাইলের নাম হয় । প্রকৃতপক্ষে <name>যে কোনও একটির জন্য ইনস্টল করা সেইগুলির মধ্যে কেবল একটিই থাকতে পারে তবে এর অর্থ শুধুমাত্র একজন বিকাশকারী একই সাথে লাইব্রেরির একাধিক বিভিন্ন সংস্করণকে লক্ষ্য করতে পারে না। প্যাকেজ পরিচালকদের সাথে, এই .soসিমিলিংকটি পৃথক -devপ্যাকেজের অংশ যা কেবল বিকাশকারীদের ইনস্টল করা দরকার।

লিঙ্কার যখন একটি নামের সাথে শেষ হওয়া কোনও ফাইল খুঁজে পায় .soএবং এটি ব্যবহার করে, তখন সোনাম নামক একটি ক্ষেত্রের জন্য এটি লাইব্রেরির ভিতরে দেখায় । সোনাম লিংককারীকে পরামর্শ দেয় যে ফলস্বরূপ বাইনারিটি এমবেড করার জন্য কোন ফাইল নাম এবং এভাবে রানটাইমের সময় কোন ফাইলের নাম চাওয়া হবে। সোনাম সেট করার কথা রয়েছে lib<name>.so.<api-version>

সুতরাং, চলমান সময়ে, গতিশীল লিঙ্কার এটি অনুসন্ধান করবে lib<name>.so.<api-version>এবং এটি ব্যবহার করবে।

উদ্দেশ্য হ'ল:

  • <minor>আপগ্রেডগুলি লাইব্রেরির এপিআই পরিবর্তন করে না এবং যখন <minor>কোনও উচ্চতর সংস্করণে চাপ দেওয়া হয়, সমস্ত বাইনারিগুলি নতুন সংস্করণে আপগ্রেড করা নিরাপদ। যেহেতু বাইনারিরা সকলেই lib<name>.so.<api-version>নামের অধীনে লাইব্রেরিটি সন্ধান করছে যা সর্বশেষতম ইনস্টলডের জন্য একটি সিমিলিংক lib<name>.so.<api-version>.<minor>, তারা আপগ্রেড পাবে।
  • <api-version>আপগ্রেডগুলি লাইব্রেরির এপিআই পরিবর্তন করে এবং বিদ্যমান বাইনারি অ্যাপ্লিকেশনগুলিকে নতুন সংস্করণ ব্যবহার করতে দেওয়া নিরাপদ নয়। এই ক্ষেত্রে যে <api-version>পরিবর্তনটি করা হয়েছে, যেহেতু এই অ্যাপ্লিকেশনগুলি নামটি সন্ধান করছে lib<name>.so.<api-version>তবে এর জন্য আলাদা মান রয়েছে <api-version>, তারা নতুন সংস্করণটি গ্রহণ করবে না।

প্যাকেজ পরিচালনাকারীরা প্রায়শই একই বিতরণ সংস্করণে একই লাইব্রেরির একাধিক সংস্করণ প্যাকেজ করে না কারণ গ্রন্থাগারটি ব্যবহার করা সমস্ত বাইনারি সহ পুরো বিতরণ সাধারণত প্রতিটি লাইব্রেরির নিয়মিত সংস্করণ ব্যবহারের জন্য বিতরণ করার আগে সংকলিত হয় মুক্তি। সমস্ত কিছু সামঞ্জস্যপূর্ণ এবং বিতরণের সমস্ত কিছুর সাথে সামঞ্জস্যপূর্ণ কিনা তা নিশ্চিত করা পরিবেশকদের জন্য কাজের চাপের একটি বড় অংশ a

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

  • একটি পুরানো ডেবিয়ান থেকে libmysqlclient16 , থাকে libmysqlclient.so.16.0.0এবং সিএমলিংক libmysqlclient.so.16
  • বর্তমান দেবিয়ান থেকে libmysqlclient18 , রয়েছে libmysqlclient.so.18.0.0এবং syMLinklibmysqlclient.so.18

4

এই কার্যকারিতাটি অনুমোদিত নয়, বেশিরভাগ লাইব্রেরি সংখ্যার কাজ করার পদ্ধতি এবং প্যাকেজের নাম পরিবর্তনের অসুবিধার কারণে এটি খুব সাধারণ নয়।

যদি বিন্দুযুক্ত সংস্করণ নম্বর স্কিমটি এক্সওয়াইজেড ব্যবহার করে তবে "মাইক্রো" সংস্করণ জেড প্রায়শই বাগফিক্সে পরিবর্তিত হয়, "গৌণ" নম্বর ওয়াই পশ্চাতে সামঞ্জস্যপূর্ণ পরিবর্তনগুলিতে পরিবর্তিত হয় এবং "মেজর" সংস্করণ নম্বর এক্স এপিআই পরিবর্তনগুলিতে পরিবর্তন করতে হয় (এবং কখনও কখনও এটি চালু থাকে) প্রধান অতিরিক্ত কার্যকারিতা)।

এমন কোনও কারণ কখনই পাওয়া উচিত নয় যে আপনি সর্বশেষ বাগগুলি সংশোধন করতে চান না এবং পশ্চাদপটে সামঞ্জস্যপূর্ণ পরিবর্তনগুলি আপনার সফ্টওয়্যারটিও ভেঙে না ফেলে।

লাইব্রেরিটি যদি সেভাবে বিকশিত হয় তবে আপনার সর্বদা X দ্বারা XYZ প্রতিস্থাপন করতে সক্ষম হওয়া উচিত (ওয়াই + এম) ((জেড + এন)। যে কোনও প্রদত্ত মি এবং এন এর জন্য। অর্থাৎ আপনি সর্বদা একই বড় সংখ্যা সিরিজের সর্বশেষ সহ আপনার লাইব্রেরিটি প্রতিস্থাপন করতে সক্ষম হওয়া উচিত। এবং যদি গ্রন্থাগারের বিকাশকারীরা সতর্ক হন এবং পরবর্তী বড় সংখ্যাগুলি সামঞ্জস্যপূর্ণ হয় (যেমন জিনিসগুলি হ্রাস করার ঘোষণার মাধ্যমে, তবে সেগুলি এখনও সরিয়ে না দেয়) আপনি এমনকি পরবর্তী বড় সংখ্যাটি ব্যবহার করতে পারেন।

প্যাকেজ বিকাশকারীদের জন্য এটির অর্থ তারা কেবলমাত্র একটির সাথে নামটি ব্যবহার করতে পারে, এমনকি প্যাকেজটি আপডেট করে সর্বশেষ সংস্করণটি দেওয়ার জন্য এমনকি কোনও নামও নয়। যদি তারা কোনও প্যাকেজে কোনও লাইব্রেরি abc2পাঠায় তবে তাদের নিজের সফ্টওয়্যারটি সরানোর জন্য হুপের মধ্য দিয়ে যেতে হবে যা কখনও কখনও রূপান্তর প্যাকেজের সাহায্যে আপগ্রেড করার উপর নির্ভর করে । বেশিরভাগ নির্ভরযোগ্য প্যাকেজগুলির জন্য যদি এটি লাইব্রেরি থেকে কাজ করে তবে প্রধান সংস্করণ নম্বরটি রেখে দেওয়া আরও সুবিধাজনক। সুতরাং এমনকি যদি উভয়ই এবং বিতরণে উপলব্ধ কোনও পর্যায়ে উপলব্ধ হওয়া উচিত, তবে প্রায়শই তাকে ডাকা হত (ঠিক তখনও বলা হয়েছিল যখন তখনও ছিল না ), এবং যত তাড়াতাড়ি কোনও প্যাকেজ বিতরণের মধ্যে নির্ভর করে না ততই ফেলে দেওয়া সম্ভব হয়abc2abc3abc2abc3abc3abcabc2abc3abc2abc2 পুরাপুরি।

নম্বর স্কিমটি অভিন্নভাবে অনুসরণ করা হয় না, তবে আমি কেবল এটিই কল্পনা করতে পারি যে এই জাতীয় স্কিম কীভাবে ব্যবহার করবেন সে সম্পর্কে ইন্টারনেট প্রচারের তথ্য এবং লাইব্রেরি ব্যবহারকারীদের (বিতরণ বিকাশকারীগণ সহ) পিছনে সামঞ্জস্যের মতো গুরুত্বপূর্ণ বিষয়গুলি পরিষ্কার করার জন্য চাপ দেওয়া হয়েছে pressure লাইব্রেরিতে অন্তর্ভুক্ত একটি পরিবর্তিত ফাইল পড়ার কারণে, এটি আরও সাধারণ হয়ে উঠেছে contrib

একটি পাল্টা উদাহরণ, তবে একটি লাইব্রেরির নয় পাইথন ইন্টারপ্রেটার, যা তার ভাগ করা অবজেক্ট এবং সংখ্যার সংখ্যার পরিবর্তনের উপর পিকিং বিন্যাসের সাথে সামঞ্জস্য নয়। অতএব আপনি পাইথন (২. series সিরিজের সর্বশেষ) এবং পাইথন ৩ (বর্তমানে পাইথন ৩.৪ সিরিজের সর্বশেষ) এবং পাইথন ২.6 (কম সাধারণ না হওয়া) এর স্পষ্ট প্যাকেজ এবং অজগর ৩.৩ দেখতে পাবেন।

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