কীভাবে আমি আমাদের সিআই প্ল্যাটফর্মের (হাডসন) এর মাধ্যমে সি # অ্যাসেম্বলি সংস্করণটিকে স্বয়ংক্রিয়ভাবে বৃদ্ধি করতে পারি?


112

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

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

আমি আগে সেটআপ করেছি (আমরা হডসনকে খুঁজে পাওয়ার আগে ) একটি msbuildবা কমান্ড লাইন (মনে করতে পারি না) এর মাধ্যমে মূল্য বাড়ানোর উপায় , তবে হাডসনের সাথে, এটি এসভিএন সংগ্রহস্থল আপডেট করবে এবং অন্য কোনও বিল্ডকে ট্রিগার করবে। এর ফলে হডসন প্রতি ঘন্টা এসভিএন পোল করায় ধীর অসীম লুপ তৈরি হবে।

হডসনের বর্ধিত সংস্করণ নম্বরটি কী খারাপ ধারণা? এটি করার বিকল্প উপায় কী হবে?

আদর্শভাবে, একটি সমাধানের জন্য আমার মানদণ্ডগুলি এমন একটি হবে:

  • assemblyinfo.csকোনও বিল্ডের আগে বিল্ড সংখ্যা বাড়ায়
  • যেসব অ্যাসেমব্লিতে পরিবর্তন হয়েছে কেবল সেগুলি বিল্ডের সংখ্যা বৃদ্ধি করে। এটি সম্ভব হবে না কারণ প্রতিবার এটি নির্মাণের সময় হডসন প্রকল্পের ফোল্ডারটি মুছুন
  • কোড ভান্ডারে (বর্তমানে ভিজ্যুয়ালএসভিএন ) পরিবর্তিত এসেম্বলিনফো- কোডগুলি সরিয়ে দেয়
  • পরের বার পরিবর্তনের জন্য স্ক্যান করলে হডসন কোনও নতুন বিল্ডকে ট্রিগার করতে দেয় না

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

আমি এখন পর্যন্ত যা কিছু পেয়েছি তা হ'ল একটি নিবন্ধ যা ব্যাখ্যা করে যে কীভাবে সংস্করণ নম্বরটি স্বয়ংক্রিয়ভাবে বর্ধিত হবে, কিছুই সিআই প্ল্যাটফর্ম বিবেচনায় নেয় না যা অসীম লুপে কাটা যায়।

উত্তর:


63

একটি সহজ বিকল্প হ'ল ভার্শন বৈশিষ্ট্যটি major.minor.*(এসেম্বলিআইএনফো ফাইল টেমপ্লেটে বর্ণিত হিসাবে) সেট করে আপনি আপনার জন্য সি # পরিবেশ বাড়িয়ে তুলুন বিধানসভা সংস্করণটি for

যদিও আপনি আরও ব্যাপক সমাধান খুঁজছেন be

সম্পাদনা (একটি মন্তব্যে প্রশ্নের জবাব):

থেকে AssemblyInfo.cs:

// Version information for an assembly consists of the following four values:
//
//      Major Version
//      Minor Version 
//      Build Number
//      Revision
//
// You can specify all the values or you can default the Build and Revision Numbers 
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]

আমি এর আগে কখনও আসিনি, আপনি এটি কী করে তার সম্পর্কে আরও কিছুটা বিশদে যেতে পারেন। এটি কি কেবল একটি আইডিইর মধ্যে কাজ করে বা এটি সিআই প্ল্যাটফর্মের সাথে বিকাশকারীদের পুরো টিম জুড়ে কাজ করে?
অ্যালেন রাইস

আহ আমি এর আগে দেখেছি, এটি একটি গ্রহণযোগ্য সমাধান হতে পারে তবে # বিল্ট সাবভার্সনের মধ্যে সংরক্ষণ করা হয় না I আমার কাছে ফাইল সংরক্ষণাগার সংরক্ষণের জন্য হডসন সেটআপ আছে এবং সেভাবে এটি সংরক্ষণ করা হয়েছে যাতে গ্রহণযোগ্য হতে পারে। সেই প্রক্রিয়াটি কীভাবে কাজ করে সে সম্পর্কে আমাকে আরও কিছু গবেষণা করতে হবে, ধন্যবাদ! আপনি জানেন না যে এটি কীভাবে মান হিসাবে রাখবে তা নির্ধারণ করে, আপনি কি করবেন?
অ্যালেন রাইস

