জাভা প্রকল্পগুলিতে নিয়মিত বিল্ড নম্বরিং এবং সংস্করণ নম্বর পরিচালনার জন্য বর্তমান সেরা-অনুশীলনগুলি কী কী? বিশেষ করে:
বিতরণযোগ্য বিকাশের পরিবেশে পদ্ধতিগতভাবে বিল্ড সংখ্যা কীভাবে পরিচালনা করবেন
রানটাইম অ্যাপ্লিকেশনটিতে উত্স / উপলব্ধ সংস্করণ নম্বরগুলি কীভাবে বজায় রাখা যায়
উত্স সংগ্রহস্থলের সাথে কীভাবে সঠিকভাবে সংহত করা যায়
সংস্করণ সংখ্যা বনাম ভান্ডার ট্যাগগুলি কীভাবে স্বয়ংক্রিয়ভাবে পরিচালনা করবেন
ক্রমাগত বিল্ড অবকাঠামোতে কীভাবে সংহত করা যায়
বেশ কয়েকটি সরঞ্জাম উপলব্ধ রয়েছে এবং পিঁপড়ার (আমরা যে বিল্ড সিস্টেমটি ব্যবহার করছি) এর একটি কার্য রয়েছে যা একটি বিল্ড সংখ্যা বজায় রাখবে, তবে সিভিএস, এসএনএন বা অনুরূপ ব্যবহার করে একাধিক, সমবর্তী বিকাশকারীদের সাথে কীভাবে এটি পরিচালনা করা যায় তা পরিষ্কার নয় it's ।
[Edit]
বেশ কয়েকটি ভাল এবং সহায়ক আংশিক বা নির্দিষ্ট উত্তর নীচে উপস্থিত হয়েছে, সুতরাং আমি তাদের কয়েকটি সংক্ষিপ্ত করব। আমার কাছে মনে হচ্ছে এটির পক্ষে সত্যই শক্তিশালী "সেরা অনুশীলন" নেই, বরং ওভারল্যাপিং আইডিয়াগুলির সংকলন। নীচে, আমার সংক্ষিপ্তসারগুলি এবং কিছু ফলস্বরূপ প্রশ্নগুলি সন্ধান করুন যা ভাবেন লোকেরা ফলো-আপ হিসাবে উত্তর দেওয়ার চেষ্টা করতে পারে। [স্ট্যাকওভারফ্লোতে নতুন ... আমি যদি এই ভুল করে থাকি তবে দয়া করে মন্তব্য সরবরাহ করুন]]
আপনি যদি এসভিএন ব্যবহার করে থাকেন তবে যাত্রার জন্য নির্দিষ্ট চেকআউটটির সংস্করণ উপস্থিত হয়। বিল্ড নাম্বারিং একটি অনন্য বিল্ড নম্বর তৈরি করতে এটি কাজে লাগাতে পারে যা নির্দিষ্ট চেকআউট / সংশোধন সনাক্ত করে identif [সিভিএস, যা আমরা উত্তরাধিকারসূত্রে কারণে ব্যবহার করছি, এই স্তরটির যথেষ্ট অন্তর্দৃষ্টি দেয় না ... ট্যাগগুলির সাথে ম্যানুয়াল হস্তক্ষেপ আপনাকে সেখানে খণ্ড খণ্ড পেয়েছে]]
আপনি যদি আপনার বিল্ড সিস্টেম হিসাবে ম্যাভেন ব্যবহার করছেন, এসসিএম থেকে সংস্করণ নম্বর উত্পাদন করার পাশাপাশি স্বয়ংক্রিয়ভাবে প্রকাশের উত্পাদন করার জন্য একটি রিলিজ মডিউল রয়েছে। [আমরা বিভিন্ন কারণে মাকেন ব্যবহার করতে পারি না, তবে এটি তাদের পক্ষে সহায়তা করে। [ মার্সেলো-মনোবলকে ধন্যবাদ ]]
আপনি যদি আপনার বিল্ড সিস্টেম হিসাবে পিঁপড়া ব্যবহার করছেন , নিম্নলিখিত টাস্ক বিবরণটি জাভা .poperties ফাইল ক্যাপচার বিল্ড তথ্য তৈরি করতে সহায়তা করতে পারে, যা পরে আপনার বিল্ডে বিভিন্ন উপায়ে ফোল্ড করা যেতে পারে। [আমরা হডসন থেকে প্রাপ্ত তথ্য অন্তর্ভুক্ত করার জন্য এই ধারণাটি প্রসারিত করেছি, ধন্যবাদ শহীদ-ভেড়া ]।
পিপীলিকা এবং ম্যাভেন (এবং হডসন এবং ক্রুজ নিয়ন্ত্রণ) একটি .properties ফাইলে বিল্ড নম্বর পেতে বা একটি .txt / .html ফাইলের জন্য সহজ উপায় সরবরাহ করে। ইচ্ছাকৃতভাবে বা দুর্ঘটনাক্রমে হস্তক্ষেপ করা থেকে বিরত রাখার পক্ষে কি এই "নিরাপদ" যথেষ্ট? এটি নির্মাণের সময় "সংস্করণ" শ্রেণিতে সংকলন করা ভাল কি?
কথন: সংখ্যায়ন বিল্ড সংজ্ঞায়িত করা উচিত / মত একটি ধারাবাহিক ইন্টিগ্রেশন সিস্টেমের মধ্যে প্রণয়ন হাডসন । [ মার্সেলো-মোড়লসকে ধন্যবাদ ] আমরা এই পরামর্শটি নিয়েছি, কিন্তু এটি মুক্তির প্রকৌশল প্রশ্নটি উন্মুক্ত করে দেয়: একটি মুক্তি কীভাবে হয়? একটি রিলিজে একাধিক বিল্ডনম্বার রয়েছে? বিবিধ প্রকাশ থেকে বিল্ডার নাম্বারগুলির মধ্যে কি কোনও অর্থপূর্ণ সম্পর্ক রয়েছে?
প্রশ্ন: একটি বিল্ড সংখ্যার পিছনে উদ্দেশ্য কী? এটি কিউএ জন্য ব্যবহৃত হয়? কিভাবে? এটি কি প্রাথমিকভাবে বিকাশকারীরা বিকাশের সময় একাধিক বিল্ডের মধ্যে বিচ্ছিন্ন করতে ব্যবহার করে, বা কিউএর জন্য নির্ধারিত হয় যে কোনও ব্যবহারকারী কী কী বিল্ড নির্ধারণ করতে পারে? যদি লক্ষ্যটি প্রজননযোগ্যতা হয় তবে তাত্ত্বিকভাবে এটিই একটি রিলিজ সংস্করণ নম্বর সরবরাহ করা উচিত - কেন তা করে না? (দয়া করে নীচে আপনার উত্তরের অংশ হিসাবে এর উত্তর দিন, এটি আপনার পছন্দ / প্রস্তাবিত পছন্দ আলোকিত করতে সহায়তা করবে ...)
প্রশ্ন: ম্যানুয়াল বিল্ডগুলিতে বিল্ড নম্বরগুলির জন্য কোনও জায়গা আছে? এটি কি এতটাই সমস্যাযুক্ত যে প্রত্যেকেরই সিআই সমাধান ব্যবহার করা উচিত?
প্রশ্ন: বিল্ড নম্বরগুলি কি এসসিএম-এ পরীক্ষা করা উচিত? যদি লক্ষ্যটি নির্ভরযোগ্যভাবে এবং নির্বিঘ্নে একটি নির্দিষ্ট বিল্ড সনাক্ত করে, কীভাবে ক্র্যাশ / পুনঃসূচনা / ইত্যাদি হতে পারে এমন বিভিন্ন ধ্রুবক বা ম্যানুয়াল বিল্ড সিস্টেমগুলি কীভাবে মোকাবেলা করা যায় ...
প্রশ্ন: কোনও বিল্ড নম্বরটি সংক্ষিপ্ত এবং মিষ্টি হওয়া উচিত (অর্থাত্ একঘেয়েভাবে ক্রমবর্ধমান পূর্ণসংখ্যার) যাতে সংরক্ষণাগারটির জন্য ফাইলের নামগুলি আটকে রাখা, যোগাযোগের ক্ষেত্রে উল্লেখ করা সহজ ইত্যাদি ... ... বা এটি দীর্ঘ এবং ব্যবহারকারীর নাম পূর্ণ হওয়া উচিত, খেজুর, মেশিনের নাম ইত্যাদি?
প্রশ্ন: দয়া করে বিল্ড সংখ্যার অ্যাসাইনমেন্টটি কীভাবে আপনার বৃহত্তর স্বয়ংক্রিয় রিলিজ প্রক্রিয়াটির সাথে খাপ খায় সে সম্পর্কে বিশদ সরবরাহ করুন। হ্যাঁ, খোদাই করা প্রেমিকারা, আমরা জানি যে এটি হয়ে গেছে এবং হয়ে গেছে, তবে আমরা সবাই এখনও কুল-এইড পান করি নি ...
আমি কমপক্ষে আমাদের সিভি / পিঁপড়া / হাডসন সেটআপের সুনির্দিষ্ট উদাহরণের জন্য এটি পুরোপুরি উত্তর হিসাবে দেখতে চাই, যাতে কেউ এই প্রশ্নের ভিত্তিতে একটি সম্পূর্ণ কৌশল তৈরি করতে পারে। আমি এই বিশেষ কেসের জন্য স্যুপ-টু-বাদাম বিবরণ দিতে পারে এমন কেউই "উত্তর" হিসাবে চিহ্নিত করব (সিভিএস ট্যাগিং স্কিম, প্রাসঙ্গিক সিআই কনফিগারেশন আইটেম এবং রিলিজ পদ্ধতি যা বিল্ড নম্বরটিকে রিলিজের মধ্যে ভাঁজ করে যেমন প্রোগ্রামিয়ালি অ্যাক্সেসযোগ্য)) যদি আপনি অন্য কোনও নির্দিষ্ট কনফিগারেশনের জন্য / জিজ্ঞাসা করতে চান (বলুন, এসএনএন / মাভেন / ক্রুজ নিয়ন্ত্রণ) আমি এখান থেকে প্রশ্নের সাথে লিঙ্ক করব। --JA
[২৩ অক্টোবর 09 এডিট করুন] আমি শীর্ষ-ভোট প্রাপ্ত উত্তরগুলি গ্রহণ করেছি কারণ আমি মনে করি এটি একটি যুক্তিসঙ্গত সমাধান, অন্য উত্তরগুলির বেশ কয়েকটিতে ভাল ধারণাও রয়েছে। যদি কেউ এই কিছুটিকে শহীদ-মেষশাবকের সাথে সংশ্লেষিত করতে কোনও ক্র্যাক নিতে চান তবে আমি অন্যটিকে গ্রহণ করার বিষয়টি বিবেচনা করব। শহীদ-মেষশাবকের সাথে আমার একমাত্র উদ্বেগটি হ'ল এটি নির্ভরযোগ্যভাবে সিরিয়ালযুক্ত বিল্ড নম্বর তৈরি করে না - এটি নির্মাতার সিস্টেমের স্থানীয় ঘড়ির উপর নির্ভর করে নির্বিঘ্ন বিল্ড সংখ্যা সরবরাহ করে, যা দুর্দান্ত নয়।
[জুলাই 10 সম্পাদনা করুন]
আমরা এখন নীচের মত একটি বর্গ অন্তর্ভুক্ত। এটি সংস্করণ নম্বরগুলি চূড়ান্ত নির্বাহযোগ্যতে সংকলিত করার অনুমতি দেয়। সংস্করণ তথ্যের বিভিন্ন ফর্মগুলি লগিং ডেটা, দীর্ঘমেয়াদী সংরক্ষণাগারভুক্ত আউটপুট পণ্যগুলিতে নির্গত হয় এবং একটি নির্দিষ্ট বিল্ডে আউটপুট পণ্যগুলির আমাদের (কখনও কখনও বহু বছর পরে) বিশ্লেষণ সনাক্ত করতে ব্যবহৃত হয়।
public final class AppVersion
{
// SVN should fill this out with the latest tag when it's checked out.
private static final String APP_SVNURL_RAW =
"$HeadURL: svn+ssh://user@host/svnroot/app/trunk/src/AppVersion.java $";
private static final String APP_SVN_REVISION_RAW = "$Revision: 325 $";
private static final Pattern SVNBRANCH_PAT =
Pattern.compile("(branches|trunk|releases)\\/([\\w\\.\\-]+)\\/.*");
private static final String APP_SVNTAIL =
APP_SVNURL_RAW.replaceFirst(".*\\/svnroot\\/app\\/", "");
private static final String APP_BRANCHTAG;
private static final String APP_BRANCHTAG_NAME;
private static final String APP_SVNREVISION =
APP_SVN_REVISION_RAW.replaceAll("\\$Revision:\\s*","").replaceAll("\\s*\\$", "");
static {
Matcher m = SVNBRANCH_PAT.matcher(APP_SVNTAIL);
if (!m.matches()) {
APP_BRANCHTAG = "[Broken SVN Info]";
APP_BRANCHTAG_NAME = "[Broken SVN Info]";
} else {
APP_BRANCHTAG = m.group(1);
if (APP_BRANCHTAG.equals("trunk")) {
// this isn't necessary in this SO example, but it
// is since we don't call it trunk in the real case
APP_BRANCHTAG_NAME = "trunk";
} else {
APP_BRANCHTAG_NAME = m.group(2);
}
}
}
public static String tagOrBranchName()
{ return APP_BRANCHTAG_NAME; }
/** Answers a formatter String descriptor for the app version.
* @return version string */
public static String longStringVersion()
{ return "app "+tagOrBranchName()+" ("+
tagOrBranchName()+", svn revision="+svnRevision()+")"; }
public static String shortStringVersion()
{ return tagOrBranchName(); }
public static String svnVersion()
{ return APP_SVNURL_RAW; }
public static String svnRevision()
{ return APP_SVNREVISION; }
public static String svnBranchId()
{ return APP_BRANCHTAG + "/" + APP_BRANCHTAG_NAME; }
public static final String banner()
{
StringBuilder sb = new StringBuilder();
sb.append("\n----------------------------------------------------------------");
sb.append("\nApplication -- ");
sb.append(longStringVersion());
sb.append("\n----------------------------------------------------------------\n");
return sb.toString();
}
}
এটি যদি উইকির আলোচনার দাবি রাখে তবে মন্তব্য করুন।
gradle
এবং / অথবা ব্যবহারের সময় একই ধরণের সহজ পদ্ধতির থাকে git
?