Visual Studio将.config文件复制到构建中,但MSBuild没有

时间:2014-01-12 02:43:00

标签: visual-studio msbuild web-config

我在Visual Studio 2013中有一个WebAPI项目。如果我在Visual Studio中构建项目,在bin /目录中我会看到一个名为MyProject.dll.config的文件,它代表构建时的web.config文件。 / p>

但是,如果我从命令行执行MSBuild,则会丢失.config文件,但所有其他文件都存在。

> msbuild.exe /t:build /v:q /p:Configuration=Debug /nologo \
  D:\Workspace\MyProject\src\MyProject.sln

是什么给出的?为什么不复制.config?

2 个答案:

答案 0 :(得分:3)

对于部署Web项目或web api项目,没有$(TargetName)$(TargetExt).config的事实并不是什么大问题。在运行时,IIS将使用Web.config来确定程序集所需的一切。

BUT!

如果您使用Web App或Web Api项目作为测试*的基础,那么您可以遇到一些障碍。特别是,当涉及到程序集绑定重定向时(就像MVC的内容中的某些情况一样,当写入时的当前版本是7.0.0时仍然依赖于Newtonsoft.Json 4.5.0)。一位同事与他的测试项目依赖的另一个集会有类似的问题。

现在,当您通过Visual Studio运行测试时(例如,通过Resharper),它们都可以正常工作。但是,当您的测试到达CI服务器并且它们由nunit-console运行时,您将看到程序集加载错误。不漂亮。这是因为VS描述的行为将.config文件偷偷地复制到正确的输出而msbuild没有。但是,您可以使用构建后构建事件解决此问题:

copy $(ProjectDir)Web.Config $(TargetDir)$(TargetName)$(TargetExt).config

这解决了我的重定向问题。我希望它可以帮助别人。

  • 您可能会问“为什么使用Web App或Web API项目作为测试项目?”。 Web *项目作为测试项目的基础处理起来会更加舒适,因为JavaScript正确识别(语法高亮)并且有一个Scripts文件夹,它具有快速的“添加 - &gt ; Javascript文件“自身和后代文件夹的菜单项,所以我更喜欢使用它而不是普通的类库项目。

答案 1 :(得分:1)

创建WebAPI项目时,默认情况下web.config Copy to Output Directory设置为Do Not Copy。您是否在解决方案资源管理器中选择了Web.config并将其设置为复制操作?

我无法解释为什么它似乎是为你复制IDE而不是你展示的msbuild cmd,这不是我在2013年看到的一个新的WebAPI项目的行为。