【问题标题】:MSTest: A sensible way to deploy items from a common directory?MSTest:从公共目录部署项目的明智方法?
【发布时间】:2012-06-20 08:57:16
【问题描述】:

我最近在尝试处理 DeploymentItem 时失去了一些头发。

我们有一些用于本地 dll 的通用目录,许多测试都依赖于这些目录。

对于 C++ 项目,我们使用属性页,其中定义了这些路径。这些甚至可以通过一些手动编辑(因为它们是 MSBuild 文件)导入到 C# 项目中。我仍然不知道如何在测试中使用它们。

很遗憾,DeploymentItemAttribute 不能使用工作表中的属性,但可以使用环境变量。我希望避免强迫每个人定义全局环境变量...

我在网上看到了各种建议,但还没有真正找到简单的解决方案。

有人对此有好的方法吗?

【问题讨论】:

  • 这些“公共目录”能否不存在于所有其他资源的已知相对路径中(即在源代码树中)?我就是这样做的。如果构建应该能够在没有外部工件的情况下检出/构建/测试,那么您必须在源代码树中保留本机依赖项。
  • 不幸的是,这行不通。原因之一是我们使用 TeamCity 进行构建。 TC 决定在哪里签出源代码树。
  • 我不明白,你在哪里签出源代码树无关紧要?如果依赖项都在源代码树中,并且部署项都使用相对路径,会发生什么?
  • 以TeamCity为例:TC新建一个checkout目录,目录名在build agent工作目录下生成。例如:D:\TeamCity\buildAgent\work\1cadee32327408f3\ 因此,无法知道 dll 在哪里。 TC 这样做的原因可能是版本处理之类的。从公共目录而不是源代码树进行部署还有其他原因;此处的其他开发人员只是从公共存储库中获取最新版本。
  • 是的,如果您想从源目录之外的存储库中获取 dll,那么您将遇到 TC 创建临时工作目录的问题。但我只是在谈论对 dll:s 在源代码树内部的相对引用,即在 TC 内部创建的工作目录。

标签: mstest deploymentitem


【解决方案1】:

Anders 的回答是一个很好的解决方案,但就我而言:

  1. 我不喜欢将二进制文件保存在源代码树中的想法
  2. 很多 dll 没有特定版本,并且会定期更新 基础。

我不知何故最终得到了这个解决方案:

首先,我将全局 VC++ 属性页包含在测试项目中。这必须通过在 .csproj 顶部的 <Project> 标记下添加此指令来手动完成:

<Import Project="$(UserProfile)\AppData\Local\Microsoft\MSBuild\v4.0\Microsoft.Cpp.Win32.user.props" />

我现在可以访问在我的 C++ 环境中定义 dll 路径的属性/宏。

然后

  1. 在测试项目中添加了一个新的子文件夹,比如"NativeDlls"
  2. 将所需的 dll 作为链接添加到 NativeDlls 文件夹中
  3. 链接是绝对的,但可以用来自 上面包含的属性表:

<Content Include="$(MyLibLocation)\GDAL18BIN\gdal18.dll">

<Link>NativeDlls\mylib.dll</Link>

<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>

</Content>

然后 dll 就可以部署了:

[TestMethod]
[DeploymentItem(@"NativeDlls")]
public void TestSomeStuff()
{
}

而且,正如 Anders 所说:剩下的工作是设置调试/发布和 32/64 条件。

【讨论】:

    【解决方案2】:

    如果这些是仅由该项目使用的外部依赖项(不在源代码树之间共享),那么我建议将它们移动到源代码管理中。依赖项应与源一起进行版本控制。基本原理是您应该能够检查源代码树的修订版(历史中的任何修订版),并且它应该构建。如果您的二进制依赖项不受源代码控制,那么在构建特定版本的源代码时,您将无法知道需要哪个版本的依赖项。

    如果您可以将依赖项移动到源代码树中(例如 $svnroot/trunk/dependencies),那么您可以仅使用相对路径进行测试部署。它可以在 TeamCity 以及任何开发人员机器上运行。

    如果您无法对依赖项进行版本控制,或者由于其他原因必须将它们放在存储库之外,那么您可以使用测试部署可以使用的环境变量。见This msdn post for an example

    编辑:在此处移动了有关管理二进制依赖项的评论

    对于 csprojs,我只是在项目中对源代码树下 lib 目录中的 dll:s 有一个 dll 引用(即对 ..\lib\log4net.dll 的引用)。如果您想为单独的构建引用单独的库,例如x86/64 或 Debug/Release 不同,则 VS 不支持它,但 MsBuild 和 csproj 文件支持,因此您可以添加条件引用,但您必须手动编辑 csproj 以包含例如 x86 依赖项,仅当平台是 x86 等等。

    【讨论】:

      猜你喜欢
      • 2016-05-29
      • 2013-04-24
      • 1970-01-01
      • 1970-01-01
      • 2011-04-21
      • 1970-01-01
      • 2013-05-20
      • 1970-01-01
      • 2019-07-16
      相关资源
      最近更新 更多