সংস্করণ নিয়ন্ত্রণে একই কোডবেস থেকে দুটি পৃথক সফ্টওয়্যার সংস্করণ বজায় রাখা


45

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

আমি বর্তমানে মূল কোডবেস (ফ্রি সংস্করণ) এর পাশ এবং শোধিত সংস্করণের শাখাগুলির জন্য ব্যবহার masterএবং developশাখা বিবেচনা করছি । যখন ফ্রি সংস্করণে পরিবর্তন আনা হয় এবং শাখায় মার্জ করা হয় ( অবশ্যই পুরো পরীক্ষার পরে ) এটি আরও পরীক্ষার জন্য কমান্ডের মাধ্যমে শাখায় অনুলিপি হয়ে যায় এবং তারপরে মার্জ হয়ে যায় ।master-premiumdevelop-premiummasterdevelopdevelop-premiumcherry-pickmaster-premium

এই পরিস্থিতিটি পরিচালনা করার জন্য এটিই কি সেরা কর্মপ্রবাহ? সচেতন হওয়ার জন্য কি কোনও সম্ভাব্য সমস্যা, সতর্কতা বা সমস্যা রয়েছে? আমি ইতিমধ্যে যেটা নিয়ে এসেছি তার চেয়ে ভাল শাখার কৌশল কী আছে?

আপনার প্রতিক্রিয়া অত্যন্ত প্রশংসা করা হয়!

পিএস এটি গিটের মধ্যে থাকা কোনও পিএইচপি স্ক্রিপ্টের জন্য, তবে উত্তরগুলি কোনও ভাষা বা ভিসিএসের ক্ষেত্রে প্রয়োগ করা উচিত।

উত্তর:


83

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

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

এই নকশাটি পেয়ে আপনি 5 টি বিভিন্ন স্বাদও প্রেরণ করতে পারেন এবং খুব নমনীয় পেতে পারেন, এমনকি তৃতীয় পক্ষগুলিকে অবদান রাখার অনুমতি দেয়।


2
হ্যাঁ আমি বিছানায় যাওয়ার আগে গত রাতে এই বিষয়টি ভাবতে শুরু করি। ধন্যবাদ!
জোসেফ লেডি

3
আধুনিক উইন্ডোজ এইভাবে ডিজাইন করা হয়েছে, সমস্ত সংস্করণে একই কোড রয়েছে এবং ব্যবহারের লাইসেন্স কী এর উপর নির্ভর করে বৈশিষ্ট্যগুলি আনলক করা রয়েছে।
মাকিং হাঁস

39

আমি দৃ strongly়ভাবে এই উদ্দেশ্যে শাখা ব্যবহার না করার পরামর্শ দিচ্ছি । সাধারণভাবে, আপনার সেই জিনিসগুলির জন্য শাখাগুলি বিবেচনা করা উচিত যা পরে (আবার হতে পারে) আবার একত্রিত হয়ে যাবে (বা মুক্তি শাখাগুলির জন্য, যেখানে আপনি শাখাগুলির একটির বিকাশ বন্ধ করে দেবেন)। আপনার ক্ষেত্রে, আপনি কখনই আপনার "বেসিক" এবং "প্রিমিয়াম" সংস্করণগুলিকে একত্রিত করতে পারবেন না এবং সেগুলি উভয়ই অনির্দিষ্টকালের জন্য বজায় রাখা হবে, তাই শাখাগুলি যথাযথ নয়।

