全面掌握Directory.Build.props

终南山人發表於2024-02-28

為什麼需要集中管理版本號?

1)同一個產品包含多個模組,對同一個包指定了不同的版本
比如A模組用了"Serilog.Sinks.Async"的“1.1.2”版本,
B模組用了“Serilog.Sinks.Async”的“1.5.0”版本,
最終整合在C專案裡,就會有版本不一致的問題。大多數情況下,這個無所謂。

2)團隊在使用自動整合,但是沒有集中管理版本號。
如果最終的C專案,是用於部署應用程式的。這個專案的程式碼,很少需要改動,只是用於釋出而已。
當上遊的專案,重新編譯並推送了新的包到NuGet倉庫。
而C專案並沒有在Visual Studio開啟,更新整個解決方案的NuGet包。
那麼Gitlab裡,這個C專案的包的定義就還是舊的。
C專案在docker build、docker push和docker run之後,就還可能在使用專案A和專案B的舊的包。

Directory.Build.props的特點

這是dotnet內建的技術,原理很簡單。就是dotnet restore的時候,從當前目錄下開始尋找Directory.Build.props。
當前目錄沒有,就去上級目錄裡找。
直到找到一個Directory.Build.props,就不再向上尋找了。
也就是說,Directory.Build.props和NuGet.Config的機制不一樣。

那麼 Directory.Build.props有兩個特點:

1、Directory.Build.props的定義是不能繼承,也不能映像子目錄的。

2、和*.csproj檔案一樣,可以Import其它的檔案

如何共享Directory.Build.props及其Import的檔案呢?

1、設立分發檔案的http網站

用寶塔設立分發Directory.Build.props及其Import檔案的網站

2、Windows開發環境的共享

Windows開發環境如何啟用Directory.Build.props版本號集中管理

3、在Gitlab Runner裡,dotnet build的時候,獲取檔案

Gitlab中的打包作業完成後,更新http伺服器裡的版本號檔案

這篇文章裡,就是這一句話在起作用:

build-job:       # This job runs in the build stage, which runs first.
  stage: build
  before_script:
    - bash $DOWNLOAD_ALL_DIRECTORY_BUILD_PROPS_FILES $DIRECTORY_BUILD_DIST_SERVER_DIRECTORYNAME

$DOWNLOAD_ALL_DIRECTORY_BUILD_PROPS_FILES 這個指令碼哪裡找?在這篇文章裡:

製作docker方式執行Gitlab Runner所需要的映象

4、在Gitlab Runner裡,dotnet pack成功之後,把最新版本號寫入分發檔案的網站

Gitlab中的打包作業完成後,更新http伺服器裡的版本號檔案

這篇文章裡,呼叫這一段指令碼,就可以了:

更新版本號:   # This job runs in the test stage.
  stage: update-version    # It only starts when the job in the build stage completes successfully.
  script:
    - echo "SSH到http伺服器,更新檔案裡的版本號……"
    - bash $DIRECTORY_BUILD_UPDATE_VERSION_SH $DIRECTORY_BUILD_DIST_SERVER_USER $DIRECTORY_BUILD_DIST_SERVER $DIRECTORY_BUILD_DIST_SERVER_DIRECTORYNAME "Directory.Build.Change.EasyComment.props" $EASY_COMMENT_VERSION_ID

$DIRECTORY_BUILD_UPDATE_VERSION_SH 這個指令碼哪裡找?在這篇文章裡:

製作docker方式執行Gitlab Runner所需要的映象

5、在Gitlab Runner裡,docker build的時候,獲取最新檔案

用Docker釋出網站時,自動下載Directory.Build.props及其Import的檔案

在Visual Studio生成的Dockerfile裡,把

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build

修改成這樣即可:

FROM docker.amicap.cn/amihome/dotnet/sdk8:2024 AS build

WORKDIR /
# 因為要執行下邊這個shell,所以build映象不能用預設的mcr.microsoft.com/dotnet/sdk:8.0
# 我們自己的映象是包含下邊這個shell的
RUN /home/public/download-directory-builds-props.sh dev.amihome.cn

這裡用到的docker.amicap.cn/amihome/dotnet/sdk8:2024,根據這篇文章來製作:

適配http分發Directory.Build.props檔案,需要替換預設的微軟sdk:8.0映像

相關文章