在 GitHub Actions 中使用文本转换 (.tt) 模板

Den*_*sky 6 .net msbuild csproj visual-studio github-actions

我正在尝试将文本转换模板(Visual Studio 的一项功能)与 GitHub Actions 结合使用。我专门使用 Windows 运行程序,它安装了 Visual Studio 2022 Enterprise,因此依赖项应该存在。

在我的.csproj文件中,我设置了如下配置:

<PropertyGroup>
    <CustomPathToTransforms>$(MSBuildExtensionsPath)</CustomPathToTransforms>
</PropertyGroup>
    
<Import Project="$(CustomPathToTransforms)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TextTemplating\Microsoft.TextTemplating.targets" />
Run Code Online (Sandbox Code Playgroud)

然后,我还确保在构建期间发生转换:

<PropertyGroup>
    <TransformOnBuild>true</TransformOnBuild>
    <TransformOutOfDateOnly>false</TransformOutOfDateOnly>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

在本地,这与 Visual Studio 2022 社区版配合良好。我添加另一个属性 ( ) 的原因CustomPathToTransforms是,在 GitHub Actions 中,我可以将其重定向到 Visual Studio 安装文件夹,而不是 .NET 工具文件夹,否则会通过MSBuildExtensionsPath.

在 GitHub Actions 中,我运行构建如下:

dotnet build --configuration Release -p:CustomPathToTransforms="C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Msbuild\"
Run Code Online (Sandbox Code Playgroud)

理论上,这应该可行,并且我可以从构建输出中看出目标已正确找到,但是该步骤失败得相当惊人:

C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Msbuild\Microsoft\VisualStudio\v17.0\TextTemplating\Microsoft.TextTemplating.targets(347,5): error MSB4018: The "TransformTemplates" task failed unexpectedly. [D:\a\grunt\grunt\Grunt\Grunt\Grunt.csproj]
C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Msbuild\Microsoft\VisualStudio\v17.0\TextTemplating\Microsoft.TextTemplating.targets(347,5): error MSB4018: System.TypeLoadException: Could not load type 'System.Windows.DependencyObject' from assembly 'WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'. [D:\a\grunt\grunt\Grunt\Grunt\Grunt.csproj]
C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Msbuild\Microsoft\VisualStudio\v17.0\TextTemplating\Microsoft.TextTemplating.targets(347,5): error MSB4018:    at Microsoft.VisualStudio.TextTemplating.Sdk.Host.GenericTextTemplatingHost.InternalConstruct() [D:\a\grunt\grunt\Grunt\Grunt\Grunt.csproj]
C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Msbuild\Microsoft\VisualStudio\v17.0\TextTemplating\Microsoft.TextTemplating.targets(347,5): error MSB4018:    at Microsoft.VisualStudio.TextTemplating.Sdk.Host.GenericTextTemplatingHost..ctor(IServiceProvider serviceProvider, ITelemetryService telemetryService) [D:\a\grunt\grunt\Grunt\Grunt\Grunt.csproj]
C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Msbuild\Microsoft\VisualStudio\v17.0\TextTemplating\Microsoft.TextTemplating.targets(347,5): error MSB4018:    at Microsoft.VisualStudio.TextTemplating.Build.Tasks.TransformTemplatesBase.GetConfiguredTextTemplatingHost() [D:\a\grunt\grunt\Grunt\Grunt\Grunt.csproj]
C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Msbuild\Microsoft\VisualStudio\v17.0\TextTemplating\Microsoft.TextTemplating.targets(347,5): error MSB4018:    at Microsoft.VisualStudio.TextTemplating.Build.Tasks.TransformTemplatesBase.Execute() [D:\a\grunt\grunt\Grunt\Grunt\Grunt.csproj]
C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Msbuild\Microsoft\VisualStudio\v17.0\TextTemplating\Microsoft.TextTemplating.targets(347,5): error MSB4018:    at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute() [D:\a\grunt\grunt\Grunt\Grunt\Grunt.csproj]
C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Msbuild\Microsoft\VisualStudio\v17.0\TextTemplating\Microsoft.TextTemplating.targets(347,5): error MSB4018:    at Microsoft.Build.BackEnd.TaskBuilder.ExecuteInstantiatedTask(ITaskExecutionHost taskExecutionHost, TaskLoggingContext taskLoggingContext, TaskHost taskHost, ItemBucket bucket, TaskExecutionMode howToExecuteTask) [D:\a\grunt\grunt\Grunt\Grunt\Grunt.csproj]
Build FAILED.
Run Code Online (Sandbox Code Playgroud)

这是一个我想要跨平台的.NET 6.0项目(不过是通过VS编译的)。

我很好奇 - 我能做些什么来解决这个问题?有没有办法让流程识别我假设已存在于 GAC 中的依赖项?

Cul*_*tes 0

可能不是您正在寻找的答案,但我建议ConditionImport和 中添加一个PropertyGroup,以便仅在调试模式(本地)上执行此操作,因此不在构建服务器上发布时执行此操作。

它不仅修复了构建服务器上的构建,还确保在通过 PR 审查代码后不会进行奇怪的文件调整,我不希望在将某些内容推送到暂存时动态生成代码/生产。我们暂时不要赋予人工智能这样的能力……:)

例子:

<Import Condition="'$(Configuration)' == 'Debug'" Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TextTemplating\Microsoft.TextTemplating.targets" />
<PropertyGroup Condition="'$(Configuration)' == 'Debug'">
    <TransformOnBuild>true</TransformOnBuild>
    <TransformOutOfDateOnly>true</TransformOutOfDateOnly>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)