dotnet publish 没有发布正确的应用程序设置。{env.EnvironmentName}。json

dotnet publish doesn´t publish correct appsettings.{env.EnvironmentName}.json

当我在命令行中发出以下命令时:

dotnet publish -o "./../output" -c Release

dotnetcli 正确发布了项目。但是,它不会复制 appsettings.Production.json 文件,只会复制 appsettings.json.

这是为什么?我用谷歌搜索并阅读了官方核心文档,但没有找到正确的环境 appsettings.json 应该如何出现在发布输出中。

我应该手动复制 appsettings.Production.json 到发布的文件夹吗?

更新: For current (new) .csproj format 应使用 CopyToPublishDirectory 属性。它决定是否将文件复制到发布目录,可以有以下值之一:

  • 总是,
  • 保留最新
  • 从不

因此,将下一部分添加到您的 .csproj 中:

<ItemGroup>
   <None Include="appsettings.Production.json" CopyToPublishDirectory="Always" />
</ItemGroup>

查看 and SO 以了解有关文件在发布过程中的控制的更多信息。


"In your project.json file you have the section publishOptions with subsection include, where you already have some files like "appsettings.json":

"publishOptions": {
  "include": [
    "appsettings.json",
    "hosting.json",
    "project.json",
    "web.config"
  ]
},

您应该将 "appsettings.Production.json" 添加到此数组中。

根据评论更新

  • 请记住,所有 appsettings.*.json 文件,如 appsettings.development.jsonappsettings.staging.jsonappsettings.production.json 将始终在所有环境中结束。您不能简单地使用 project.json 来处理这个问题,因为它不支持任何条件规则。这将在将来更改,届时 project.json 将从 replaced back 变为 msbuild.csproj。如果这对您的应用至关重要,请考虑使用其他配置存储,例如环境变量、数据库等。

  • 请注意,该顺序很重要,因为如果它们存在于多个位置,则确定将应用哪些设置。来自 documentation

    The order in which configuration sources are specified is important, as this establishes the precedence with which settings will be applied if they exist in multiple locations. In the example below, if the same setting exists in both appsettings.json and in an environment variable, the setting from the environment variable will be the one that is used. The last configuration source specified “wins” if a setting exists in more than one location. The ASP.NET team recommends specifying environment variables last, so that the local environment can override anything set in deployed configuration files.

在您的 project.json 中有一个部分 publishOptions。这会列出发布时将包含的所有文件和文件夹。你需要更新你的看起来像这样

{
  "publishOptions": {
    "include": [
      "wwwroot",
      "Views",
      "appsettings.json",
      "appsettings.Production.json",
      "web.config"
    ]
  },
}

你也可以使用 globbing 模式,所以你应该会发现这也有效(我还没有测试过这个)

{
  "publishOptions": {
    "include": [
      "wwwroot",
      "Views",
      "appsettings*.json",
      "web.config"
    ]
  },
}

对于新的 csproj 项目格式,您必须添加一个新的 ItemGroup 内容

<ItemGroup>
  <Content Include="appsettings.json">
    <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
  </Content>
  <Content Include="appsettings.Production.json">
    <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
  </Content>
</ItemGroup>

如果您有多个 appsettings.{env}.json 文件,只需在同一个 ItemGroup 中重复 Content 标签,您的所有设置文件将最终位于发布文件夹中。

如评论中所述,更简洁的解决方案是使用通配符包括:

<ItemGroup>
  <Content Include="appsettings*json">
    <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
  </Content>
</ItemGroup>

您所有的 appsettings 文件都将被发布!

Visual Studio之后 2017 15.3

编辑 .csproj 文件以手动排除 files/folder 发布

<ItemGroup>
  <Content Remove="appsettings.Development.json" />
</ItemGroup>

参考:https://www.danielcrabtree.com/blog/273/fixing-the-duplicate-content-error-after-upgrading-visual-studio-2017

发现 three-step 内置 Visual Studio 方法来发布 environment-specific 应用程序设置文件(Windows、PowerShell)。

  • appsettings.json
  • appsettings.Development.json
  • appsettings.Staging.json
  • appsettings.Production.json

此方法将发布

  • appsettings.json 和
  • appsettings.$(ASPNETCORE_ENVIRONMENT).json.

第 1 步。更新 csproj:

  <!-- App Settings -->
  <ItemGroup>
    <Content Remove="appsettings.json" />
    <Content Remove="appsettings.*.json" />
  </ItemGroup>
  <ItemGroup> 
    <Content Include="appsettings.json" CopyToOutputDirectory="Always" />
    <Content Include="appsettings.$(ASPNETCORE_ENVIRONMENT).json" DependentUpon="appsettings.json" CopyToOutputDirectory="Always" />
  </ItemGroup>

步骤 2. 在 PowerShell 中设置环境变量:

  # Read
  [Environment]::GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "User")
  # Output: empty string if not set or 'Staging' in my case
  # Set environment variable "User" or "Machine" level
  [Environment]::SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Staging", "User")

第 3 步。然后关闭并重新打开 Visual Studio 解决方案以启用 Visual Studio 查看环境变量并相应地重新加载项目结构。

  • 现在 appsettings.json 是一个 parent 而 appsettings.Staging.json 是一个嵌套文件。
  • 如果您设置另一个环境(例如“生产”),然后关闭并 Visual Studio 并重新打开您的解决方案,那么您将 appsettings.json 作为 parent 和 appsettings.Production.json作为嵌套文件。

最后一步。 运行 发布。

注意:发布配置文件环境变量不影响发布配置。此方法使用 PowerShell 设置环境变量并启用 environment-specific 发布。有关环境变量的更多详细信息,请参阅 link

VS 2019(版本 16.4.1)可以选择在右键单击文件时仅发布 appsettings.json

它将从发布配置文件中获取您的连接。

我发现您不需要手动修改项目文件来添加项目。只需将文件属性中的这些项目的“构建操作”设置为“内容”即可。它们被复制到构建输出和发布文件夹中。如果您为 ClickOnce 发布,它们也包含在扩展名为 .deploy 的应用程序文件文件夹中。