我使用存储库模式和Unity来管理对具体存储库对象的依赖。本身这不是问题,但是在VS和TFS构建过程中使用发布网站时遇到了问题。
我认为问题是由于我的应用程序中引用了包含具体存储库对象的项目,但它所包含的类从不直接使用。这是因为我使用Unity在运行时使用我的web.config中保存的Unity配置创建具体对象的实例。
存储库项目在构建时编译时包含在输出中,但是当在TFS的VS中使用发布网站时,存储库程序集丢失。因此,当Web应用程序部署到Web服务器时,由于遇到错误,因此无法使用它:
给定的程序集名称或代码库无效。 (HRESULT的例外情况:0x80131047)
这是因为Unity无法找到您所期望的缺失程序集。
所以我的具体问题是;有没有办法确保在VS和TFS中发布网站时直接将存储库程序集复制到输出而不直接使用项目中的某个具体类?
答案 0 :(得分:1)
因此,通过一些挖掘,我找到了解决问题的方法。这个解决方案仅在使用TFS构建时解决问题,但说实话,我不会因为从VS发布而烦恼。
我的灵感来自Mike Hadlow
给出的答案What's the best way to get TFS to output each project to its own directory?
基本上,解决方案是修改Web项目的构建脚本,以便将缺少的程序集复制到发布网站输出文件夹。
这是我做的:
向右滚动到文件底部我发现以下注释掉了构建目标:
< Target Name =“AfterBuild”> < /目标>
我修改了这个添加命令以复制缺少的程序集:
< Target Name =“AfterBuild”>
<复制SourceFiles =“$(OutDir) [缺少程序集名称] ”DestinationFolder =“$(OutDir)_PublishedWebsites \ $(MSBuildProjectName)\ bin”SkipUnchangedFiles =“true”/>
< /目标>
现在,在TFS中构建解决方案时,缺少的程序集将包含在已发布网站输出的bin文件夹中。
此解决方案可用于将任何其他缺少的内容复制到已发布的网站输出。由于您要复制的文件可能因每个项目的不同而以这种方式执行,因此可能是最佳选择。然而,我正在考虑创建一个自定义版本的Microsoft.WebApplication.targets,它复制缩小的CSS和脚本文件。