为啥我的构建服务器中的部署包有额外的程序集?

Posted

技术标签:

【中文标题】为啥我的构建服务器中的部署包有额外的程序集?【英文标题】:Why does the deployment package from my buildserver have additional assemblies?为什么我的构建服务器中的部署包有额外的程序集? 【发布时间】:2011-08-02 00:45:35 【问题描述】:

我有一个 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 目录中。奇怪的是程序集没有标记为本地复制。

【问题讨论】:

【参考方案1】:

经过一番挖掘后,我注意到构建服务器启用了 .Net 框架,但没有框架 SDK。在构建服务器上安装 SDK 后,不再添加其他程序集。

【讨论】:

你必须安装什么?我不想在构建服务器上安装 VisualStudio 来获取该 SDK - 您是否安装了另一个? 我的构建服务器运行的是 Windows 7,所以我安装了这个:microsoft.com/downloads/en/… 具体来说,我发现需要从 Web Installer 安装“Intellisense and Reference Assemblies”功能。 需要注意的是,.NET 4.5 也是如此。我必须安装“Windows SDK for Windows 8”的“.NET Framework 4.5 Software Development Kit”选项,以便将这些文件从我们构建服务器上的构建目录中清除。 即使在构建服务器上安装了 sdk_tools4.msi 后,我也遇到了类似的问题。我注意到构建服务器中缺少 .net 4.5 参考程序集。所以我复制了 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5* 在同一路径上构建服务器。这解决了这个问题。【参考方案2】:

我在安装了only had 4.5.1 sdk 的构建服务器上遇到了同样的问题。

修复

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

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

【讨论】:

如果我能投票 100 次,我会的。我遇到了一个问题,清单文件包含我不需要的依赖项,也没有指定为 clickonce 包的一部分(破坏了我的 clickonce 应用程序)。我意识到 .nlp 是问题所在,需要一种方法来防止它们。这成功了谢谢!【参考方案3】:

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

【讨论】:

【参考方案4】:

在运行 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 Developer Pack for Windows Vista SP2, Windows 7 SP1, Windows 8, Windows 8.1, Windows Server 2008 SP2 Windows Server 2008 R2 SP1, Windows Server 2012 and Windows Server 2012 R2。

【讨论】:

我忘了提到,复制不需要的文件的构建是针对 .NET Framework 4.5.2。 @cacau,在您的情况下,它可能是缺少某些开发包或 SDK 的 .NET Framework 的不同版本。 嗯 - 我们的目标是 4.5,所以我认为 4.5.2 SDK 应该没问题? @cacau,根据Overview of .NET SDKs and Downloads,我猜4.5 你需要Visual Studio 2012+ 或在你的构建服务器上安装Windows Software Development Kit (SDK) for Windows 8。

以上是关于为啥我的构建服务器中的部署包有额外的程序集?的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB复制集部署和基本管理

在发布模式下显示 .NET 程序集的堆栈跟踪中的行号

部署程序集和CLASSNOTFOUND Java / MySQL问题

混合模式程序集是针对运行时的“v2.0.50727”版本构建的

如何将 Jenkins 中的特定工件部署到 Nexus 中?

如何从 sbt 的包中排除程序集?