1
আপনার প্রশ্নের উত্তরের জন্য নীচে আমার উত্তর দেখুন। মানগুলি নির্ধারিত সময়ের ভিত্তিতে নির্ধারিত হয়।
কাইল ট্রুবারম্যান

বাহ, আমি মনে করি এটি কার্যকর হবে। নিশ্চিত নয় যে আমরা কীভাবে এমন সাধারণ সমাধানটিকে উপেক্ষা করেছি
অ্যালেন রাইস

আশা করি এটি হয়েছে, খুশি আমি সাহায্য করতে পারলাম। কেন সহজ উপায় যখন সহজ, দ্রুততর পথটি সঠিক পথ হয় তখন কেন কিছু করেন? :)
গ্রেগ ডি

65

এসেম্বলিফিলিভিশন বৈশিষ্ট্যটি স্ট্যাম্পিংয়ের জন্য আমি এখানে যা করেছি।

এসেম্বলিআইফোনসিএস থেকে এসেম্বলিফিলিভিশনটি সরানো হয়েছে

প্রজেক্টে এসেম্বলিফিলইনফো.সি.এস নামে একটি নতুন, খালি, ফাইল যুক্ত করুন।

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

প্রকল্প (csproj) ফাইলটি সম্পাদনা করুন, এটি কেবল একটি এমএসবিল্ড ফাইল এবং নিম্নলিখিতটি যুক্ত করুন।

কোথাও কোথাও একটি <PropertyGroup>সংস্করণ উল্লেখ করা হবে । এটি পরিবর্তন করুন যাতে এটি যেমন

 <Major>1</Major>
 <Minor>0</Minor>
 <!--Hudson sets BUILD_NUMBER and SVN_REVISION -->
 <Build>$(BUILD_NUMBER)</Build>
 <Revision>$(SVN_REVISION)</Revision>

হাডসন যখন প্রকল্পটি হডসনের উপর নির্মিত হবে তখন আপনি দেখেন সেই env ভেরিয়েবলগুলি সরবরাহ করে (ধরে নিলেন এটি সাবভারশন থেকে আনা হয়েছে)।

প্রকল্প ফাইলের নীচে, অ্যাড করুন

 <Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" Condition="Exists('$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets')" />
  <Target Name="BeforeBuild" Condition="Exists('$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets')">
    <Message Text="Version: $(Major).$(Minor).$(Build).$(Revision)" />
    <AssemblyInfo CodeLanguage="CS" OutputFile="AssemblyFileInfo.cs" AssemblyFileVersion="$(Major).$(Minor).$(Build).$(Revision)" AssemblyConfiguration="$(Configuration)" Condition="$(Revision) != '' " />
  </Target>

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

ফলাফলটি হ'ল যখনই আপনি হডসন বিল্ড ইস্যু করবেন, ফলস্বরূপ অ্যাসেম্বলিটি 1.0.HUDSON_BUILD_NR.SVN_REVISION উদাহরণস্বরূপ 1.0.6.2632, যা হডসনে 6'তম বিল্ডটি বোঝায়, বিপর্যয় পুনর্বিবেচনা 2632 থেকে বিট করুন an


1
সুতরাং কেবল এটি আপডেট করতে: পদ্ধতিটি সি # এর জন্য কাজ করে। আমি এটি কিছু সময়ের জন্য ব্যবহার করে আসছি। তবে সি ++ অ্যাসেমব্লিগুলি (যেমন সি ++ / সিএলআই) এখনও একটি সমস্যা are আমি যতদূর বলতে পারি, এসেম্বলিআইফো কার্যটি বৈধ সি ++ উত্পাদন করে না। এছাড়াও, আমি মনে করি এই পদ্ধতিটির কিছুটা খারাপ দিক রয়েছে এটি অন্যান্য বিকাশকারীদের কী হচ্ছে তা বোঝার জন্য এটি কিছুটা অস্বচ্ছ। খুব খারাপ আপনি সংস্করণ নম্বরগুলি সরাসরি এমএসবিল্ডকে সম্পত্তি হিসাবে ঠেলাতে পারবেন না ...
সিজেব্রু

@ সিজেব্রু আপনি কেবল একটি ছোট একটি .bat ফাইল তৈরি করতে পারেন যা এসেম্বলিআইএনফো-এর জন্য সি ++ কোড তৈরি করে এবং এই স্কিপটটি থেকে মিসবিল্ড কিকটি পেয়েছে। আমি এটিকে সম্পত্তি হিসাবে চাপ দিয়ে কী বোঝাতে চাইছি তা নিশ্চিত নই, আপনি নিজের পছন্দ মতো যে কোনও সম্পত্তিতে সংস্করণ স্ট্রিংগুলি অবশ্যই স্টাফ করতে পারেন - এখানে আমি যে মেজর / গৌণ / বিল্ড / রিভিশন ব্যবহার করেছি সেগুলি ব্যবহার করার দরকার নেই।
টি

এই রুটটি ব্যবহার করে কি কিছু অর্জন করা হয়েছে? কেবলমাত্র এসেম্বলিফিলিভিশনটি মন্তব্য করে এবং এটি [সমাবেশ: এসেম্বলি ভার্সন ("1.0। *")] এর সাথে স্বয়ংক্রিয়ভাবে মিলবে?
চেম্বারলাইন

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

42

এখানে একটি মার্জিত সমাধান যা একটি নতুন প্রকল্প যুক্ত করার সময় সামান্য কাজের সামনে প্রয়োজন হয় তবে খুব সহজেই প্রক্রিয়াটি পরিচালনা করে।

ধারণাটি হ'ল প্রতিটি প্রকল্প একটি সলিউশন ফাইলে লিঙ্ক করে যার মধ্যে কেবল অ্যাসেম্বলি সংস্করণ তথ্য থাকে। সুতরাং আপনার বিল্ড প্রক্রিয়াটি কেবল একটি একক ফাইল আপডেট করতে হবে এবং সংবিধানের পরে সমস্ত ফাইলগুলির সমাবেশ সংস্করণ এক ফাইল থেকে টানতে হবে।

পদক্ষেপ:

  1. আপনার সমাধান ফাইল * .সিএস ফাইলে একটি শ্রেণি যুক্ত করুন, আমি ন্যূনতম SharedAsorsesProperties.cs নাম রেখেছি
  2. নতুন ফাইলটি থেকে সমস্ত সিএস তথ্য মুছে ফেলুন
  3. এসেম্বলিআইনফো ফাইল থেকে অ্যাসেমব্লির তথ্যগুলি কেটে দিন: [সমাবেশ: এসেম্বলি ভার্সন ("০.০.০.০")] [সমাবেশ: এসেম্বলিফিলিভিশন ("০.০.০.০")]]
  4. "সিস্টেমটি ব্যবহার করে। বিবরণ যুক্ত করুন"; ফাইলটিতে এবং তারপরে আপনার নতুন সিএস ফাইলে ডেটা আটকান (প্রাক্তন SharedAsorsesProperties.cs)
  5. আপনার প্রকল্পে একটি বিদ্যমান আইটেম যুক্ত করুন (অপেক্ষা করুন ... ফাইলটি যুক্ত করার আগে পড়ুন)
  6. ফাইলটি নির্বাচন করুন এবং আপনি অ্যাড ক্লিক করার আগে অ্যাড বোতামের পাশের ড্রপডাউনটি ক্লিক করুন এবং "লিঙ্ক হিসাবে যুক্ত করুন" নির্বাচন করুন।
  7. সমাধানে বিদ্যমান এবং নতুন প্রকল্পগুলির জন্য 5 এবং 6 ধাপ পুনরাবৃত্তি করুন

আপনি যখন কোনও লিঙ্ক হিসাবে ফাইলটি যুক্ত করবেন, তখন এটি প্রকল্পের ফাইলে ডেটা সঞ্চয় করে এবং সংকলন করার পরে এই ফাইলটি থেকে অ্যাসেম্বলি সংস্করণ তথ্য টেনে নেয়।

আপনার উত্স নিয়ন্ত্রণে, আপনি একটি ব্যাট ফাইল বা স্ক্রিপ্ট ফাইল যুক্ত করেন যা কেবলমাত্র SharedAs એવુંProperties.cs ফাইলকে বাড়ায় এবং আপনার সমস্ত প্রকল্পগুলি সেই ফাইল থেকে তাদের সমাবেশ তথ্য আপডেট করবে update


