【问题标题】:.testsettings deployment section gets ignored in TFS build.testsettings 部署部分在 TFS 构建中被忽略
【发布时间】:2017-03-01 07:51:10
【问题描述】:

我有一个包含大量 C# 项目和大量测试的解决方案。其中一些测试需要很少的本机 dll(由相关的 nuget 包提供)。为了解决这个 .testsettings 文件,它在运行测试之前将 dll(nuget 处理到 $(OutDir))复制到测试目录。

所有这些在本地机器上都可以正常工作,但是当在 .testsettings 文件(或可能整个文件)的 TFS 构建“部署”部分执行时,会被忽略——这些 dll 永远不会在测试目录中实现(在测试目录中也没有任何条目)关于他们的日志)。 .testsettings 文件在 TFS 构建配置的相关部分提到。

有什么想法可能是错的吗? (MSVC 2015,TFS 2013)

【问题讨论】:

  • 我尝试了你上面所做的,我发现 .testsetting 文件复制 dll 被复制到文件夹“C:\agent_work\46\TestResults*******\Out”。这个路径是你上面提到的“测试目录”还是你希望那些 dll 被复制到另一个路径?
  • 我正在使用 Visual Studio 测试步骤。是的,没有关于复制这些dll的日志记录。
  • 是的,我(通过 .testsettings 文件的部署部分)将几个 dll 从 $(OutDir) 复制到“...\TestResults\...\Out”。当我在本地(从 Visual Studio)执行此操作时,它工作正常。由 TFS 执行构建时不起作用(所有不依赖这些 dll 的测试都可以正常工作)。
  • 测试运行时,您是否一直监控构建代理服务器上的“TestResult\..\Out\”文件夹?这些 dll 是复制到文件夹然后删除还是永远不会复制到?
  • 作为一种解决方法,您可以使用“复制文件”步骤将这些 dll 复制到您想要的文件夹,而不是使用 .testsetting 文件来执行此操作。

标签: tfs tfsbuild visual-studio-test-runner


【解决方案1】:

对于 TFS 2013,它只有 XAML 构建。对于 XAML 构建,测试设置文件无法在测试运行之前将程序集从 Nuget 包 $(OutDir) 复制到 C:\Builds\...\builddefinition\...\TestSetting(tst)\...\Out 文件夹。

我建议您可以将您的 TFS 升级到 TFS 2015 或更高版本以使用VNext build。而且我已经在 Vnext 构建中测试过,它可以工作。这是我的构建定义示例:只需添加 3 个步骤。

【讨论】:

  • 知道如何找出将这些文件复制到的位置吗?我不知道如何生成测试目录名称。
  • @C.M.在您的构建定义中,您是否在构建定义的开头添加了 Nuget 安装步骤?在您的构建代理服务器中,路径下是否有“Package”文件夹:C:\...\agent_work\46\s\DefinitionName?
  • 不确定,现在无法访问构建机器。但可能不会——Visual Studio 会在构建过程中自动安装缺少的 nuget 包(如果 nuget 版本足够高)——因此无需在构建定义中配置任何与之相关的内容。
  • 嗯...您仍然在混淆事物。我不需要将 nuget 包中的内容复制到 Out 文件夹。 Nuget 包可以很好地部署,所需的 dll 也可以很好地出现在 $Out 文件夹中。在开始测试之前,我需要将一些这些 dll 复制到测试文件夹(执行测试的地方)。不管怎样,我放弃了这件事。似乎是 TFS 中的一个错误,正在等待修复一些依赖项并将升级到 TFS 2015。
  • @C.M.我的意思是 Out 文件夹不是指路径 "C:\Builds\...\TestSetting\...\Out" 而不是 Nuget 包的 $(OutDir) 。我已经编辑了我的回复。升级到 TFS 2015 后,您可以使用 TFS Vnext 构建,这在 VNext 构建中已修复。
【解决方案2】:

您是否尝试查看它们是否安装在您的 TFS 服务器上? 你检查过 TFS 服务器的 GAC 是否已注册?

下面是我如何处理依赖项的解释,希望对您有所帮助。

这是我关于这个主题的 HMO。我必须避免让 TFS 负责在单独的文件夹中恢复 NuGet 包。 我该怎么做?

1- 我在项目级别创建了一个单独的文件夹。 (普通)

如果您在底部看到有一个 Nuget.config 文件。下面是它的配置

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <config>
    <add key="repositoryPath" value="$\..\Common\Packages" />
  </config>
</configuration>

现在我所有的包都托管在 Common 文件夹中。现在,如果需要,将所有额外的 dll 放在一个单独的文件夹中。如果您依赖于 GAC 上托管的本机 dll,那么您应该查看 TFS 服务器(如果它们安装在那里)。 话虽如此,我将所有项目引用都指向我的 Common 文件夹,甚至我的 Nuget 存储库也从该位置获取文件。

优势:

  1. 您将所有 dll 集中起来(请记住,如果您依赖 Native dll,则应在 TFS 上安装正确运行 MSBuild 所需的框架版本)
  2. 所有项目都指向相同的依赖项
  3. 您只需维护 Common 文件夹。
  4. 在 Common 文件夹中签入包后,您可以保证依赖项也托管在 TFS 上,并且当 MSBuild 运行时,它可以找到它们。

【讨论】:

  • 是的,软件包安装得很好。并且在构建相关的 dll 被复制到 $(OutDir)。但是随后(执行测试时)它们不会被复制到测试目录(由我的 .testsettings 文件中的部署部分规定)。看起来像是 MS 工具中的某个错误。
猜你喜欢
  • 2014-03-26
  • 2023-03-14
  • 2017-03-09
  • 1970-01-01
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-20
相关资源
最近更新 更多