dotnet publish不发布正确的appsettings。{env.EnvironmentName} .json

时间:2016-06-16 11:48:48

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

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

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

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

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

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

6 个答案:

答案 0 :(得分:74)

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

  • 总是,
  • PreserveNewest
  • 从不

然后将下一部分添加到.csproj

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

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

&#34;在project.json文件中,您有publishOptions部分include,其中您已经有一些文件,例如&#34; appsettings.json&#34;:

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

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

基于评论的更新

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

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

      

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

答案 1 :(得分:15)

{ "publishOptions": { "include": [ "wwwroot", "Views", "appsettings.json", "appsettings.Production.json", "web.config" ] }, } 中,有{ "publishOptions": { "include": [ "wwwroot", "Views", "appsettings*.json", "web.config" ] }, } 部分。这将列出发布时将包含的所有文件和文件夹。您需要更新自己的内容

Files.copy()

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

{
    "data": [
        {
            "number": 123,
            "animal": "mush"
        },
        {
            "number": "123",
            "animal": ""
        }
    ],
    "animal_id": 1
}

答案 2 :(得分:10)

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

正如评论中所提到的,更清晰的解决方案是使用通配符include:

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

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

答案 3 :(得分:3)

发现了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是嵌套文件。
  • 如果设置了另一个环境(例如“ Production”),然后关闭并Visual Studio并重新打开解决方案,则将appsettings.json作为父级,将appsettings.Production.json作为嵌套文件。

enter image description here

最后一步。运行发布。

enter image description here

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

enter image description here

答案 4 :(得分:1)

在Visual Studio 2017 15.3之后

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

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

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

original source

答案 5 :(得分:0)

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

publish-json

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