ধন্যবাদ, মার্ক। মৃত লিঙ্কটির জন্য দুঃখিত, এটি প্রমাণিত হয়েছে যে সম্প্রদায় সার্ভারটি সরানো এত সহজ নয়। আমার সেই বিষয়টির জন্য সাহায্যের সন্ধান করা উচিত ...
সানডার্ডার্ড

11

হাডসন নির্দিষ্ট পাথ এবং ফাইলগুলির পরিবর্তনগুলি উপেক্ষা করার জন্য কনফিগার করা যেতে পারে যাতে এটি কোনও নতুন বিল্ডকে প্রম্পট না করে।

কাজ কনফিগারেশন পৃষ্ঠায়, অধীনে সোর্স কোড ম্যানেজমেন্ট , ক্লিক করুন অ্যাডভান্সড বোতাম। ইন বহিষ্কৃত অঞ্চল বাক্স তবে আপনি মিলটির বহিষ্কার এক বা একাধিক রেগুলার এক্সপ্রেশন লিখুন।

উদাহরণস্বরূপ পরিবর্তন উপেক্ষা করার জন্য version.properties ফাইলটি ব্যবহার করতে পারেন:

/MyProject/trunk/version.properties

এটি সি # ব্যতীত অন্য ভাষার জন্যও কাজ করবে এবং আপনাকে আপনার সংস্করণ তথ্যটি সাবভার্শনের মধ্যে সংরক্ষণ করতে দেয়।


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

9

.NET এটি আপনার জন্য করে। আপনার এসেম্বলিআইএনফো ফাইলগুলিতে আপনার অ্যাসেম্বলি সংস্করণটি মেজর.মিনারের সাথে সেট করুন * * (উদাহরণস্বরূপ: 1.0। *)।

আপনি যখন আপনার প্রকল্পটি তৈরি করেন তখন সংস্করণটি স্বয়ংক্রিয়ভাবে উত্পন্ন হয়।

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


21
<রিং, রিং> "হ্যালো, পণ্য সমর্থন আমি কীভাবে সহায়তা করতে পারি?" <ग्राहक> "আমার একটি ত্রুটি আছে" <<<< "ঠিক আছে, আপনি কোন সংস্করণটি চালাচ্ছেন?" <কাস্টমার> "সংস্করণ এক পয়েন্ট দুই সংশোধন আট পাঁচ দুই পাঁচ তিন সাত চার বিল্ড সাত চার ছয় তিন পাঁচ পাঁচ দুই নয় ..." <সমর্থন> "ধরে রাখুন, কেবল এটি টাইপ করুন ... হুম ... অনুগ্রহ করে সংস্করণটি পুনরাবৃত্তি করুন সংখ্যা, আমরা মনে করি না যে সেই বিল্ড এবং রিভিশনটি তালিকাভুক্ত রয়েছে ... "- জিআরআরআর!
জিম্বো

হাহা সুন্দর মন্তব্য। আমিও সেই ইনক্রিমেন্টিং সিস্টেমের ভক্ত নই: পি
জোশুয়া হেইস

3
ভিজ্যুয়াল স্টুডিওতে স্বতঃসংশোধ গুরুতরভাবে চুষে যায়।
কুগেল

8
@ জিম্বো: যদিও আমরা সকলেই একমত যে আপনার মন্তব্য মজার ছিল, বাস্তবে এটি কোনও বিষয় নয়। আপনি যখন আপনার ভিএস ইনস্টলেশন সম্পর্কে কথা বলেন, আপনার কি ভিজ্যুয়াল স্টুডিও 2008 এসপি 1 বা ভিএস 2008 9.0.30729.1 এসপি আছে? স্বতঃসিদ্ধকরণ বিল্ড নম্বরগুলি ব্যবহার করা একটি খুব সাধারণ স্কিম এবং যখন কোনও রিলিজ বিল্ড প্রকাশিত হয় তখন বড় / গৌণ সংস্করণ সংখ্যা বাড়িয়ে খুব সহজেই "স্থির" হতে পারে।
মেরেক

গৌণ সংশোধন বৃদ্ধির জন্য 0 এ ফিরে রিসেট করার আগে একটি বিল্ড নম্বর আমরা 678 এর সাথে সর্বাধিক চলেছি (অবশ্যই ক্রুজিকন্ট্রোল, হুডসনের চেয়ে রিসেট করা সহজ বলে মনে হয়েছিল ক্রুজিকন্ট্রোলের মতো, আপনি কেবল প্রজেক্টে গিয়ে 0 এ ফিরে সংরক্ষণ করেছেন) , তবে হডসনের সমস্ত কিছুই ভাল)
ডিন হিলার

8

আমি আসলে এটি কখনও দেখিনি। 1.0। * VS2005 বা VS2008 তে বৈশিষ্ট্যযুক্ত কাজ। মান বাড়ানোর জন্য ভিএস সেট করতে এমন কিছু করার দরকার আছে যা?

যদি এসেম্বলিআইএনফো.কমকে ১.০। * দিয়ে হার্ডকোড করা হয়, তবে আসল বিল্ড / রিভিশনটি কোথায় সংরক্ষণ করা হবে?

এসেম্বলিআইএনফো-তে 1.0। * রাখার পরে আমরা নিম্নলিখিত বিবৃতিটি ব্যবহার করতে পারি না কারণ প্রোডাক্ট ভার্সনের এখন একটি অবৈধ মান রয়েছে - এটি 1.0 ব্যবহার করে * * এবং ভিএস দ্বারা নির্ধারিত মানটি নয়:

Version version = new Version(Application.ProductVersion);

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


10
আপনাকে এসেম্বলিফিলিভিশনটি সরিয়ে ফেলতে হবে। এটি বাদে, এটি আমাদের জন্য দুর্দান্ত কাজ করছে, এটি গ্রহণযোগ্য উত্তর।
অ্যালেন রাইস

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

5

আমি ধরে নিচ্ছি যে এটি একটি টেক্সট টেম্পলেট দিয়ে আপনি এটি করতে পারেন যেখানে আপনি পরিবেশ থেকে উড়ে প্রশ্নে অ্যাসেম্বলি বৈশিষ্ট্য তৈরি করেন যেমন এসেম্বলিভিশন.টি.টি নীচে করে।

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".cs" #>
<#
var build = Environment.GetEnvironmentVariable("BUILD_NUMBER");
build = build == null ? "0" : int.Parse(build).ToString();
var revision = Environment.GetEnvironmentVariable("SVN_REVISION");
revision = revision == null ? "0" : int.Parse(revision).ToString();    
#>
using System.Reflection;
[assembly: AssemblyVersion("1.0.<#=build#>.<#=revision#>")]
[assembly: AssemblyFileVersion("1.0.<#=build#>.<#=revision#>")]

3

মাইকের উত্তরের ধারাবাহিকতা হিসাবে আমি যুক্ত করতে চেয়েছিলাম যে এটি কাজ করার জন্য ভিএস + ভিজ্যুয়াল স্টুডিও ভিজ্যুয়ালাইজেশন এবং মডেলিং এসডিকে ইনস্টল করা দরকার, এবং আপনাকে প্রকল্পের ফাইলটিও পরিবর্তন করতে হবে। আরও উল্লেখ করা উচিত আমি জেনকিন্সকে ভার্সন মডিউল সহ উইন্ডোজ ২০০ R আর 2 সার্ভার বাক্সে চলমান বিল্ড সার্ভার হিসাবে ব্যবহার করি, যেখানে আমি BUILD_NUMBER পাই।

আমার পাঠ্য টেম্পলেট ফাইল সংস্করণ.টি দেখতে এটির মতো লাগে

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".cs" #>
<#
var build = Environment.GetEnvironmentVariable("BUILD_NUMBER");
build = build == null ? "0" : int.Parse(build).ToString();
var revision = Environment.GetEnvironmentVariable("_BuildVersion");
revision = revision == null ? "5.0.0.0" : revision;    
#>
using System.Reflection;
[assembly: AssemblyVersion("<#=revision#>")]
[assembly: AssemblyFileVersion("<#=revision#>")]

সম্পত্তি গোষ্ঠীতে আমার নিম্নলিখিত রয়েছে

<PropertyGroup>
    <TransformOnBuild>true</TransformOnBuild>
    <OverwriteReadOnlyOutputFiles>true</OverwriteReadOnlyOutputFiles>
    <TransformOutOfDateOnly>false</TransformOutOfDateOnly>
</PropertyGroup>

মাইক্রোসফট.সিএসআরপি.টারাজেটস আমদানির পরে, আমার এটি (আপনি যেখানে ভিএস ইনস্টল করবেন তার উপর নির্ভরশীল)

<Import Project="C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\TextTemplating\v10.0\Microsoft.TextTemplating.targets" />

আমার বিল্ড সার্ভারে আমি তখন টিএসএফের শেষ চেঞ্জসেট নম্বর পেতে প্রকৃত বিল্ডের আগে পাঠ্য রূপান্তরটি চালানোর জন্য আমার কাছে নিম্নলিখিত স্ক্রিপ্ট রয়েছে

set _Path="C:\Build_Source\foo"

pushd %_Path% 
"%ProgramFiles(x86)%\Microsoft Visual Studio 10.0\Common7\IDE\tf.exe" history . /r /noprompt /stopafter:1 /Version:W > bar
FOR /f "tokens=1" %%foo in ('findstr /R "^[0-9][0-9]*" bar') do set _BuildVersion=5.0.%BUILD_NUMBER%.%%foo
del bar
popd

echo %BUILD_NUMBER%
echo %_BuildVersion%
cd C:\Program Files (x86)\Jenkins\jobs\MyJob\workspace\MyProject
MSBuild MyProject.csproj /t:TransformAll 
...
<rest of bld script>

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

আমি নিশ্চিত যে আপনি কিছু ফ্যানসিয়ার করতে পারেন এবং টিটিএফ টেম্পলেট থেকে সরাসরি টিএফএস কল করতে পারেন, তবে এটি আমার পক্ষে কাজ করে।

আমি তারপরে রানটাইমের সময় আমার সংস্করণটি পেতে পারি

Assembly assembly = Assembly.GetExecutingAssembly();
FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assembly.Location);
return fvi.FileVersion;

1

আমার সমাধানটির জন্য বাহ্যিক সরঞ্জাম বা স্ক্রিপ্টিং ভাষার সংযোজন দরকার নেই - এটি আপনার বিল্ড মেশিনে কাজ করার জন্য যথেষ্ট গ্যারান্টিযুক্ত। আমি এই সমস্যাটি বেশ কয়েকটি অংশে সমাধান করি। প্রথমত, আমি একটি BUILD.BAT ফাইল তৈরি করেছি যা জেনকিনস BUILD_NUMBER পরামিতিটিকে পরিবেশের ভেরিয়েবলে রূপান্তর করে। জেনকিনস বিল্ডের জন্য নিম্নলিখিত তথ্যগুলি প্রবেশ করে বিল্ড ব্যাচ ফাইলটি চালাতে আমি জেনকিনসের "এক্সিকিউট উইন্ডোজ ব্যাচ কমান্ড" ফাংশনটি ব্যবহার করি:

     ./build.bat --build_id %BUILD_ID% -build_number %BUILD_NUMBER%

বিল্ড এনভায়রনমেন্টে আমার একটি বিল্ড.ব্যাট ফাইল রয়েছে যা নীচে শুরু হয়:

     rem build.bat
     set BUILD_ID=Unknown
     set BUILD_NUMBER=0
     :parse_command_line
     IF NOT "%1"=="" (
         IF "%1"=="-build_id" (
             SET BUILD_ID=%2
             SHIFT
             )
         IF "%1"=="-build_number" (
             SET BUILD_NUMBER=%2
             SHIFT
         )
         SHIFT
         GOTO :parse_command_line
     )
     REM your build continues with the environmental variables set
     MSBUILD.EXE YourProject.sln

এটি করা হয়ে গেলে আমি ভিজ্যুয়াল স্টুডিওর সলিউশন এক্সপ্লোরার ফলকে নির্মিত প্রোজেক্টটিতে ডান ক্লিক করেছি এবং বৈশিষ্ট্যগুলি বেছে নিয়েছি, ইভেন্টগুলি তৈরি করুন নির্বাচন করুন এবং প্রাক-বিল্ড ইভেন্ট ইভেন্ট কমান্ড লাইন হিসাবে নিম্নলিখিত তথ্য প্রবেশ করলাম যা স্বয়ংক্রিয়ভাবে একটি .cs ফাইল তৈরি করে বর্তমান পরিবেশের পরিবর্তনশীল সেটিংসের উপর ভিত্তি করে বিল্ড নম্বর সম্পর্কিত তথ্য রয়েছে:

     set VERSION_FILE=$(ProjectDir)\Properties\VersionInfo.cs
     if !%BUILD_NUMBER%==! goto no_buildnumber_set
     goto buildnumber_set
     :no_buildnumber_set
     set BUILD_NUMBER=0
     :buildnumber_set
     if not exist %VERSION_FILE% goto no_version_file
     del /q %VERSION_FILE%
     :no_version_file
     echo using System.Reflection; >> %VERSION_FILE%
     echo using System.Runtime.CompilerServices; >> %VERSION_FILE%
     echo using System.Runtime.InteropServices; >> %VERSION_FILE%
     echo [assembly: AssemblyVersion("0.0.%BUILD_NUMBER%.1")] >> %VERSION_FILE%
     echo [assembly: AssemblyFileVersion("0.0.%BUILD_NUMBER%.1")] >> %VERSION_FILE%

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


1

সুতরাং, আমাদের একটি সমাধান সহ একটি প্রকল্প রয়েছে যার মধ্যে বেশ কয়েকটি প্রকল্প রয়েছে যার বিভিন্ন সংস্করণ সংখ্যা সহ সমাবেশ রয়েছে।

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

dir **/Properties/AssemblyInfo.cs | %{ (cat $_) | %{$_ -replace '^(\s*)\[assembly: AssemblyVersion\("(.*)\.\*"\)', "`$1[assembly: AssemblyVersion(`"`$2.$build`")"} | Out-File $_ -Encoding "UTF8" }
dir **/Properties/AssemblyInfo.cs | %{ (cat $_) | %{$_ -replace '^(\s*)\[assembly: AssemblyFileVersion\("(.*)\.\*"\)', "`$1[assembly: AssemblyFileVersion(`"`$2.$build`")"} | Out-File $_ -Encoding "UTF8" }

আমি এনকোডিং "ইউটিএফ 8" বিকল্পটি যুক্ত করেছি কারণ গিটটি .cs ফাইলটিকে বাইনারি ফাইল হিসাবে গণ্য করতে শুরু করে যদি আমি না করি। মঞ্জুর, এটি কোনও ব্যাপার নয়, যেহেতু আমি আসলে ফলাফলটি কখনই করি না; আমি যেমন পরীক্ষা করছিলাম ঠিক তেমনই এটি এসেছিল।

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


0

এটি একটি সহজ প্রক্রিয়া। এটিতে এমএসবিল্ড পদক্ষেপের আগে একটি উইন্ডোজ ব্যাচ কমান্ড টাস্ক বিল্ড স্টেপ এবং একটি সহজ ফাইন্ড অ্যান্ড রিপ্লেস প্রোগ্রাম (ফার্ট) ব্যবহারের সাথে জড়িত।

ব্যাচ পদক্ষেপ

fart --svn -r AssemblyInfo.cs "[assembly: AssemblyVersion(\"1.0.0.0\")]" "[assembly: AssemblyVersion(\"1.0.%BUILD_NUMBER%.%SVN_REVISION%\")]"
if %ERRORLEVEL%==0 exit /b 1
fart --svn -r AssemblyInfo.cs "[assembly: AssemblyFileVersion(\"1.0.0.0\")]" "[assembly: AssemblyFileVersion(\"1.0.%BUILD_NUMBER%.%SVN_REVISION%\")]"
if %ERRORLEVEL%==0 exit /b 1
exit /b 0

আপনি যদি এসএনএন ছাড়া অন্য উত্স নিয়ন্ত্রণ ব্যবহার করছেন তবে আপনার স্কেম পরিবেশের জন্য উপযুক্তটির জন্য --svn বিকল্পটি পরিবর্তন করুন।

ফার্ট ডাউনলোড করুন


0

গ্লোবাল.এক্সএক্স-এ আমি এরকম কিছু যাচ্ছি: প্রতিটি সফল বিল্ড বাড়ানোর জন্য আমি প্রি-বিল্ড পাওয়ারশেল স্ক্রিপ্ট ( https://gist.github.com/bradjolicoeur/e77c508089aea6614af3 ) ব্যবহার করে বেশ কয়েকটি পদ্ধতি ব্যবহার করার সিদ্ধান্ত নিয়েছি :

  // We are using debug configuration, so increment our builds.
  if (System.Diagnostics.Debugger.IsAttached)
  {
      string version = System.Reflection.Assembly.GetExecutingAssembly()
                                                       .GetName()
                                                       .Version
                                                       .ToString();

      var psi = new ProcessStartInfo(@"svn", "commit -m \"Version: " + version + "\n \"");
      psi.WorkingDirectory = @"C:\CI\Projects\myproject";
      Process.Start(psi); 
  }

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

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