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

Mat*_*att 11 msbuild web-config visual-studio

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

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

> msbuild.exe /t:build /v:q /p:Configuration=Debug /nologo \
  D:\Workspace\MyProject\src\MyProject.sln
Run Code Online (Sandbox Code Playgroud)

是什么赋予了?为什么不复制.config?

daf*_*daf 5

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

但!

如果您使用 Web 应用程序或 Web Api 项目作为测试的基础*,那么您可能会遇到一些障碍。特别是,当涉及到程序集绑定重定向时(就像在撰写本文时的当前版本是 7.0.0 时仍然依赖 Newtonsoft.Json 4.5.0 的 MVC 内部的情况一样)。一位同事在他的测试项目所依赖的另一个组件上遇到了类似的问题。

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

复制 $(ProjectDir)Web.Config $(TargetDir)$(TargetName)$(TargetExt).config

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

  • 您可能会问“为什么使用 Web App 或 Web API 项目作为您的测试项目?”。作为处理 .net 程序集和 JavaScript 测试的测试项目的基础,Web* 项目更容易处理,因为 JavaScript 被正确识别(语法突出显示),并且有一个 Scripts 文件夹,它具有快速的“添加 -> Javascript File”菜单项本身和后代文件夹,所以我更喜欢使用它而不是一个普通的类库项目。


Joh*_*Zaj 1

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

我无法解释为什么它似乎使用 IDE 构建为您复制,而不是您显示的 msbuild cmd,这不是我在 2013 年的新 WebAPI 项目中看到的行为。

  • 嗨马特,我也有同样的问题。看起来 appname.dll.config 文件没有被使用,但是您是否找到了如何阻止 Visual Studio 生成它? (2认同)