如何做出自動版號的效果

最近再弄一個版號顯示的功能,但我真的好懶得手動去改版號,有什麼自動方便的作法呢? 以下是我找到比較方便的方式

.NET Core

在以往的 .NET 專案 有一個記錄版本的檔案,叫做 Assemblyinfo.cs,裡面會記錄著專案的相關資訊包含作者、公司、產品名稱、及版本資訊等,目前可以透過 IDE 編輯專案屬性 -> 編輯套件資訊

image-20201102154101905

如果要自動編版本號碼,這裡有一個透過編輯 csproj 來動態改變版本

1
2
3
4
5
<PropertyGroup>
<Build>$([System.DateTime]::op_Subtraction($([System.DateTime]::get_Now().get_Date()),$([System.DateTime]::new(2000,1,1))).get_TotalDays())</Build>
<Revision>$([MSBuild]::Divide($([System.DateTime]::get_Now().get_TimeOfDay().get_TotalSeconds()), 2).ToString('F0'))</Revision>
<Version>1.$(Build).$(Revision)</Version>
</PropertyGroup>
  • <build><Revision> 自定義變數供 <Version> 使用,這邊的規則可以依個人喜好修改
  • <Version> 設定產品版本

image-20201102161627599

對應產生的 Assemblyinfo.cs 內容為

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//------------------------------------------------------------------------------
// <auto-generated>
// 這段程式碼是由工具產生的。
// 執行階段版本:4.0.30319.42000
//
// 對這個檔案所做的變更可能會造成錯誤的行為,而且如果重新產生程式碼,
// 變更將會遺失。
// </auto-generated>
//------------------------------------------------------------------------------

using System;
using System.Reflection;

[assembly: Microsoft.Extensions.Configuration.UserSecrets.UserSecretsIdAttribute("4a3c5c00-20b2-4c11-90d1-d01d65382565")]
[assembly: System.Reflection.AssemblyCompanyAttribute("WebApplication4")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7611.29271.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7611.29271")]
[assembly: System.Reflection.AssemblyProductAttribute("WebApplication4")]
[assembly: System.Reflection.AssemblyTitleAttribute("WebApplication4")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.7611.29271.0")]

// 由 MSBuild WriteCodeFragment 類別產生。

Angular

有時候我們也想要在前端網站給予設定版本,除了手動修改外,其實也可以透過 npm version 來完成,雖然有點奇怪,但還是可以運作啦

npm version

這功能原本是用來更新 npm package 版本使用,指令如下

1
npm version [<newversion> | major | minor | patch | premajor | preminor | prepatch | prerelease [--preid=<prerelease-id>] | from-git]

這指令會同步更新 package.jsonversion 欄位值,這邊就快速列出我所使用的 script

1
2
"prebuild": "npm --no-git-tag-version version patch",
"postversion": "git add package.json package-lock.json && git commit -mv%npm_package_version%",
  • prebuild 這行為會發生在執行 npm build 之前
    • --no-git-tag-version 設定 npm version 不要自動 commit 且不要加上 tag
    • npm version patch : 只更新 patch 版號
  • postversion 這動作會發生在 npm version 之後
    • 加入並 commit 異動檔案

package.json 內的 version 處理完後,就可以在 environment.ts 的地方引用 package.json

1
2
3
export const environment = {
version: require('../../package.json').version,
};

由於這邊有使用到 noderequired ,在 tsconfig.app.jsontsconfig.spec.jsoncompilerOptions.types 內要加上 node,並安裝 @types/node 的型別定義檔,剩下就跟原來使用 environment 的方式一樣了

小結

目前是我處理自動版號的方式,如果有其他更好的作法,也歡迎分享給我

參考資料