dotnet 测试命令未找到 Microsoft.TextTemplate.targets

问题描述 投票:0回答:1

我的 csproj 中有这条线

<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TextTemplating\Microsoft.TextTemplating.targets" />  

但是当我运行 dotnet test 时,它似乎解决了 MSBuildExtensionsPath

C:\Program Files\dotnet\sdk\8.0.204\

我尝试设置环境 MSBuildExtensionsPath 并将其设置为预期路径

C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\MSBuild\

到目前为止没有任何效果。我将此作为 TeamCity 构建步骤运行。 还尝试在 TeamCity 中使用环境变量。

我收到的错误是

错误 MSB4019:导入的项目“C:\Program 文件\ dotnet \ sdk \ 8.0.204 \ Microsoft \ VisualStudio 17.0 \ TextTemplated \ Microsoft.TextTemplated.targets” 没找到。确认进口申报中的表达式 “C:\程序 文件\ dotnet \ sdk \ 8.0.204 \ Microsoft \ VisualStudio 17.0 \ TextTemplated \ Microsoft.TextTemplated.targets” 是正确的,并且该文件存在于磁盘上。

c# .net msbuild teamcity
1个回答
0
投票

使用 MSBuild 进行构建并测试构建的测试程序集

使用 MSBuild 构建

根据评论,解决方案正在与 .Net 8、.Net Framework 4.8 和 .Net Standard 项目混合使用。

dotnet
CLI 无法构建 .Net Framework。

要在命令行(或通过 Team City Agent)构建混合解决方案,需要“VS 开发人员命令提示符”或其等效项以及 MSBuild。

Dev Cmd Prompt 快捷方式运行

VsDevCmd.bat
批处理文件,该文件添加到
PATH
并添加一些环境变量。如果
VsDevCmd.bat
已运行,则可以通过
msbuild
找到
PATH
,并且
msbuild
可以找到 Visual Studio 安装目录。
$(MSBuildExtensionsPath)
将被适当设置,例如
C:\Program Files\Microsoft Visual Studio\2022\BuildTools\MSBuild

可以使用以下命令构建解决方案:

msbuild mixed.sln

测试构建的测试组件

dotnet
CLI 嵌入了自己的多个工具副本,包括 MSBuild。嵌入在
dotnet
中的 MSBuild 将使用
$(MSBuildExtensionsPath)
的 SDK 路径,例如
C:\Program Files\dotnet\sdk\8.0.204\

命令

dotnet test mixed.sln
将使用嵌入式MSBuild来尝试评估项目并确定是否需要构建项目。评估项目将会失败,因为
$(MSBuildExtensionsPath)
将会是错误的。

但是,

dotnet test
会将项目、解决方案、目录以及未提供参数的情况转发到 MSBuild。当程序集(.dll 或 .exe)是提供的参数时,
dotnet test
转发到测试运行程序并且不评估项目。换句话说,针对构建的测试程序集运行
dotnet test

其他方法

如果存在干扰上述方法的情况,还有其他选择。

覆盖

MSBuildExtensionsPath

您可以覆盖

MSBuildExtensionsPath
,但这可能会产生意想不到的副作用。

转发到 MSBuild 时,

dotnet test
命令将接受 MSBuild 参数。覆盖可能如下所示:

dotnet test mixed.sln -p:MSBuildExtensionsPath="C:\Program Files\Microsoft Visual Studio\2022\BuildTools\MSBuild"

-p
选项正在定义一个属性。

请注意,期望从 SDK 目录扩展的项目将会中断。这可能包括标准 SDK 样式项目支持,因此这可能不是一个可行的方法。

编辑项目以条件化 T4 导入

一个

Import
可以有一个
Condition
:

  <Import Project="example.targets" Condition="Exists('example.targets')" />

Microsoft.TextTemplating.targets
文件中,定义了
$(T4BuildTasksAssemblyFile)
属性,预计该属性对于该文件来说是相当唯一的。您可以测试此属性以确定是否执行了
Import

举个例子:

  <PropertyGroup>
    <T4TargetsFile>Microsoft.TextTemplating.targets</T4TargetsFile>
    <T4StdPath>$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TextTemplating\$(T4TargetsFile)</T4StdPath>
    <T4AltPath>C:\Program Files\Microsoft Visual Studio\2022\BuildTools\Msbuild\Microsoft\VisualStudio\v17.0\TextTemplating\$(T4TargetsFile)</T4AltPath>
  </PropertyGroup>

  <Import Project="$(T4StdPath)" Condition="Exists('$(T4StdPath)')" />
  <Import Project="$(T4AltPath)" Condition="'$(T4BuildTasksAssemblyFile)' == ''" />

如果执行了

Import
中的
$(T4StdPath)
,则
$(T4BuildTasksAssemblyFile)
不会为空,并且
Import
中的
$(T4AltPath)
不会执行。

如果

$(T4StdPath)
不存在,则
$(T4BuildTasksAssemblyFile)
将为空,并且将尝试
Import
$(T4AltPath)
。如果
$(T4AltPath)
也不存在,则会出现MSB4019错误。

该模式可以扩展以测试三个或更多路径:

  <Import Project="$(T4Path0)" Condition="Exists('$(T4Path0)') and '$(T4BuildTasksAssemblyFile)' == ''" />
  <Import Project="$(T4Path1)" Condition="Exists('$(T4Path1)') and '$(T4BuildTasksAssemblyFile)' == ''" />
  <Import Project="$(T4Path2)" Condition="'$(T4BuildTasksAssemblyFile)' == ''" />

无需在每个使用

Microsoft.TextTemplating.targets
的项目中维护此 MSBuild 代码的副本,而是将此条件逻辑代码放置在其自己的 .targets 文件中,并将
Import
Microsoft.TextTemplating.targets
更改为条件逻辑文件的
Import
.

© www.soinside.com 2019 - 2024. All rights reserved.