ฉันสามารถเพิ่มเวอร์ชันการสร้างไฟล์โดยอัตโนมัติเมื่อใช้ Visual Studio ได้หรือไม่


358

ผมเพียงแค่สงสัยว่าฉันจะโดยอัตโนมัติเพิ่มการสร้าง (และรุ่น?) ของไฟล์ของฉันใช้ Visual Studio (2005)

ถ้าฉันค้นหาคุณสมบัติการพูดC:\Windows\notepad.exeแท็บเวอร์ชันจะให้ "เวอร์ชันไฟล์: 5.1.2600.2180" ฉันต้องการรับหมายเลขเจ๋ง ๆ เหล่านี้ในรุ่น dll ของฉันด้วยเช่นกันไม่ใช่เวอร์ชัน 1.0.0.0 ซึ่งเราจะต้องเผชิญกับมันมันช่างน่าเบื่อเล็กน้อย

ฉันลองบางสิ่งบางอย่าง แต่ดูเหมือนจะไม่ได้ใช้งานนอกกรอบหรือบางทีฉันก็แค่มองผิดที่ (ตามปกติ)

ฉันทำงานกับโครงการเว็บเป็นหลัก ....

ฉันมองไปที่ทั้งสอง:

  1. http://www.codeproject.com/KB/dotnet/Auto_Increment_Version.aspx
  2. http://www.codeproject.com/KB/dotnet/build_versioning.aspx

และฉันไม่อยากจะเชื่อเลยว่ามันมีความพยายามอย่างมากที่จะทำสิ่งใดสิ่งหนึ่งซึ่งเป็นแนวปฏิบัติมาตรฐาน

แก้ไข: มันไม่ทำงานใน VS2005 เท่าที่ฉันสามารถบอกได้ ( http://www.codeproject.com/KB/dotnet/AutoIncrementVersion.aspx )


1
wild card ดูเหมือนจะใช้งานได้กับ AssemblyVersion เท่านั้น แต่ไม่ใช่สำหรับ AssemblyFileVersion ใน VS 2005
dotnetcoder

มีวิธีแก้ไขปัญหานี้สำหรับโครงการ C ++ ใน VS2005 หรือไม่? คำตอบทั้งหมดดูเหมือนจะแปลเป็น. Net คำถามที่เกี่ยวข้อง ขอบคุณ
Deanna

ใน. Net Core projectVersion การเพิ่มอัตโนมัติจะไม่ทำงานตามค่าเริ่มต้น คุณต้องเพิ่ม <Deterministic> เท็จ </Deterministic> ใน csproj ดูการกำหนดเวอร์ชันอัตโนมัติใน Visual Studio 2017 (.NET Core)
Michael Freidgeim

คำตอบ:


434

ใน visual Studio 2008 งานต่อไปนี้

ค้นหาไฟล์ AssemblyInfo.cs และค้นหา 2 บรรทัดเหล่านี้:

[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

คุณสามารถลองเปลี่ยนเป็น:

[assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyFileVersion("1.0.*")]

แต่นี้จะไม่ให้ผลที่ต้องการคุณจะจบลงด้วยรุ่นผลิตภัณฑ์ของ1.0. *และไฟล์เวอร์ชั่น1.0.0.0 ไม่ใช่สิ่งที่คุณต้องการ!

อย่างไรก็ตามหากคุณลบบรรทัดที่สองของบรรทัดเหล่านี้และเพียงแค่มี:

[assembly: AssemblyVersion("1.0.*")]

จากนั้นคอมไพเลอร์จะตั้งค่าเวอร์ชันไฟล์ให้เท่ากับเวอร์ชันผลิตภัณฑ์และคุณจะได้รับผลลัพธ์ตามที่คุณต้องการสำหรับผลิตภัณฑ์ที่เพิ่มขึ้นโดยอัตโนมัติและเวอร์ชันไฟล์ที่ซิงค์กัน เช่น1.0.3266.92689


2
มันใช้งานได้ดีเหมือนอย่างอื่นและทำงานใน VS2005 ฉันหวังว่าจะมีจำนวนตรรกยะอย่าง 1.0.1.56 แทนฉันได้ 1.0.3266.30135 แต่อย่างน้อยมันก็เพิ่มขึ้น (อย่างน้อยก็จะมีจำนวนสุ่มเพิ่มขึ้นเช่นกัน)
Inspite

14
โอ้ฉันเพิ่งอ่านมัน: มันจะเติมตัวเลขสองครั้งสุดท้ายโดยอัตโนมัติด้วยวันที่ (ในบางวัน) และเวลา (ครึ่งวินาทีจากเที่ยงคืน)
Inspite

20
เยี่ยมสายที่ต้องการลบแอตทริบิวต์ AssemblyFileVersion เพื่อให้ใช้งานได้!
David Faivre

76
ฉันรู้ว่านี่เป็นคำถามเก่า แต่ต้องการเพิ่มความคิดเห็นนี้ให้กับผู้อื่นที่ค้นหาเส้นทางสู่คำตอบนี้ หากคุณเพิ่ม AssemblyVersion ให้เพิ่มขึ้นโครงการใด ๆ ที่ใช้ dll ของคุณจะต้องรวบรวมใหม่ อย่างไรก็ตามถ้าคุณเก็บ AssemblyVersion ไว้เหมือนเดิมและเพิ่ม AssemblyFileVersion ด้วยตัวเองคุณสามารถสลับ dll ตัวใหม่ได้โดยไม่ต้องคอมไพล์อะไรก็ตามที่ใช้อยู่ ดังนั้นถามตัวเองว่านี่เป็นเพียงงานสร้างใหม่หรือฉันกำลังจะเปิดตัวเวอร์ชั่นใหม่หรือไม่?
onefootswill

27
@ DD59 'Build' คือจำนวนวันตั้งแต่วันที่ 1 มกราคม 2000 'การแก้ไข' คือวินาทีจากเที่ยงคืนหารด้วย 2 (ไม่ใช่ครึ่งวินาที แต่เป็นช่วงสองวินาที) ดูที่นี่: stackoverflow.com/a/3387167/11545
Cristian Diaconescu

154

เปิดไฟล์ AssemblyInfo.cs และเปลี่ยน

// 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.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

ถึง

[assembly: AssemblyVersion("1.0.*")]
//[assembly: AssemblyFileVersion("1.0.0.0")]

คุณสามารถทำได้ใน IDE โดยไปที่โครงการ -> Properties -> ข้อมูลประกอบ

อย่างไรก็ตามสิ่งนี้จะอนุญาตให้คุณเพิ่มรุ่น Assembly โดยอัตโนมัติและจะให้

เวอร์ชันไฟล์ประกอบ: ไม่อนุญาตให้ใช้ไวลด์การ์ด ("*") ในฟิลด์นี้

กล่องข้อความถ้าคุณลองวาง * ในฟิลด์เวอร์ชันของไฟล์

ดังนั้นเพียงแค่เปิด assemblyinfo.cs และทำด้วยตนเอง


ใช่ฉันเพิ่งพบ "" ไฟล์แอสเซมบลีเวอร์ชัน: ไม่อนุญาตให้ใช้ไวลด์การ์ด ("*") ในฟิลด์นี้ "นั่นคือสิ่งที่ชนะวิธีการของคุณเห็บสีเขียว: D
Inspite

3
สิ่งนี้ใช้งานได้: [ชุดประกอบ: AssemblyVersion ("1.0. *")] // [ชุดประกอบ: AssemblyFileVersion ("1.0.0.0")]
Inspite

4
ไม่ต้องการเปลี่ยนหมายเลข AssemblyVersion ในระหว่างรอบการเปิดตัว AssemblyFileVersion ควรเปลี่ยนแทน ดูโพสต์บล็อกของฉันในหัวข้อนี้: philippetruche.wordpress.com/2008/08/12/…นอกจากนี้โปรดดูการโพสต์ที่ยอดเยี่ยมของ Suzanne Cook เมื่อต้องการเปลี่ยนหมายเลข: blogs.msdn.com/b/suzcook/archive/2003/05/ 29 / 57148.aspx
ฟิลิปป์

46
ฉันจะใช้ความระมัดระวังด้วย * มันจะหยุดทำงานในวันที่ 4 มิถุนายน 2179 เมื่อวันนั้นกลายเป็น 65536
Lloyd Powell

3
@Shimmy: เพิ่ม <Deterministic> เท็จ </Deterministic> เป็น. csproj การกำหนดเวอร์ชันอัตโนมัติใน Visual Studio 2017 (. NET Core)
Michael Freidgeim

53

ตัวเลือกสำหรับการเปลี่ยนหมายเลขรุ่นในแต่ละสร้างอีกคือการใช้เวอร์ชันงานของMSBuild.Community.Tasks เพียงดาวน์โหลดตัวติดตั้งติดตั้งจากนั้นปรับรหัสต่อไปนี้แล้ววางลง<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />ใน.csprojไฟล์ของคุณ:

<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" />
<Target Name="BeforeBuild">
    <Version VersionFile="Properties\version.txt" Major="1" Minor="0" BuildType="Automatic" StartDate="12/31/2009" RevisionType="BuildIncrement">
      <Output TaskParameter="Major" PropertyName="Major" />
      <Output TaskParameter="Minor" PropertyName="Minor" />
      <Output TaskParameter="Build" PropertyName="Build" />
      <Output TaskParameter="Revision" PropertyName="Revision" />
    </Version>
    <AssemblyInfo CodeLanguage="CS"
                  OutputFile="Properties\VersionInfo.cs"
                  AssemblyVersion="$(Major).$(Minor)"
                  AssemblyFileVersion="$(Major).$(Minor).$(Build).$(Revision)" />
</Target>

หมายเหตุ:ปรับคุณสมบัติ StartDate เป็นภาษาของคุณขณะนี้ไม่ได้ใช้วัฒนธรรมที่ไม่เปลี่ยนแปลง

สำหรับงานสร้างที่สามในวันที่ 14 มกราคม 2010 สิ่งนี้จะสร้างVersionInfo.csเนื้อหานี้ด้วย:

[assembly: AssemblyVersion("1.0")]
[assembly: AssemblyFileVersion("1.0.14.2")]

แฟ้มนี้แล้วจะต้องมีการเพิ่มเข้าไปในโครงการ (ผ่านทางเพิ่มรายการที่มีอยู่ ) และAssemblyVersionและสายต้องถูกลบออกจากAssemblyFileVersionAssemblyInfo.cs

ขั้นตอนวิธีการที่แตกต่างกันสำหรับการเปลี่ยนชิ้นส่วนรุ่นที่มีการอธิบายไว้ใน$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.chmและคุณสมบัติของรุ่น


2
นี่เป็นวิธีที่ดีที่สุดที่ฉันได้เห็นข้อเท็จจริงอันยิ่งใหญ่ที่ FileVersion structs ใช้จำนวนเต็ม 16 บิต
Mike โพสต์

1
ผมมีปัญหาเกี่ยวกับการติดตั้งเข้าไปใน VS2012 ใช้คอนโซลการแพคเกจเพื่อแนะนำให้ใช้ที่ดาวน์โหลดมาติดตั้ง MSI คืนที่github.com/loresoft/msbuildtasks/downloads ทำงานคัดลอก / วางจากด้านบน ขอบคุณ!
DaveO

หลังจากที่ถูกปฏิเสธและแก้ไขในโพสต์นี้: "คุณอาจต้องการตรวจสอบloresoft.com/projects/msbuildtasks/นี้มันสามารถปรับปรุงการทำงานพื้นฐานที่อธิบายไว้ก่อนหน้านี้"
radu florescu

1
นี่ไม่ใช่โซลูชันที่ทำงานได้สำหรับผู้ที่สร้างด้วย TFS ขั้นสุดยอดสิ่งนี้จะเพิ่มการแก้ไขที่รอดำเนินการไปยังไฟล์ VersionInfo.cs และ version.txt สำหรับฉันมันไม่พึงประสงค์ที่จะมีการแก้ไขที่รอดำเนินการสำหรับแต่ละบิลด์
JDennis

@JDennis ดูที่นี่สำหรับเคล็ดลับการกำหนดเวอร์ชัน TFS ...
Christian

25

ฉันคิดวิธีแก้ปัญหาที่คล้ายกับคริสเตียน แต่ไม่ต้องพึ่งพางาน MSBuild ของชุมชนนี่ไม่ใช่ตัวเลือกสำหรับฉันเพราะฉันไม่ต้องการติดตั้งงานเหล่านี้สำหรับนักพัฒนาของเราทั้งหมด

ฉันกำลังสร้างรหัสและคอมไพล์ไปยังแอสเซมบลีและต้องการเพิ่มหมายเลขรุ่นอัตโนมัติ อย่างไรก็ตามฉันไม่สามารถใช้ VS 6.0 ได้เคล็ดลับ AssemblyVersion เนื่องจากเป็นการเพิ่มตัวเลขโดยอัตโนมัติในแต่ละวัน ฉันต้องการมี AssemblyVersion แบบฮาร์ดโค้ด แต่ AssemblyFileVersion ที่เพิ่มขึ้นโดยอัตโนมัติ ฉันทำได้โดยระบุ AssemblyVersion ใน AssemblyInfo.cs และสร้าง VersionInfo.cs ใน MSBuild เช่นนี้

  <PropertyGroup>
    <Year>$([System.DateTime]::Now.ToString("yy"))</Year>
    <Month>$([System.DateTime]::Now.ToString("MM"))</Month>
    <Date>$([System.DateTime]::Now.ToString("dd"))</Date>
    <Time>$([System.DateTime]::Now.ToString("HHmm"))</Time>
    <AssemblyFileVersionAttribute>[assembly:System.Reflection.AssemblyFileVersion("$(Year).$(Month).$(Date).$(Time)")]</AssemblyFileVersionAttribute>
  </PropertyGroup>
  <Target Name="BeforeBuild">
    <WriteLinesToFile File="Properties\VersionInfo.cs" Lines="$(AssemblyFileVersionAttribute)" Overwrite="true">
    </WriteLinesToFile>
  </Target>

สิ่งนี้จะสร้างไฟล์ VersionInfo.cs ด้วยแอตทริบิวต์ Assembly สำหรับ AssemblyFileVersion โดยที่เวอร์ชันจะเป็นไปตามสคีมาของ YY.MM.DD.TTTT พร้อมกับวันที่สร้าง คุณต้องรวมไฟล์นี้ในโครงการของคุณและสร้างด้วย


MSBuild รองรับตัวแปรหรือไม่ มันจะเป็นการดีกว่าถ้าคุณใส่[System.DateTime]::Nowเข้าไปมิฉะนั้นจะมีสภาพการแข่งขันที่อาจทำให้หมายเลขบิลด์เก่าถูกใช้หากอาคารใกล้เที่ยงคืน
Edward Brey

คุณได้นิยามคุณสมบัติทั้งสี่นี้แทนที่จะรวมไว้ในคุณสมบัติเดียวDateTime.ToStringเพื่อวัตถุประสงค์ในการสาธิตหรือมีเหตุผลบางอย่างหรือไม่
mafu

หากกิจกรรม BeforeBuild ของคุณไม่ทำงานใน VS2017 ลองดูstackoverflow.com/questions/43921992/…
Rhys Jones

โซลูชันนี้เหมาะสมที่สุดสำหรับคำตอบทั้งหมดที่นี่ อย่างไรก็ตามปัญหาคือการประทับเวลา (หรือเนื้อหาของไฟล์ versioninfo.cs) ไม่อัปเดตหากคุณสร้างโครงการเป็นครั้งที่สองซึ่งควรสร้างนาทีที่แตกต่างกัน ถ้าฉันปิดและโหลดโครงการใหม่การประทับเวลาจะได้รับการอัปเดต นี่เป็นข้อบกพร่องจาก MSBuild หรือไม่? @Boog
Cary

16

ติดตั้งAdd-in Build Version Increment มันช่วยให้คุณควบคุมได้มากกว่าตัวเลือก *


เฉพาะ VS2005 / 2008 โดยมีเบต้าสำหรับ VS2010
SteveC

autobuildversion.codeplex.com/discussions/393154ลิงก์ DropBox ใกล้กับส่วนท้ายของเธรดจาก r3mote203 นั้นใช้สำหรับปี 2010 และทำงานในปี 2012 (และอาจจะปี 2013)
Grault

2
ฉันใช้Automatic Version สำหรับ VS2012 และใช้งานได้ดีมาก
redcurry

12

เพื่อรับหมายเลขรุ่นลอง

 System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
 System.Reflection.AssemblyName assemblyName = assembly.GetName();
 Version version = assemblyName.Version;

หากต้องการตั้งหมายเลขเวอร์ชันให้สร้าง / แก้ไข AssemblyInfo.cs

 [assembly: AssemblyVersion("1.0.*")]
 [assembly: AssemblyFileVersion("1.0.*")]

เช่นเดียวกับบันทึกด้านข้างหมายเลขที่สามคือจำนวนวันตั้งแต่ 2/1/2000 และหมายเลขที่สี่คือครึ่งหนึ่งของจำนวนวินาทีทั้งหมดในวันนั้น ดังนั้นถ้าคุณรวบรวมตอนเที่ยงคืนมันควรจะเป็นศูนย์


12

มีส่วนขยายVisual Studio รุ่นอัตโนมัติที่รองรับ Visual Studio (2012, 2013, 2015) 2017 และ 2019

ภาพหน้าจอ ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่


ดังนั้นฉันได้ถอนการติดตั้งและฉันสามารถพูดได้มากขึ้น ... มันปรับเปลี่ยนไฟล์ csproj เดิม ฉันคิดว่ามันเป็นปัญหาส่วนขยาย
Maxim

2
@Maxim ลองใช้เวอร์ชันล่าสุดควรทำงานกับ VS 2017
Rady

util ที่ยอดเยี่ยม ทำงานได้ดีสำหรับฉันใน vs2017 เอกสารอาจชัดเจนขึ้นเล็กน้อย แต่ติดตั้ง (ผ่านเว็บไซต์) จากนั้นติดตั้ง MSBuild ผ่าน Nuget นำไปใช้กับโครงการขนาดเล็กและเล่นและสร้าง ดี @ คำตอบของ Boog ไม่ได้ผลสำหรับฉันแม้ว่าเขาจะพูดในสิ่งที่ฉันพยายามจะทำให้สำเร็จ
err1

8

การตั้งค่า * ในหมายเลขรุ่นใน AssemblyInfo หรือภายใต้คุณสมบัติโครงการตามที่อธิบายไว้ในโพสต์อื่น ๆ ไม่สามารถใช้ได้กับ Visual Studio / .NET ทุกรุ่น

Afaik มันไม่ทำงานใน VS 2005 (แต่ใน VS 2003 และ VS 2008) สำหรับ VS 2005 คุณสามารถใช้สิ่งต่อไปนี้: การเพิ่มรุ่น Visual Studio 2005 รุ่นสร้างอัตโนมัติและหมายเลขการแก้ไขในเวลารวบรวมรุ่นสร้างและการแก้ไขหมายเลขบนรวบรวมเวลา

แต่โปรดทราบว่าไม่แนะนำให้เปลี่ยนหมายเลขเวอร์ชันโดยอัตโนมัติสำหรับชุดประกอบที่มีชื่อมาก เหตุผลคือการอ้างอิงทั้งหมดไปยังแอสเซมบลีดังกล่าวจะต้องได้รับการปรับปรุงทุกครั้งที่แอสเซมบลีอ้างอิงถูกสร้างใหม่เนื่องจากความจริงที่ว่าการอ้างอิงแอสเซมบลีที่รัดกุมชื่อจะอ้างอิงถึงรุ่นแอสเซมบลี Microsoft เองเปลี่ยนหมายเลขรุ่นของแอสเซมบลี. NET Framework เฉพาะเมื่อมีการเปลี่ยนแปลงในอินเทอร์เฟซ (NB: ฉันยังคงค้นหาลิงก์ใน MSDN ที่ฉันอ่าน)


ฉันคิดว่าสำหรับ VS ทุกรุ่นคุณสามารถใส่ * ลงในกล่อง Build หรือ Revision ฉันเพิ่งลองใช้ VS 2005 และใช้งานได้ดี ฉันไม่แน่ใจว่าผู้เขียนบทความโครงการรหัสพูดถึงอะไร
MusiGenesis

บางทีมันอาจกลับมาพร้อมกับเซอร์วิสแพ็ค แต่ฉันจำได้ว่ามันไม่ได้ใช้ในการทำงานเมื่อฉันใช้ VS 2005
Dirk Vollmar

มันไม่ทำงานกับปี 2005 ฉันจะมองหาเซอร์วิสแพ็คและรายงานกลับ
Inspite

บางที MusiGenesis ก็มีโปรแกรมเสริมซึ่งติดตั้งไว้ซึ่งเปิดใช้งานการกำหนดเวอร์ชันอัตโนมัติ
Dirk Vollmar

@divo: ไม่ฉัน add-on-phobic ฉันเพิ่งมี Visual Studio 2005 Professional SP1 ฉันไม่เคยเห็นปัญหาเกี่ยวกับ * แต่โดยปกติฉันจะเพิ่มด้วยตนเอง ดูเหมือนแมลงประหลาด
MusiGenesis

6

เมื่อต้องการรับข้อมูล incrementing (DateTime) ลงในคุณสมบัติ AssemblyFileVersion ซึ่งมีข้อดีของการไม่ทำลายการพึ่งพาใด ๆ


การสร้างโซลูชันของ Boog (ไม่ได้ผลสำหรับฉันบางทีอาจเป็นเพราะ VS2008) คุณสามารถใช้การรวมกันของเหตุการณ์ก่อนสร้างสร้างไฟล์เพิ่มไฟล์นั้น (รวมถึงคุณสมบัติของรุ่น) แล้วใช้วิธีอ่าน ค่าเหล่านั้นอีกครั้ง นั่นคือ..

Pre-Build-เหตุการณ์:

echo [assembly:System.Reflection.AssemblyFileVersion("%date:~-4,4%.%date:~-7,2%%date:~-10,2%.%time:~0,2%%time:~3,2%.%time:~-5,2%")] > $(ProjectDir)Properties\VersionInfo.cs

รวมไฟล์ VersionInfo.cs ผลลัพธ์ (โฟลเดอร์ย่อย Properties) ลงในโครงการของคุณ

รหัสที่จะได้รับ Date back (ปีที่ผ่านมาถึงวินาที):

var version = assembly.GetName().Version;
var fileVersionString = System.Diagnostics.FileVersionInfo.GetVersionInfo(assembly.Location).FileVersion;
Version fileVersion = new Version(fileVersionString);
var buildDateTime = new DateTime(fileVersion.Major, fileVersion.Minor/100, fileVersion.Minor%100, fileVersion.Build/100, fileVersion.Build%100, fileVersion.Revision);

ไม่สะดวกสบายมาก .. และฉันก็ไม่รู้เหมือนกันว่ามันจะสร้างแรงสร้างใหม่มากมาย (เนื่องจากไฟล์เปลี่ยนแปลงตลอดเวลา)

คุณสามารถทำให้ชาญฉลาดขึ้นเช่นถ้าคุณอัปเดตไฟล์ VersionInfo.cs ทุก ๆ สองสามนาที / ชั่วโมง (โดยใช้ไฟล์ชั่วคราวแล้วคัดลอก / เขียนทับ VersionInfo.cs จริงหากตรวจพบการเปลี่ยนแปลงที่มีขนาดใหญ่พอ) ฉันทำสิ่งนี้สำเร็จแล้ว


มันทำงานได้อย่างสมบูรณ์ อย่างไรก็ตามการแสดงออกปกติวันที่%: ~ -4,4%.% วันที่: ~ -7,2 %% วันที่: ~ -10,2%.% เวลา: ~ 0,2 %% เวลา: ~ 3,2% .% เวลา: ~ -5,2% "ซับซ้อนเกินไป
แครี

5

ตั้งค่าหมายเลขเวอร์ชั่นเป็น "1.0. *" และมันจะเติมตัวเลขสองตัวสุดท้ายโดยอัตโนมัติด้วยวันที่ (ในบางวันจากบางจุด) และเวลา (ครึ่งวินาทีจากเที่ยงคืน)


เฮ้ถ้าฉันได้อ่านสิ่งนี้อย่างถูกต้องในตอนต้นฉันจะช่วยตัวเองให้มากขึ้นเกษตร ขอบคุณ
Inspite


4

Cakeรองรับการปะไฟล์ AssemblyInfo ด้วยเค้กในมือคุณมีวิธีมากมายในการใช้การเพิ่มรุ่นอัตโนมัติ

ตัวอย่างง่ายๆของการเพิ่มรุ่นเช่นคอมไพเลอร์ C # ทำ:

Setup(() =>
{
    // Executed BEFORE the first task.
    var datetimeNow = DateTime.Now;
    var daysPart = (datetimeNow - new DateTime(2000, 1, 1)).Days;
    var secondsPart = (long)datetimeNow.TimeOfDay.TotalSeconds/2;
    var assemblyInfo = new AssemblyInfoSettings
    {
        Version = "3.0.0.0",
        FileVersion = string.Format("3.0.{0}.{1}", daysPart, secondsPart)
    };
    CreateAssemblyInfo("MyProject/Properties/AssemblyInfo.cs", assemblyInfo);
});

ที่นี่:

  • รุ่น - เป็นรุ่นประกอบ แนวปฏิบัติที่เหมาะสมที่สุดคือการล็อคหมายเลขเวอร์ชันหลักและปล่อยให้เป็นศูนย์ (เช่น "1.0.0.0")
  • FileVersion - เป็นเวอร์ชันไฟล์ประกอบ

โปรดทราบว่าคุณสามารถแก้ไขไม่เพียง แต่รุ่น แต่ยังมีข้อมูลอื่น ๆ ที่จำเป็นทั้งหมด


3

ไปที่โครงการ | คุณสมบัติจากนั้นแอสเซมบลีข้อมูลจากนั้นแอสเซมบลีรุ่นและใส่ * ในกล่องสุดท้ายหรือกล่องที่สองเพื่อสุดท้าย (คุณไม่สามารถเพิ่มคอมโพเนนต์หลักหรือส่วนประกอบรอง)


2

ใช้งาน AssemblyInfo จากภารกิจ MSBuild Community ( http://msbuildtasks.tigris.org/)โปรเจ็กต์ ) และรวมเข้ากับไฟล์. csproj / .vbproj ของคุณ

มันมีหลายตัวเลือกรวมถึงหนึ่งที่จะผูกหมายเลขรุ่นกับวันที่และเวลาของวัน

แนะนำ


2

ณ ตอนนี้สำหรับใบสมัครของฉัน

string ver = Application.ProductVersion;

ผลตอบแทน ver = 1.0.3251.27860

ค่า 3251 คือจำนวนวันตั้งแต่ 1/1/2000 ฉันใช้มันเพื่อใส่วันที่สร้างเวอร์ชันบนหน้าจอเริ่มต้นของแอปพลิเคชันของฉัน เมื่อจัดการกับผู้ใช้ฉันสามารถถามวันที่สร้างซึ่งสื่อสารได้ง่ายกว่าหมายเลขที่ยาว

(ฉันเป็นคนเดียวที่สนับสนุน บริษัท เล็ก ๆ วิธีนี้อาจไม่เหมาะกับคุณ)


หมายเลขของคุณกำลังจะหมดลงอย่างรวดเร็ว ฉันจะใช้ yyddd ซึ่งเป็นปี 2 หลักและ 3 หลักวันตั้งแต่ต้นปีซึ่งสูงสุด 365 อย่างน้อยโปรแกรมของคุณจะคอมไพล์จนถึงปี 2065 จากนั้นคุณจะเกษียณและให้คนอื่นคิดว่าพวกเขาต้องการจัดการกับมันอย่างไร เนื่องจากโปรแกรมของคุณยังอยู่ในค่าคอมมิชชั่นในวันนั้น!
AaA

2

การเปลี่ยน AssemblyInfo ทำงานใน VS2012 ดูเหมือนจะแปลกที่ไม่มีการสนับสนุนนี้ใน Visual Studio คุณคิดว่านี่เป็นส่วนพื้นฐานของกระบวนการสร้าง / วางจำหน่าย


2

วิธีรับรุ่น {major}.{year}.1{date}.1{time}

อันนี้เป็นการทดลอง แต่ฉันชอบมัน แรงบันดาลใจจาก Jeff Atwood @ CodingHorror ( ลิงก์ )

หมายเลขเวอร์ชันที่ได้จะกลายเป็น1.2016.10709.11641(หมายถึง 2016-07-09 16:41) ซึ่งอนุญาตให้ใช้

  • ชายผู้น่าสงสารเป็นศูนย์รอง (ด้วยการนำโง่1)
  • DateTime ในเครื่องที่เกือบมนุษย์อ่านได้ฝังอยู่ในหมายเลขเวอร์ชัน
  • ออกจากรุ่นหลักเพียงอย่างเดียวเพื่อการเปลี่ยนแปลงครั้งสำคัญ

เพิ่มรายการใหม่ให้กับโครงการของคุณให้เลือกทั่วไป -> แม่แบบข้อความชื่อมันสิ่งที่ชอบCustomVersionNumberและ (ที่ใช้ได้) แสดงความคิดเห็นออกมาAssemblyVersionและในAssemblyFileVersionProperties/AssemblyInfo.cs

จากนั้นเมื่อบันทึกไฟล์นี้หรือสร้างโครงการสิ่งนี้จะสร้าง.csไฟล์ที่อยู่ในรายการย่อยภายใต้.ttไฟล์ที่สร้าง

<#@ template language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>

//
// This code was generated by a tool. Any changes made manually will be lost
// the next time this code is regenerated.
//

using System.Reflection;

<#
    var date = DateTime.Now;
    int major = 1;
    int minor = date.Year;
    int build = 10000 + int.Parse(date.ToString("MMdd"));
    int revision = 10000 + int.Parse(date.ToString("HHmm"));
#>

[assembly: AssemblyVersion("<#= $"{major}.{minor}.{build}.{revision}" #>")]
[assembly: AssemblyFileVersion("<#= $"{major}.{minor}.{build}.{revision}" #>")]

คุณไม่ได้รวบรวมโปรแกรมของคุณทุกนาทีหรือปรับใช้มากกว่าหนึ่งครั้งต่อวันดังนั้นทางเทคนิคเวลาส่วนหนึ่งมีข้อมูลที่มีค่าโดยไม่จำเป็นฉันจะใช้วันที่ 1 และ 2 สำหรับผู้เยาว์หลักและใช้หมายเลข 3 สำหรับวันที่ yyddd (สองหลักปี + วัน ddd ตั้งแต่ต้นปีเดียวกัน) และเว้นวันที่ 4 ไว้สำหรับหมายเลขบิลด์ที่เพิ่มขึ้น
AaA

2

ฉันสร้างแอปพลิเคชันเพื่อเพิ่มเวอร์ชันของไฟล์โดยอัตโนมัติ

  1. ดาวน์โหลดใบสมัคร
  2. เพิ่มบรรทัดต่อไปนี้เพื่อสร้างบรรทัดคำสั่งเหตุการณ์ก่อนสร้าง

    C: \ temp \ IncrementFileVersion.exe $ (SolutionDir) \ Properties \ AssemblyInfo.cs

  3. สร้างโครงการ

เพื่อให้ง่ายแอพจะส่งข้อความหากมีข้อผิดพลาดเท่านั้นเพื่อยืนยันว่ามันใช้งานได้ดีคุณจะต้องตรวจสอบเวอร์ชั่นของไฟล์ใน 'Assembly Information'

หมายเหตุ: คุณจะต้องโหลดโซลูชันใน Visual Studio สำหรับปุ่ม 'ข้อมูลประกอบ' เพื่อเติมฟิลด์อย่างไรก็ตามไฟล์เอาต์พุตของคุณจะมีเวอร์ชันที่อัปเดต

สำหรับข้อเสนอแนะและคำขอโปรดส่งอีเมลฉันที่ telson_alva@yahoo.com


2

ใน Visual Studio 2019

มันไม่เพียงพอสำหรับฉันเพิ่ม

[assembly: AssemblyVersion("1.0.*")]

เมื่อสร้างมันก็พ่นข้อผิดพลาดนี้ให้ฉัน

สตริงเวอร์ชันที่ระบุไม่เป็นไปตามรูปแบบที่ต้องการ

สารละลาย

รูปแบบที่ได้รับการยอมรับในที่สุดหลังจากที่ผมชุดDeterministicไปFalseในproject.csproj

<Deterministic>false</Deterministic>

แก้ไข:

ด้วยเหตุผลบางอย่างการตั้งค่าDeterministicเป็นFalseทำให้ไฟล์ config ของฉันโหลดและบันทึกไว้ในตำแหน่งต่าง ๆ

การแก้ปัญหา:

ฉันตั้งค่าเหตุการณ์ post-build เพื่อเพิ่มหมายเลขการแก้ไข:

สคริปต์ชุดเหตุการณ์ Post-Build

สิ่งนี้เรียกสคริปต์ PowerShell ที่ชื่อการautoincrement_version.ps1ส่งผ่านเป็นอาร์กิวเมนต์พา ธ ของAssemblyInfo.cs

if $(ConfigurationName) == Release (
PowerShell -ExecutionPolicy RemoteSigned $(ProjectDir)autoincrement_version.ps1 '$(ProjectDir)My Project\AssemblyInfo.cs'
)

Poweshell script

โดยจะเพิ่มหมายเลขการแก้ไขใหม่โดยอัตโนมัติโดยใช้ Regex

param( [string]$file );
  $regex_revision = '(?<=Version\("(?:\d+\.)+)(\d+)(?="\))'
  $found = (Get-Content $file) | Select-String -Pattern $regex_revision
  $revision = $found.matches[0].value
  $new_revision = [int]$revision + 1
  (Get-Content $file) -replace $regex_revision, $new_revision | Set-Content $file -Encoding UTF8

1

บางทีสำหรับงานนี้คุณสามารถใช้รหัสเช่นนี้:

    private bool IncreaseFileVersionBuild()
    {
        if (System.Diagnostics.Debugger.IsAttached)
        {
            try
            {
                var fi = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory).Parent.Parent.GetDirectories("Properties")[0].GetFiles("AssemblyInfo.cs")[0];
                var ve = System.Diagnostics.FileVersionInfo.GetVersionInfo(System.Reflection.Assembly.GetExecutingAssembly().Location);
                string ol = ve.FileMajorPart.ToString() + "." + ve.FileMinorPart.ToString() + "." + ve.FileBuildPart.ToString() + "." + ve.FilePrivatePart.ToString();
                string ne = ve.FileMajorPart.ToString() + "." + ve.FileMinorPart.ToString() + "." + (ve.FileBuildPart + 1).ToString() + "." + ve.FilePrivatePart.ToString();
                System.IO.File.WriteAllText(fi.FullName, System.IO.File.ReadAllText(fi.FullName).Replace("[assembly: AssemblyFileVersion(\"" + ol + "\")]", "[assembly: AssemblyFileVersion(\"" + ne + "\")]"));
                return true;
            }
            catch
            {
                return false;
            }
        }
        return false;
    }

และเรียกมันจากการโหลดแบบฟอร์ม
ด้วยรหัสนี้คุณสามารถปรับปรุงส่วนของข้อมูลไฟล์ใน AssemblyInfo.cs (แต่คุณต้องใช้โครงสร้างไดเรกทอรี "มาตรฐาน")




1

อาจจะสายเกินไปที่จะตอบคำถามที่นี่ แต่หวังว่าจะช่วยแก้ปัญหาความวุ่นวายของใครบางคน

วิธีอัตโนมัติในการเปลี่ยนเวอร์ชันชุดประกอบของโครงการทั้งหมดของคุณโดยใช้สคริปต์ PowerShell บทความนี้จะแก้ปัญหาของคุณมากมาย


ปัญหาเดียวของ PS คือมันช้าในการตอบสนองและต้องมีการกำหนดค่าเพื่อให้สามารถทำงานได้ ฉันจะไปกับปฏิบัติการขนาดเล็กไฟล์ tt4 หรือแม้กระทั่งรหัสแบบอินไลน์ซึ่งฉันคิดว่าโปรแกรมเมอร์ใด ๆ ที่สามารถเขียนในทางเดียว
AaA

0

ทุกครั้งที่ฉันสร้างมันจะเพิ่มตัวเลขที่สำคัญน้อยที่สุดโดยอัตโนมัติ

ฉันไม่มีความคิดใด ๆ เกี่ยวกับวิธีอัปเดตผู้อื่น แต่อย่างน้อยคุณควรเห็นสิ่งนั้นอยู่แล้ว ...


1
VS รับผิดชอบการเพิ่มจำนวนสุดท้ายซึ่งโดยปกติแล้วจะเป็นหมายเลขบิลด์ ทุกอย่างอื่น (เช่นตัวเลขก่อนหน้านั้น) ขึ้นอยู่กับคุณเพราะมันเป็นตัวแทนของเวอร์ชันแอปพลิเคชันของคุณ
ОгњенШобајић

1
ОгњенШобајић: ไม่ถูกต้อง ชุดรูปแบบการกำหนดหมายเลขของ Microsoft เป็นวิชาเอก. build.revision เช่น 1.0.4.7 หากคุณตั้งค่าเวอร์ชันแอสเซมบลีเป็นบางอย่างเช่น "1.0. *" VS จะตั้งค่าหมายเลขบิลด์และการแก้ไขสำหรับคุณ ในกรณีนั้น
บิลด์

0

สำหรับทุกคนที่ใช้ Tortoise Subversion คุณสามารถผูกหมายเลขหนึ่งในหมายเลขรุ่นของคุณกับหมายเลข Revision Revision ของซอร์สโค้ดของคุณ ฉันพบว่ามันมีประโยชน์มาก (ผู้ตรวจสอบชอบแบบนี้ด้วย!) คุณทำได้โดยการเรียกยูทิลิตี้ WCREV ในการสร้างล่วงหน้าและสร้าง AssemblyInfo.cs ของคุณจากเทมเพลต

หากเทมเพลตของคุณชื่อ AssemblyInfo.wcrev และอยู่ในไดเรกทอรี AssemblyInfo.cs ปกติและเต่าอยู่ในไดเรกทอรีการติดตั้งเริ่มต้นคำสั่ง Pre-Build ของคุณจะมีลักษณะเช่นนี้ (NB All ในหนึ่งบรรทัด):

"C:\Program Files\TortoiseSVN\bin\SubWCRev.exe" "$(ProjectDir)." "$(ProjectDir)Properties\AssemblyInfo.wcrev"  "$(ProjectDir)Properties\AssemblyInfo.cs"

ไฟล์เทมเพลตจะรวมสตริงการแทนที่โทเค็น wcrev: $ WCREV $
เช่น

[assembly: AssemblyFileVersion("1.0.0.$WCREV$")]

หมายเหตุ:
เนื่องจาก AssemblyInfo.cs ของคุณถูกสร้างขึ้นคุณไม่ต้องการให้ควบคุมเวอร์ชัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.