You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过dotnet命令与GitHub Actions获取项目版本并解决MSB4057报错

dotnet命令获取项目版本号、GitHub Actions集成及MSB4057报错解决

一、用dotnet命令提取项目构建版本号

完全可以通过dotnet msbuild自定义目标来提取并输出项目版本号。针对你项目里的<VersionPrefix>和<VersionSuffix>配置,只需在项目文件(.csproj/.vbproj)中添加以下自定义目标:

<Target Name="GetVersion">
  <PropertyGroup>
    <!-- 默认只取VersionPrefix -->
    <FullVersion>$(VersionPrefix)</FullVersion>
    <!-- 如果VersionSuffix存在,拼接成前缀-后缀格式 -->
    <FullVersion Condition="'$(VersionSuffix)' != ''">$(VersionPrefix)-$(VersionSuffix)</FullVersion>
  </PropertyGroup>
  <!-- 输出最终版本号 -->
  <Message Text="$(FullVersion)" Importance="High" />
</Target>

然后执行以下命令即可得到3.0.0-beta格式的版本号:

dotnet msbuild /t:GetVersion /nologo

二、GitHub Actions中获取版本号并存入变量

在GitHub Actions工作流里,可以通过执行上述msbuild命令,将输出结果提取并存为工作流变量,供后续步骤使用:

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Setup .NET
        uses: actions/setup-dotnet@v4
        with:
          dotnet-version: '8.x' # 替换为你的项目SDK版本

      - name: Extract project version
        id: extract_version
        run: |
          # 执行msbuild命令并提取版本号输出
          VERSION=$(dotnet msbuild /t:GetVersion /nologo | grep -E "^[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9]+)?$")
          # 将版本号存入GitHub Actions输出变量
          echo "VERSION=$VERSION" >> $GITHUB_OUTPUT

      - name: Use the version
        run: echo "项目版本号是 ${{ steps.extract_version.outputs.VERSION }}"

三、解决error MSB4057: The target "MyCustomTarget" does not exist in the project报错

你遇到的问题根源是给整个自定义Target添加了条件判断,当条件不满足时(比如VersionSuffix或BuildNumber为空),这个Target会被MSBuild忽略,相当于项目里根本不存在这个目标,执行命令自然会报错。

正确的做法:

不要给<Target>标签加Condition,而是把条件逻辑移到Target内部的属性或任务上,确保目标始终存在。比如你需要结合BuildNumber的场景,可以这样写:

<Target Name="MyCustomTarget">
  <PropertyGroup>
    <FullVersion>$(VersionPrefix)</FullVersion>
    <!-- 只有当VersionSuffix和BuildNumber都存在时,拼接三者 -->
    <FullVersion Condition="'$(VersionSuffix)' != '' AND '$(BuildNumber)' != ''">$(VersionPrefix)-$(VersionSuffix)-$(BuildNumber)</FullVersion>
    <!-- 只有VersionSuffix存在时,拼接前缀和后缀 -->
    <FullVersion Condition="'$(VersionSuffix)' != '' AND '$(BuildNumber)' == ''">$(VersionPrefix)-$(VersionSuffix)</FullVersion>
  </PropertyGroup>
  <Message Text="$(FullVersion)" Importance="High" />
</Target>

这样无论VersionSuffix和BuildNumber是否为空,MyCustomTarget始终存在于项目中,执行dotnet msbuild /t:MyCustomTarget时就不会再报目标不存在的错误,同时能根据不同条件输出符合预期的版本号。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 12:50:03