【问题标题】:dotnet publish doesn´t publish correct appsettings.{env.EnvironmentName}.jsondotnet publish 没有发布正确的 appsettings.{env.EnvironmentName}.json
【发布时间】:2016-10-17 22:03:19
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 请参阅this answer,了解特定环境应用设置的可能解决方案。

标签: asp.net-core .net-core publish dotnet-cli


【解决方案1】:

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

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

所以将下一部分添加到您的.csproj

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

查看 @nover answer 和 SO Exclude or include files on publish,了解有关发布期间文件控制的更多信息。


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

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

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

基于 cmets 的更新

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

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

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

【讨论】:

  • 为什么需要project.json 才能发布?
  • 但它不合并基于发布配置文件的设置?它总是读取 appsettings.json 中的密钥,而不是 appsetting.release.json。
  • 就我而言,发布配置文件中的设置实际上与我的 appsettings.Production.json @BarbarosAlp 合并
  • 这是否意味着appsettings.development.jsonappsettings.staging.jsonappsettings.production.json 等所有appsettings 文件将始终存在于所有环境中?
  • project.json 被淘汰,而不是 appsettings.json !
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

    对于新的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 标记,您的所有设置文件最终都会放在发布文件夹中。

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

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

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

    【讨论】:

    • 您还可以利用通配符,将单个节点与Include="appsettings*json" 一起使用。您可以手动完成。
    • 不错的一个@stukselbax - 在我的回复中加入了您的反馈
    • 不起作用。构建错误表明这些文件已经在其他地方定义。似乎无法覆盖默认行为。
    • @ygoe 是的,这是 dotnet 工具链中的新东西 - 构建工具将它们视为隐式包含。
    【解决方案4】:

    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

    original source

    【讨论】:

      【解决方案5】:

      发现了一种在 Visual Studio 中构建的三步方法,用于发布特定于环境的应用设置文件(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 是父文件,appsettings.Staging.json 是嵌套文件。
      • 如果您设置另一个环境(例如“生产”),然后关闭 Visual Studio 并重新打开您的解决方案,那么您会将 appsettings.json 作为父文件,将 appsettings.Production.json 作为嵌套文件。

      最后一步。运行发布。

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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-08-26
          • 1970-01-01
          • 1970-01-01
          • 2021-02-10
          • 2019-09-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多