.NET 6项目中CodeTaskFactory在MSBuild构建服务器无法运行的方案咨询
替代CodeTaskFactory实现带输出的MSBuild UsingTask方案(.NET 6构建服务器场景)
问题背景
.NET 6项目中使用UsingTask结合CodeTaskFactory编写内联脚本设置AssemblyVersion,但在构建服务器上用.NET Core版MSBuild执行时出现以下错误:
Error MSB4801: The task factory "CodeTaskFactory" is not supported on the .NET Core version of MSBuild
Error MSB4175: The task factory "CodeTaskFactory" could not be loaded from the assembly "C:\Program Files\dotnet\sdk\6.0.101\Microsoft.Build.Tasks.Core.dll". The task factory must return a value for the "TaskType" property
原任务代码如下:
<UsingTask TaskName="mytask" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll"> <ParameterGroup> <AssemblyVersion ParameterType="System.String" Output="true" /> </ParameterGroup> <Task> <Code Type="Fragment" Language="cs"> <![CDATA[ Log.LogMessage(MessageImportance.High, "we are here"); AssemblyVersion = "1.2.3.4"; ]]> </Code> </Task> </UsingTask>
可行解决方案
方案1:用Exec任务调用外部脚本生成版本号
通过Exec调用PowerShell或C#脚本生成版本号,将结果写入临时文件,再通过MSBuild属性读取该文件内容。
示例配置:
<!-- 调用PowerShell脚本生成版本号并写入文件 --> <Exec Command="powershell -Command "Write-Output '1.2.3.4' | Out-File -FilePath 'version.txt' -Encoding utf8"" /> <!-- 读取文件内容到AssemblyVersion属性 --> <ReadLinesFromFile File="version.txt"> <Output TaskParameter="Lines" ItemName="VersionLines" /> </ReadLinesFromFile> <PropertyGroup> <AssemblyVersion>@(VersionLines)</AssemblyVersion> </PropertyGroup>
方案2:自定义.NET Core兼容的MSBuild任务
编写独立的.NET Standard类库,实现自定义MSBuild任务,编译后在项目中引用该程序集。
- 创建类库项目,安装NuGet包
Microsoft.Build.Utilities.Core - 编写任务代码:
using Microsoft.Build.Utilities; public class MyTask : Task { [Output] public string AssemblyVersion { get; set; } public override bool Execute() { Log.LogMessage(MessageImportance.High, "we are here"); AssemblyVersion = "1.2.3.4"; return true; } }
- 编译后在项目中引用该任务:
<UsingTask TaskName="MyTask" AssemblyFile="path/to/YourTaskLibrary.dll" /> <Target Name="SetVersion"> <MyTask> <Output TaskParameter="AssemblyVersion" PropertyName="AssemblyVersion" /> </MyTask> </Target>
方案3:使用社区工具自动生成版本(如GitVersion)
如果版本号与Git提交记录关联,可使用GitVersion工具自动生成符合语义化的版本号,无需自定义任务。
- 安装GitVersion工具(可通过NuGet包
GitVersion.MsBuild) - 在项目文件中配置:
<PropertyGroup> <GitVersionVersion>1.0.0</GitVersionVersion> </PropertyGroup> <Import Project="$(NuGetPackageRoot)\gitversion.msbuild\*\build\GitVersion.MsBuild.targets" /> <!-- 直接使用GitVersion生成的属性 --> <PropertyGroup> <AssemblyVersion>$(GitVersion_MajorMinorPatch)</AssemblyVersion> </PropertyGroup>
内容的提问来源于stack exchange,提问作者Sonnich Jensen
相关产品推荐
相关产品推荐

