You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在MSBuild中获取项目版本以传递给.bat文件?

当然可以!MSBuild完全支持你的需求,我来一步步给你拆解解决方案:

一、获取项目版本并传递给.bat文件

MSBuild内置了直接读取版本信息的属性,你可以轻松把版本作为参数传给外部批处理脚本,主要有两种方式:

1. 直接使用内置版本属性

如果你的项目是传统非SDK风格(比如.NET Framework),MSBuild会自动读取AssemblyInfo.cs里的AssemblyVersionAssemblyFileVersion等属性,直接在构建脚本里用$(AssemblyVersion)$(FileVersion)就能拿到版本字符串。

如果是SDK风格项目(.NET Core/5+),不管是自动生成AssemblyInfo还是手动维护,$(Version)$(AssemblyVersion)这些属性也都能直接用。

你只需要在项目文件(.csproj/.vbproj)里添加一个后构建任务,调用你的bat脚本并传入版本参数:

<Target Name="RunCustomPackaging" AfterTargets="PostBuildEvent">
  <!-- 把版本作为参数传给bat,注意引号处理空格问题 -->
  <Exec Command="&quot;$(SolutionDir)path-to-your-script.bat&quot; &quot;$(AssemblyVersion)&quot;" />
</Target>

2. 自定义提取AssemblyInfo.cs的版本(更灵活)

如果你需要对版本做额外处理,或者项目结构特殊,可以手动读取AssemblyInfo.cs并提取版本:

<Target Name="ExtractAssemblyVersion" BeforeTargets="PostBuildEvent">
  <!-- 读取AssemblyInfo.cs的所有行 -->
  <ReadLinesFromFile File="Properties\AssemblyInfo.cs">
    <Output TaskParameter="Lines" ItemName="AssemblyInfoLines" />
  </ReadLinesFromFile>
  <!-- 用正则匹配AssemblyVersion属性 -->
  <RegexMatch Input="@(AssemblyInfoLines)" Expression='\[assembly: AssemblyVersion\("([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)"\)\]'>
    <Output TaskParameter="Matches" ItemName="VersionMatches" />
  </RegexMatch>
  <!-- 把提取到的版本存为属性 -->
  <PropertyGroup>
    <ProjectVersion>%(VersionMatches.Value)</ProjectVersion>
  </PropertyGroup>
</Target>

<Target Name="ExecutePackagingScript" AfterTargets="ExtractAssemblyVersion">
  <!-- 传递自定义提取的版本给bat -->
  <Exec Command="&quot;$(SolutionDir)path-to-your-script.bat&quot; &quot;$(ProjectVersion)&quot;" />
</Target>

二、将AssemblyInfo.cs的版本引入构建流程

不同类型的项目处理方式略有区别,但核心都是让MSBuild识别并读取版本信息:

1. 传统非SDK项目(.NET Framework)

这类项目默认就有Properties\AssemblyInfo.cs文件,里面的版本属性(比如[assembly: AssemblyVersion("1.0.0.0")])会被MSBuild自动读取,你不需要额外配置,直接在构建脚本里用$(AssemblyVersion)$(AssemblyFileVersion)这些属性即可。

2. SDK风格项目(.NET Core/5+)

默认情况下,SDK项目会自动生成临时的AssemblyInfo文件,版本信息可以直接在项目文件里配置:

<PropertyGroup>
  <!-- 主版本号 -->
  <Version>1.2.3.4</Version>
  <!-- 程序集版本(可以和Version不同) -->
  <AssemblyVersion>1.2.0.0</AssemblyVersion>
  <!-- 文件版本 -->
  <FileVersion>1.2.3.4</FileVersion>
</PropertyGroup>

如果你想手动维护自己的AssemblyInfo.cs,只需要禁用自动生成功能:

<PropertyGroup>
  <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>

然后手动添加AssemblyInfo.cs文件并写入版本属性,MSBuild依然会自动读取这些值到构建流程中。

不管哪种项目,这些版本属性都能在构建的任意阶段使用——不管是预构建检查、后构建打包,还是传递给外部工具。

内容的提问来源于stack exchange,提问作者Christopher Pisz

火山引擎 最新活动