2019年5月23日 星期四

Visual Studio 2017利用 T4 自動產生版本號(寫入 Git 版本號)


「工具」 「擴充功能與更新」

安裝「T4Executer 」後 T4 的關鍵字都會有對應的顏色標示

























安裝 「Devart T4 Editor」可以設定編譯前先執行 T4 範本

























設定編譯前執行 T4 (圖為執行狀態)














設定畫面
























新建文字檔 附檔名為 *.tt
就會出現「轉換所有 T4 範本」
點擊就會執行 T4 範本




















首先註解 AssemblyInfo.cs 裡面的
[assembly: AssemblyFileVersion("0.0.0.0")]

[assembly: AssemblyTitle("ConsoleApp")]
下面的 SharedInfo.tt 檔案(T4 範例)
會自動產生一個 SharedInfo.cs
並自動填入
[assembly: AssemblyFileVersion("0.0.0.0")]

[assembly: AssemblyTitle("ConsoleApp")]
的內容


  1. <#@ template debug="false" hostspecific="true" language="C#" #>
  2. <#@ import namespace="System.IO" #>
  3. <#@ assembly name="$(SolutionDir)\CommitID\bin\Debug\netstandard2.0\MyLibrary.Git.dll" #>
  4. <#@ import namespace="MyLibrary.Git" #>
  5. <#@ assembly name="C:\Program Files\dotnet\sdk\2.1.700-preview-009597\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\netstandard.dll" #>
  6. <#@ output extension=".cs" #>
  7. <#
  8. int major = 0;
  9. int minor = 0;
  10. int build = 0;
  11. int revision = 0;
  12. try
  13. {
  14. using(var f = File.OpenText(Host.ResolvePath("SharedInfo.cs")))
  15. {
  16. // 取值做 +1 使用
  17. //string maj = f.ReadLine().Replace("//","");
  18. //string min = f.ReadLine().Replace("//","");
  19. //string b = f.ReadLine().Replace("//","");
  20. //string r = f.ReadLine().Replace("//","");
  21. // 轉成日期
  22. string maj = DateTime.Now.Year.ToString();
  23. string min = DateTime.Now.Month.ToString();
  24. string b = DateTime.Now.Day.ToString();
  25. string r = DateTime.Now.Minute.ToString() + "0" + DateTime.Now.Second.ToString();
  26. major = int.Parse(maj);
  27. minor = int.Parse(min);
  28. build = int.Parse(b);
  29. revision = int.Parse(r) + 1;
  30. }
  31. }
  32. catch
  33. {
  34. major = 1;
  35. minor = 0;
  36. build = 0;
  37. revision = 255;
  38. }
  39. // 呼叫自己個函式庫
  40. CommitID.GetCommitID();
  41. string gitver = CommitID.ID;
  42. #>
  43. //<#= major #>
  44. //<#= minor #>
  45. //<#= build #>
  46. //<#= revision #>
  47. //<#= gitver #>
  48. //
  49. // This code was generated by a tool. Any changes made manually will be lost
  50. // the next time this code is regenerated.
  51. //
  52. using System.Reflection;
  53. [assembly: AssemblyFileVersion("<#= major #>.<#= minor #>.<#= build #>.<#= revision #>")]
  54. [assembly: AssemblyTitle("<#= gitver #>")]


MyLibrary.Git 是我寫的 .NET Standard Library
透過
  1. <#@ assembly name="$(SolutionDir)\CommitID\bin\Debug\netstandard2.0\MyLibrary.Git.dll" #>
  2. <#@ import namespace="MyLibrary.Git" #>

使用 .NET Standard Library 還要加入 .NET Standard 的 dll
  1. <#@ assembly name="C:\Program Files\dotnet\sdk\2.1.700-preview-009597\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\netstandard.dll" #>

不然編譯會有錯誤訊息:
錯誤 正在編譯轉換: 類型 'Object' 定義在未參考的組件中。您必須加入組件 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' 的參考。

請依據自己的 dotnet 版本選擇目錄,例如:我的是 net461














沒有留言:

Visual Studio 2017/2019 推薦的擴充功能與更新

參考文章: 覺得 Google 的 Blogger 不太順手?透過 HTML 的 iframe 移花接木 HackMD