如何通过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
相关产品推荐
相关产品推荐

