为什么我的构建服务器部署包含额外的程序集?

62

我有一个ASP.NET MVC部署包,想要通过Team City构建。这个包可以顺利构建,但bin文件夹中包含了不需要的文件(在出现时会导致网站崩溃)。

如果我从Visual Studio构建相同的包,则不会有额外的文件出现。

额外的文件包括:

Microsoft.VisualBasic.Activities.Compiler.dll
mscorlib.dll
normidna.nlp
normnfc.nlp
normnfd.nlp
normnfkc.nlp
normnfkd.nlp
System.Data.dll
System.Data.OracleClient.dll
System.EnterpriseServices.dll
System.EnterpriseServices.Wrapper.dll
System.Transactions.dll

我该怎么做才能防止这些额外的程序集和.nlp文件被包含在软件包中?

更新

经过查看日志文件,我发现_CopyFilesMarkedCopyLocal构建任务将这些文件复制到了bin目录中。奇怪的是,这些程序集并没有标记为本地复制。

4个回答

62

我进一步查看后发现构建服务器上已安装了.Net框架,但未安装框架SDK。在构建服务器上安装SDK后,额外的程序集将不再被添加。


你需要安装什么?我不想在构建服务器上安装VisualStudio来获取那个SDK - 你安装了其他的吗? - stack72
1
我的构建服务器正在运行Windows 7,因此我安装了这个:http://www.microsoft.com/downloads/en/details.aspx?FamilyID=6b6c21d2-2006-4afa-9702-529fa782d63b&displaylang=en - ilivewithian
1
具体来说,我发现需要从Web安装程序中安装“智能感知和参考程序集”功能。 - Tim Iles
7
需要注意的是,.NET 4.5也是这种情况。我不得不安装“Windows SDK for Windows 8”中的“.NET Framework 4.5软件开发工具包”选项,才能清除我们构建服务器上构建目录中的这些文件。 - brock.holum
8
即使在构建服务器上安装了sdk_tools4.msi,我仍然遇到类似的问题。我注意到构建服务器上缺少 .net 4.5 参考程序集。因此,我将C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.5*复制到同一路径下的构建服务器上。问题得到了解决。 - Sathish Naga

28

我在一个只安装了4.5.1 SDK的构建服务器上遇到了同样的问题。

解决方法

msbuild中添加p:FrameworkPathOverride参数。例如:

msbuild /p:FrameworkPathOverride="C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1"

3
如果我可以给这个点赞100次,我一定会这么做。我遇到了一个问题,就是清单文件中包含了我不需要的依赖项,也没有在clickonce程序包中指定(导致我的clickonce应用程序崩溃)。我意识到这是.nlp文件引起的问题,需要找到一种方法来防止它们。这个方法解决了我的问题,非常感谢! - Cheri
不幸的是,这并没有解除我的阻塞。它一直试图使用 .net 5,而我设置的参数是 4.6.1。 - kayleeFrye_onDeck

2
在运行Windows Server 2012 R2的构建服务器上,我遇到了类似的问题 - 下面的任务正在将不需要的文件复制到输出目录:
[06:47:07]_CopyFilesMarkedCopyLocal
[06:47:07]Copy
[...]
[06:47:07]Copying file from "C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll" to "bin\Release\mscorlib.dll".
[06:47:07]Copying file from "C:\Windows\Microsoft.NET\Framework\v4.0.30319\normidna.nlp" to "bin\Release\normidna.nlp".
[06:47:07]Copying file from "C:\Windows\Microsoft.NET\Framework\v4.0.30319\normnfc.nlp" to "bin\Release\normnfc.nlp".
[06:47:07]Copying file from "C:\Windows\Microsoft.NET\Framework\v4.0.30319\normnfd.nlp" to "bin\Release\normnfd.nlp".
[06:47:07]Copying file from "C:\Windows\Microsoft.NET\Framework\v4.0.30319\normnfkc.nlp" to "bin\Release\normnfkc.nlp".
[06:47:07]Copying file from "C:\Windows\Microsoft.NET\Framework\v4.0.30319\normnfkd.nlp" to "bin\Release\normnfkd.nlp".

与@ilivewithian的答案类似,缺少一个包:Microsoft .NET Framework 4.5.2开发人员包适用于Windows Vista SP2、Windows 7 SP1、Windows 8、Windows 8.1、Windows Server 2008 SP2、Windows Server 2008 R2 SP1、Windows Server 2012和Windows Server 2012 R2。

我忘了提到,复制不需要的文件的构建是针对.NET Framework 4.5.2的。@cacau,在您的情况下,可能是缺少某些开发人员包或SDK的不同版本的.NET Framework。 - CodeFox
好的 - 我们的目标是4.5,所以我想4.5.2 SDK应该没问题吧? - cacau
根据.NET SDK和下载概述,我猜想对于4.5版本,你需要在构建服务器上安装Visual Studio 2012+或Windows 8软件开发工具包(SDK)。@cacau - CodeFox

2
最简单的解决方法是将我的本地路径 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework 复制到构建服务器上。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接