Visual Studio发布时选择错误的web.config转换

10
根据我读到的,只要您拥有与发布配置文件名称匹配的转换,它就应该被应用,但对我来说情况并非如此。
发布配置文件
PublisProfiles
    dev.pubxml
    local.pubxml

转换

 Web.Config
     Web.Debug.config
     Web.local.config
     Web.Release.config

当我使用本地配置进行发布时,我看到了这个:

Transformed Web.config using  C:\...\Web.Release.config into obj\Release\TransformWebConfig\transformed\Web.config.

所以它正在使用Release.config.. 我打开了local.pubxml并尝试更改此项

<LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>

致:

<LastUsedBuildConfiguration>local</LastUsedBuildConfiguration>

但是它正在使用Web.Debug.config转换。

除了一些被转换的属性之外,开发、发布和本地转换是相同的。

6个回答

7

看起来像是个bug,因为我最后通过以下步骤解决了问题:

  1. 删除Web.Debug.config文件

  2. 发布本地内容(现在Web.local.config已被应用)

  3. 右击Web.Config文件,在菜单中选择“添加配置变换”,以重新创建Web.Debug.config

  4. 确认变换仍然有效


1
这种情况又发生在我身上了,这次我通过删除web.local.config并进入属性/发布配置文件/本地.pubxml > 右键单击 > “添加配置转换” > 重新添加我的更改来解决它。 - Sonic Soul
一样的情况。在移除了转换器之后,我重新添加了它,并确保在配置管理器中使用正确的配置文件(之前是混合的)。 - Mario Tacke
更新了LastUsedBuildConfiguration后,我发现它仍在使用旧值。我只需重新启动Visual Studio并再次单击“预览转换”,它就开始使用新值了。因此...当您手动更改pubxml文件时,似乎不会立即检测或使用该更改。 - Triynko

6

发布管道应该同时使用您的配置文件转换和构建配置转换。

这样做的逻辑是,您的配置文件转换可能具有特定于目标的设置(例如,在生产环境与分段环境中使用哪些连接字符串),但是您的构建配置具有构建特定的设置(例如,调试有关的设置Debug,但Release将其关闭)。 允许您混合和匹配这些设置可以提供更大的灵活性(需要使用启用了调试设置的 Debug 构建配置来发布到 Staging 吗?只需使用带有 Staging 配置文件的 Debug 构建配置即可)。 web.YourProfile.config 中的设置将始终覆盖任何先前的转换。


web.myprofile.config中的设置未被应用。 我在转换预览中看到它们被应用,但在部署后没有被应用。 - Sonic Soul
1
但是您的构建配置具有特定于构建的设置(例如,Debug具有与调试相关的设置,但Release将其关闭)。 是的,如果Visual Studio在调试时实际应用这些设置,那就太酷了。 相反,在发布时才应用它们,因此它们实际上是多余的。 在发布时,将应用项目配置和发布转换,或者在调试时两者都不适用。 这个设置很愚蠢。 - Triynko
应该在调试时,应用项目配置变换;在发布时,除了应用项目配置变换之外,还应该应用发布配置变换。目前情况是它们要么都被应用,要么都没有应用。这很糟糕。 - Triynko
@Triynko 我认为大多数这些问题都在 ASP.NET Core 的新应用程序模型中得到了解决。 - Jimmy
更像是一个令人震惊的倒退步骤,回到了“网站”项目以前的工作方式:“在ASP.NET Core中,发布过程已经简化,我们不再存储项目包含的文件的引用。默认情况下,所有文件都包含在项目中(可以通过更新project.json从项目或发布中排除文件)。当您从Visual Studio发布ASP.NET Core项目时,会发生以下情况。” 真是太糟糕了。只有明确包含的文件,才能使用明确的构建选项,如“None”或“Content”进行发布。无法相信他们会倒退。 - Triynko

4
我的问题与平台配置有关:
在“配置管理器”窗口,您可以选择配置名称(“活动解决方案配置”组合框)和目标平台(“活动解决方案平台”组合框)。我正确地为每个项目设置了我的新配置(例如“MyStagingConfig”),但忘记了平台 - 因此我将所有内容配置为“混合平台”。
当我使用“MyStagingConfig-任何CPU”发布项目时,它会使用Web.Staging.config文件而不是Web.MyStagingConfig.config进行配置。经过一些麻烦后,我意识到默认情况下配置了“任何CPU”平台,并且使用“Staging”配置发布了项目(当创建“MyStagingConfig”时,我导入了“Staging”配置的设置)。

2
在配置管理器中,检查每个“活动解决方案配置”,确保每个项目的“配置”列都是正确的。(在我的情况下,开发人员意外更改了其中一个值。)

没错!我把“活动解决方案配置”设为了“Staging”,但下面的所有配置都是“Debug”。将每个配置都改为“Staging”就可以了! - MPelletier

1
在您的csproj文件中,您会找到类似于以下代码的内容...
  <Target Name="BeforeBuild" Condition="'$(PublishProfileName)' == '' And '$(WebPublishProfileFile)' == ''">
    <TransformXml Source="Web.config" Transform="Web.$(Configuration).config" Destination="Web.config" />
  </Target>

这是默认设置。请注意,您可以进行修改,但我不建议这样做。
我的建议是检查您的构建配置设置。从菜单中选择Build > Configuration Manager。确认所选项目的配置是您想要使用的配置。例如,在第二列中,如果您选择了Release作为主构建项目的配置,那么即使您的解决方案配置标题为Debug,您也将拥有Release转换。将Release更改为Debug(或适当的设置),它将修复您的问题。

0
在VS2015中也存在一个错误,但有些不同:在我的情况下,我发现当我在解决方案级别上创建一个新配置文件时,它不能被选择为mvc项目。它甚至不会出现在下拉菜单中。
然而,当我从mvc项目中点击“新建”(勾选“创建新的解决方案配置”复选框)时,只有这样新的配置文件才会出现在我的mvc项目中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接