簡體   English   中英

如何以編程方式將AssemblyInfo.cs更新為預生成事件(Visual Studio / msbuild)

[英]How to programatically update AssemblyInfo.cs as a Pre-Build event (Visual Studio / msbuild)

我想在項目中定義一個位置來存儲版本字符串。 我要尋找的行為是將版本存儲在項目目錄中的文本文件(version.txt)中,然后我的預生成事件更新了Properties / AssemblyInfo.cs中的內容。

[assembly: AssemblyVersion("<Version>")]
[assembly: AssemblyFileVersion("<Version>")]

是的,我知道只有兩個字段,並且它們彼此相鄰,但是我仍然想知道這是否可行。

我編寫並測試了執行此功能的Powershell腳本。

$assemblyInfoPath = "Properties\AssemblyInfo.cs"
$versionText = (Get-Content -Path version.txt -ReadCount 0)
$assemblyInfoText = (Get-Content -Path $assemblyInfoPath -ReadCount 0)
$assemblyInfoText = $assemblyInfoText -replace '\[assembly: AssemblyVersion\("((\d)+|(\.))*"\)\]', "[assembly: AssemblyVersion(`"$versionText`")]"
$assemblyInfoText -replace '\[assembly: AssemblyFileVersion\("((\d)+|(\.))*"\)\]', "[assembly: AssemblyFileVersion(`"$versionText`")]" | Set-Content -Path $assemblyInfoPath

我認為失敗的是在預構建步驟中的調用:

生成前事件命令行:

powershell $(ProjectDir)set_assembly_version.ps1

我沒有嘗試僅通過Visual Studio 2017使用msbuild運行它。由於AssemblyInfo.cs是項目文件,這是否有可能?

我認為失敗的是在預構建步驟中的調用:

有任何錯誤訊息嗎? 當我們在pre-build event設置命令時,它實際上會調用cmd.exe來執行命令。 因此,您應該確保此腳本在cmd.exe中成功執行,然后才能在預構建事件中使用它。

而且我注意到您在ps腳本中使用了相對路徑Properties\\AssemblyInfo.cs ,這可以被msbuild識別,因為在構建此項目時,msbuild知道當前的ProjectDir,因此它知道在哪里可以找到Properties\\AssemblyInfo.cs 但是如果不知道當前項目目錄,則由cmd.exe執行此腳本時可能會導致錯誤。 請檢查這一點。

我沒有嘗試僅通過Visual Studio 2017使用msbuild運行它。由於AssemblyInfo.cs是項目文件,這是否有可能?

注意:MSbuild是VS的構建引擎。 因此,即使在VS中構建C#項目時,您實際上也在調用msbuild.exe來構建它們。(對於VS2017)

Msbuild將在CoreCompile目標或其他編譯目標中編譯源文件(包括Assembly.cs文件)。 將“構建輸出日志詳細程度”更改為“正常”,您可以看到構建順序。 看到這個:

在此處輸入圖片說明

PreBuildEvent將在Compile目標之前執行,因此是可能的。 但是,在構建過程中,有時VS將占用源文件,因此我不確定您的方法是否最終會成功。 如果有任何錯誤消息,請隨時分享:)

您需要在預構建事件中設置版本的原因是什么,也許您可​​以使用此方法自動增加版本。 對於VS2017,將xx.csproj中的Deterministic屬性從true更改為false,它可以在構建過程中自動增加程序集版本。

我試圖做同樣的事情,但是發現我的系統沒有配置為允許我通過這樣的命令執行powershell腳本。 我本來可以解決此問題,但是我認為我將構建一個完整的預構建命令,而不需要執行外部腳本文件,而不是要求每個人對其計算機進行相同的編輯。 主要的“挑戰”是確保我正確地擺脫了一切。

由於項目的性質,我的版本進行了很多更改。 我試圖完全重新創建您要在命令中執行的操作,您應該可以將其插入到構建前事件中:

powershell $assemblyInfoPath = \"$(projectDir)Properties\AssemblyInfo.cs\";$versionText = (Get-Content -Path \"$(projectDir)version.txt\" -ReadCount 0);$assemblyInfoText = (Get-Content -Path $assemblyInfoPath -ReadCount 0);$assemblyInfoText = $assemblyInfoText -replace \"^\[assembly: AssemblyVersion\(".*"\)\]$\", \"[assembly: AssemblyVersion(`\"$versionText`\")]\";$assemblyInfoText = $assemblyInfoText -replace \"^\[assembly: AssemblyFileVersion\(".*"\)\]$\", \"[assembly: AssemblyFileVersion(`\"$versionText`\")]\";Set-Content -Path $assemblyInfoPath -Value $assemblyInfoText;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM