【发布时间】:2014-11-20 18:11:06
【问题描述】:
我们只是在为我们的项目设置一个构建控制器。我们的项目依赖于安装在最终用户机器上的另一个应用程序的 DLL。除非必须,否则我不想在构建服务器上安装该应用程序。为此,我尝试将所需的 DLL 放入自定义程序集文件夹中,但 MSBuild 无法从那里找到它们。
我可以将自定义程序集文件夹用于我的项目需要的任何 DLL,还是仅用于构建过程需要的 DLL? (即 NUnit、StyleCop)
【问题讨论】:
我们只是在为我们的项目设置一个构建控制器。我们的项目依赖于安装在最终用户机器上的另一个应用程序的 DLL。除非必须,否则我不想在构建服务器上安装该应用程序。为此,我尝试将所需的 DLL 放入自定义程序集文件夹中,但 MSBuild 无法从那里找到它们。
我可以将自定义程序集文件夹用于我的项目需要的任何 DLL,还是仅用于构建过程需要的 DLL? (即 NUnit、StyleCop)
【问题讨论】:
构建服务器只需要 dll。
对于您的依赖项,您应该将它们打包为 NuGet 包,并让您的项目对其进行依赖。这将允许在任何机器上解析这些 dll,即使它们没有安装这些位。
您可以使用 UNC 路径作为您的 nuget 存储库或免费的 ProGet。
【讨论】:
要为上述答案添加一些细节,自定义程序集文件夹是 TFS2010 中引入构建基础架构的一项功能,它将自动将检入版本控制的 dll 复制到构建机器(控制器/代理)。添加了此功能,以便自定义构建流程设计人员不必访问每台构建机器来部署自定义活动。
现在将所有复制到自定义程序集文件夹的 DLL 部署到构建机器 - 是的,但它们都将被实例化/加载到要使用的内存 - 不。只有具有以下属性BuildActivityAttribute 的类才会被加载到内存中。
如果您的自定义构建活动类未使用 BuildActivityAttribute 标记,则构建定义将无法检测到它,在这种情况下,它将引发以下错误:
"TF21509:An error occured while initializing a build definition \CustomBuildTasks\BuildName:Cannot create
unknown type '{clr-namepace:NamespaceName,asembly=AssemblyName}Activityname'."
或者,如果您的自定义构建活动使用运行活动所需的依赖程序集(参考),它们将无法正确加载。如果是这种情况,您将在构建定义初始化时收到“未知类型”错误。
要解决此问题,请使用以下类作用域属性将假 CodeActivity 添加到您的依赖程序集:
[Microsoft.TeamFoundation.Build.Client.BuildActivity(Microsoft.TeamFoundation.Build.Client.HostEnvironmentOption.All)]
Public sealed class FakeActivity : CodeActivity
最后,这是 DLL 将在构建机器上下载的路径:
TFS 构建代理
Windows XP, 2003
C:\Documents and Settings\[Build Service User]\Local Settings\Temp\BuildAgent\[Agent ID]
C:\Documentsand Settings\[Build Service User]\Local Settings\Temp\BuildController\[Controller ID]
Windows 7,2008,....
C:\Users\[Build Service User]\AppData\Local\Temp\BuildAgent
C:\Users\[Build Service User]\AppData\Local\Temp\BuildController
参考资料:
【讨论】: