【问题标题】:Visual Studio copys .config file to bin on build, but MSBuild does notVisual Studio 在构建时将 .config 文件复制到 bin,但 MSBuild 不会
【发布时间】:2015-08-03 19:40:42
【问题描述】:

我在 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

什么给了?为什么不复制.config?

【问题讨论】:

标签: visual-studio msbuild web-config


【解决方案1】:

对于部署 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 应用程序或 Web API 项目作为您的测试项目?”。 Web* 项目作为处理 .net 程序集和 JavaScript 测试的测试项目的基础更容易处理,因为 JavaScript 被正确识别(语法突出显示)并且有一个 Scripts 文件夹,其中包含快速“添加 -> Javascript File”菜单项用于自身和后代文件夹,因此我更喜欢使用它而不是普通的类库项目。

【讨论】:

  • 这应该是公认的答案。明显的错误是一项功能,只要 dll.config 不产生问题,您就应该忽略它。只是不要将它部署到您的生产服务器:)
  • 我在进行自动测试,我的测试从 .dll.config 中检索了一个密钥,此时测试经常失败。上面描述的 MS 错误就是问题所在。我更改了我的测试以使用 app.config 和嘿 presto,问题解决了。谢谢大夫!这在 VS2017 中仍然是一个问题。
【解决方案2】:

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

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

【讨论】:

  • 嗯,这很有趣。所以我刚刚从头开始创建了一个全新的 WebAPI 项目。 VS 2013 (v 12.0.21005.1 REL)。我观察到与其他项目相同的行为——如果我从 VS 构建,我会得到 myproject.dll.config。如果我擦除目录并使用上面的 msbuild 命令,我会得到除配置文件之外的所有内容。从字面上看,除了配置文件 - 如果我然后进入 VS 并重建,我会在 bin/ 目录中获得 1 个附加文件,即 .config
  • 作为后续,如果将 Web.config 设置为 Copy to Output Directory,它实际上会复制实际的 web.config 以及默认转换......但它没有将其命名为 myproject。 dll.config。实际上,为了澄清,VS 仍然生成 .dll.config, 复制 web.*.config 文件,而 msbuild 仍然跳过 .dll.config 但复制 web.*.config 文件。
  • 有趣,我有完全相同的版本:)。通过添加 /flp:logfile="{yourPathTologFile.log}";verbosity=diagnostic 将 msbuild 与日志记录一起使用。您应该会看到 dll.config 的“复制”任务和各种其他活动。
  • 因此,似乎 bin 中的 .config 文件并没有用于任何用途。我突然想到,如果我直接编辑 web.config,VS 会将其视为更改并重新加载它。与 IIS 的方式非常相似。同样,当您部署应用程序时,它使用名为 web.config 的文件,而不是 appname.dll.config。我不确定为什么 VS 从 Visual Studio 为 webapi 项目创建 appname.dll.config,因为它似乎并没有被使用。
  • 嗨,马特,我也有同样的问题。看起来 appname.dll.config 文件没有被使用,但你知道如何阻止 Visual Studio 生成它吗?
猜你喜欢
  • 2015-03-14
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
  • 1970-01-01
  • 2021-07-22
  • 2011-02-23
  • 2016-02-03
  • 1970-01-01
相关资源
最近更新 更多