MsBuild忽略了referendes dll并在构建服务器上添加了额外的文件

时间:2015-03-18 12:21:37

标签: c# reference msbuild package

我从命令行使用MsBuild时发现了几个问题,我认为它们都是相关的。它们也有分开的线程。在VS2013中创建的MVC项目会出现问题。

首先 - 问题是什么。

  1. 我的bin文件夹包含多个“* .npl”文件+一些额外的dll
  2. 当项目A引用引用某些第三方dll的项目B时,程序包中不存在dll(或者至少在部署后不在服务器上),但是项目A中也没有引用log4net,但仅在项目B,但它被复制到bin(和包)。
  3. 环境和设置

    我的跑步命令是这样的:

    msbuild projectA.csproj /p:Configuration=Release /p:Platform=AnyCpu /p:VisualStudioVersion=12.0 /T:Build
    

    我的机器运行Win 8.1,安装了最新更新,VS2012 MSBuild(4.0.30319.33440)。服务器运行安装了VS2013的Windows Server 2008 RC2并略微更新了MSBuild(4.0.30319.34209)。

    表现如何

    在我的本地计算机上,当我运行此命令时,构建运行正常。当我打开bin文件夹时,我可以看到我的第三方dll(包括log4net),没有额外的文件。一切都建好了。

    当我在服务器上运行此命令时,同一个bin文件夹现在缺少我的第三方dll(但log4net就在那里!)并且还有一些* .nlp文件和mscorlib.dll。构建本身返回9警告,主要是这一个:

      

    项目的处理器架构之间存在不匹配   正在构建“MSIL”和参考的处理器架构   “{Some_System_Dll_Are_There}”,“AMD64”。

    一个警告抱怨缺少SDK。需要注意的是,我可以通过将此行附加到命令来解决这些警告并解决上面的问题1(npl文件..)。

    /p:FrameworkPathOverride="C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0"
    

    可能最奇怪的是,log4net工作正常,但我的第三方dll却没有。我检查了csproj文件。 ProjectA没有引用log4net。只有projectB引用它。并且它们的引用完全相同(我在记事本中检查了csproj)。只有两个不同之处,即log4net是使用nuget安装的,log4 net也是在projectA的web.config中配置的。

    当我通过互联网搜索时,我发现这些问题是分离的线程和解决方案通常是通过向项目添加一些额外的设置,编辑csproj,sln,注册表等。我不喜欢这些解决方案。特别是,当构建在我的本地机器上完美运行时。

    问题是 - 为什么服务器需要指定frameworkPath?为什么它仍然没有复制一些第三方dll?为什么log4net有效?最重要的是 - 为什么它在本地计算机上运行,​​而不在服务器上运行?

    更新 - 解决2.问题

    所以,看起来我有解决2号问题的方法。第三方dll在GAC中被引用。基于此Include GAC Assemblies in Bin,看起来msbuild无法处理。将True添加到引用本身(MSBuild doesn't copy references (DLL files) if using project dependencies in solution)没有帮助。我最终还必须将第三方dll的引用添加到projectA并添加Private标记。现在它有效。

    这更像是一个热门修复而不是解决方案。我没时间做这个..如果有人找到一个非常可靠的解决方案,那就太棒了! : - )

0 个答案:

没有答案