我们正在为我们的项目设置构建控制器。我们的项目依赖于最终用户计算机上安装的另一个应用程序的DLL。除非必须,否则我不想在构建服务器上安装该应用程序。为此,我尝试将我需要的DLL放入自定义程序集文件夹中,但MSBuild无法从那里找到它们。
我可以将自定义程序集文件夹用于我的项目所需的任何DLL,还是仅用于构建过程需要的DLL? (即NUnit,StyleCop)
答案 0 :(得分:5)
只有构建服务器需要的dll才能使用。
对于您的依赖项,您应该将它们打包为NuGet包,并让您的项目依赖于它。这将允许在任何机器上解析这些dll,即使它们没有安装这些位。
您可以使用UNC路径作为您的nuget存储库或免费的ProGet。
答案 1 :(得分:2)
要在上面的答案中添加一些细节,自定义程序集文件夹是TFS2010中引入Build基础架构的一项功能,它会自动将检查到版本控制的dll复制到Build机器(控制器/代理程序)。添加了此功能,以便自定义构建流程设计人员无需访问每个构建计算机即可部署自定义活动。
现在将所有复制到自定义程序集文件夹的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
参考文献: