我最近在尝试处理DeploymentItem时丢了一些头发。
我们有一些本机dll的常用目录,许多测试依赖于这些。
对于C ++项目,我们使用propertypages,其中定义了这些路径。这些甚至可以在C#项目中导入,也可以通过一些手动编辑(因为它们是MSBuild文件)。我仍然无法弄清楚如何在测试中使用它们。
不幸的是,DeploymentItemAttribute不能使用工作表中的属性,但它可以使用环境变量。我希望避免强迫每个人定义全局环境变量......
我已经看到网络上的各种建议,但还没有真正找到一个简单的解决方案。
有人对此有好的方法吗?
答案 0 :(得分:2)
安德斯的回答是一个很好的解决方案,但就我而言:
我不知何故最终得到了这个解决方案:
首先,我将全局VC ++属性页包含到测试项目中。这必须通过在.csproj顶部的<Project>
标记下添加此指令来手动完成:
<Import Project="$(UserProfile)\AppData\Local\Microsoft\MSBuild\v4.0\Microsoft.Cpp.Win32.user.props" />
我现在可以访问在我的C ++环境中定义dll路径的属性/宏。
然后我
"NativeDlls"
<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条件。
答案 1 :(得分:1)
如果这些是仅由此项目使用的外部依赖项(不在源树之间共享),那么我建议将它们移动到源代码控制中。依赖项应与源代码一起进行版本控制。理由是您应该能够检查源树的修订版(历史记录中的任何修订版),并且应该构建它。如果您在源代码管理下具有不的二进制依赖项,那么在构建特定版本的源时,您将无法知道所需的依赖项版本。
如果您可以将依赖项移动到源树(例如$ svnroot / trunk / dependencies),那么您可以使用仅具有相对路径的测试部署。它可以在TeamCity以及任何开发人员机器下运行。
如果您无法对依赖项进行版本控制,或者出于其他原因必须将它们置于存储库之外,则可以使用测试部署可以使用的环境变量。见This msdn post for an example
编辑:移动了关于管理二进制依赖关系的评论
对于csprojs,我只在项目中有一个dll-reference到源代码树下的lib目录中的dll:s(即引用.. \ lib \ log4net.dll)。如果要为单独的构建引用单独的库,例如对于x86 / 64或Debug / Release不同,那么VS不支持它,但是MsBuild和csproj文件都支持,所以你可以添加条件引用,但是你必须手动编辑csproj以包含例如x86依赖,只有平台是x86等等。