পরিবর্তে, উত্স কোডের একটি সাধারণ সংস্করণ বজায় রাখুন এবং শর্তসাপেক্ষ সংকলন ব্যবহার করুন (যেমন #ifdefসি / সি ++ এ, পিএইচপি-র জন্য সমতুল্য কি তা নিশ্চিত হন না) "বেসিক" এবং "প্রিমিয়াম" এর মধ্যে পৃথক পৃথক কোডের বিভাগগুলি অন্তর্ভুক্ত করতে বা বাদ দিতে।

দেখে মনে হচ্ছে পিএইচপি-তে শর্তসাপেক্ষ সংকলন বৈশিষ্ট্যটি অন্তর্নির্মিত নাও থাকতে পারে, সুতরাং cppআপনার সাধারণ উত্স কোডটি প্রিপ্রোসেস করতে আপনি সি প্রিপ্রসেসর ব্যবহার করতে পারেন ( সম্ভবত আপনার এটি ইতিমধ্যে রয়েছে) এবং সেখান থেকে একটি "বেসিক" এবং "প্রিমিয়াম" উত্পাদন করতে পারে প্রিপ্রসেসর নির্দেশ ছাড়াই সংস্করণ। অবশ্যই, আপনি যদি এটি করতে চান তবে আপনার ব্যবহার করা উচিত makeবা প্রিপ্রসেসর চালানোর প্রক্রিয়াটিকে স্বয়ংক্রিয় করার অনুরূপ কিছু।


আপনি শাখাগুলি সম্পর্কে যা বলছেন তা মোটেই বোঝা যায়! সম্ভবত পরিবর্তে আমি কেবলমাত্র প্রিমিয়াম কোডযুক্ত একটি পৃথক রেপো তৈরি করতে পারি এবং বেস কোডের সাথে এটি একত্রিত করতে কোনও প্রকারের মুক্তি স্ক্রিপ্ট বা উপ-মডিউল ব্যবহার করতে পারি? এটি টিডিডিটিকে আরও শক্ত করে তুলতে পারে, যদিও ...
জোসেফ লেডি

14
অন্য সংগ্রহস্থল তৈরি করা শাখা তৈরির চেয়েও খারাপ! আপনি অবশ্যই একটি সমাধান বেছে নিতে চান যাতে সংস্করণিত কোডটির নূন্যতম সদৃশ জড়িত।
গ্রেগ হিউগিল

2
দ্বিতীয় রেপোটির মূল বিষয়টি কেবলমাত্র অতিরিক্ত কোড রাখা - পুরো অ্যাপ্লিকেশনটির অন্য কোনও অনুলিপি নয়।
জোসেফ লেডি

1
আমি দেখছি, এটি "প্লাগইন" মডেলের মতো হবে, যেখানে আপনার বেসিক কোডটিতে প্লাগইনগুলি লোড এবং চালানোর দক্ষতা রয়েছে (যদি সেগুলি বিদ্যমান থাকে)। প্লাগইন কোডটি পৃথক এবং প্রিমিয়াম বৈশিষ্ট্যগুলি সরবরাহ করে।
গ্রেগ হিউগিল

4
@ জোসেফ: দুটি কোড বেস ব্যবহার করা কেবল তখনই উপযুক্ত যদি দুটি কোড ঘাঁটির সংস্করণ একে অপরের থেকে প্রায় স্বতন্ত্র থাকে। যদি এটি না হয় তবে আমি গ্রেগ যা লিখেছিলেন তা করার এবং সমস্ত কিছু একটি রেপোতে রাখার জন্য দৃ recommend়ভাবে সুপারিশ করব । কেবলমাত্র আমি পুনর্বিবেচনা করতে চাই "সি প্রিপ্রসেসর" ব্যবহার। আমার অনুমান যে আপনার পছন্দের ভাষায় লিখিত একটি ছোট স্ক্রিপ্ট (পিএইচপি নিজেই ভাল, পার্ল বা পাইথন আরও ভাল) যা আপনার কোডের একটি অনুলিপি তৈরি করে (কোনওভাবে চিহ্নিত) প্রিমিয়াম বৈশিষ্ট্যগুলি কৌশলটি করতে পারে।
ডক ব্রাউন

8

আমরা 2 টি পৃথক প্রকল্প ব্যবহার করছি, বেসিক প্রকল্প এবং প্রিমিয়াম যা বেসিক প্রকল্পের উপর নির্ভর করে। ব্র্যাক ব্যবহার করবেন না, এগুলি সাধারণত বৈশিষ্ট্যের জন্য ব্যবহৃত হয়।


এটি আমার কাছে আবেদন করে, কারণ আপনি আপনার বিল্ড স্ক্রিপ্টটি উভয় বুনিয়াদি এবং প্রিমিয়াম প্রোগ্রাম তৈরি করতে স্বয়ংক্রিয় করতে ব্যবহার করতে পারেন।
নিওন্টাপির

1
সাধারণ ক্ষেত্রে আপনার 3 টি প্রকল্প প্রয়োজন: সাধারণ অংশ, প্রায়শই একটি গ্রন্থাগার হিসাবে সংগঠিত হয় এবং দুটি পৃথক সংস্করণের জন্য কাস্টম অংশ।
অ্যান্ড্রি টাইলিচকো

3

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

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

গ্রেগের উত্তরে পরামর্শ দেওয়া হয়েছে যে আপনি "সেই জিনিসগুলির জন্য শাখাগুলি বিবেচনা করুন যা (বা হতে পারে) পরে আবার একত্রিত হবে"। যে পদ্ধতির সাথে আমি কেবল বর্ণনা করেছি এটিই কেস, ব্যতীত সমস্ত প্রতিশ্রুতির চূড়ান্ত শাখাটি হবে master-premiumনা master(যা আসলে master-basic) actually

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


0

"হার্ডওয়্যার" এ এটি প্রায়শই করা হয়, তারা জঞ্জাল নিয়ন্ত্রণের জন্য বিক্রি হওয়া সিস্টেম, দুঃখিত আমি তাদের কী বলে মনে করতে পারি না।

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

গ্রাহকরা ইতিমধ্যে যে ওয়াশিং মেশিন নিয়ে এসেছেন তাতে আপগ্রেড হওয়ার প্রত্যাশা নেই, প্রতি কয়েক মাসে একটি নতুন মডেলও সরবরাহ করা হয় না।

আমরা বেশিরভাগ সেই পৃথিবীতে বাস করি না, তাই আপনি ওয়াশিং মেশিনের জন্য সফ্টওয়্যার না লিখে গ্রেগ যা বলেন তা করুন।

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