80

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

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

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

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

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

4

6 回答 6

102

更新: 对于当前(新).csproj 格式CopyToPublishDirectory,应使用该 属性。它确定是否将文件复制到发布目录,并且可以具有以下值之一:

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

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

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

查看@nover 答案和 SO在发布时排除或包含文件,以获取有关发布期间文件控制的更多信息。


“在您的project.json文件中,您有publishOptions带有 subsection的部分include,其中您已经有一些文件,例如“appsettings.json”:

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

你应该添加"appsettings.Production.json"到这个数组中。

基于评论的更新

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

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

    指定配置源的顺序很重要,因为这确定了设置存在于多个位置时应用的优先级。在下面的示例中,如果 appsettings.json 和环境变量中存在相同的设置,则环境变量中的设置将被使用。如果设置存在于多个位置,则最后指定的配置源“获胜”。ASP.NET 团队建议最后指定环境变量,以便本地环境可以覆盖已部署配置文件中设置的任何内容。

于 2016-06-16T12:46:45.237 回答
17

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

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

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

{
  "publishOptions": {
    "include": [
      "wwwroot",
      "Views",
      "appsettings*.json",
      "web.config"
    ]
  },
}
于 2016-06-16T12:48:50.470 回答
16

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

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

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

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

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

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

于 2017-06-17T11:04:54.807 回答
8

Visual Studio 2017 15.3 之后

编辑 .csproj 文件以手动排除文件/文件夹的发布

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

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

原始来源

于 2018-08-03T17:50:16.607 回答
3

发现了一种在 Visual Studio 中构建的三步方法,用于发布特定于环境的应用设置文件(Windows、PowerShell)。

  • 应用设置.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 是一个父文件,而 appsettings.Staging.json 是一个嵌套文件。
  • 如果您设置另一个环境(例如“生产”),然后关闭 Visual Studio 并重新打开您的解决方案,那么您将 appsettings.json 作为父文件,将 appsettings.Production.json 作为嵌套文件。

在此处输入图像描述

最后一步。运行发布。

在此处输入图像描述

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

在此处输入图像描述

于 2020-04-05T10:31:08.063 回答
0

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

发布-json

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

于 2021-02-18T13:07:37.013 回答