dotnet Publish veröffentlicht keine korrekten Appsettings. {env.EnvironmentName} .json


70

Wenn ich den folgenden Befehl in der Befehlszeile eingebe:

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

Der dotnetcliveröffentlicht das Projekt korrekt. Es wird jedoch nicht die appsettings.Production.jsonDatei kopiert, sondern nur die appsettings.json.

Warum ist das? Ich habe herumgegoogelt und die offiziellen Kerndokumente gelesen, aber nicht gefunden, wie die richtige Umgebung appsettings.jsonin der Veröffentlichungsausgabe landen soll.

Soll ich appsettings.Production.jsonmanuell in den veröffentlichten Ordner kopieren ?


In dieser Antwort finden Sie eine mögliche Lösung für umgebungsspezifische Apps.
Ben

Antworten:


93

Update: Für das aktuelle (neue) .csproj-Format sollte das CopyToPublishDirectoryAttribut verwendet werden. Es bestimmt, ob die Datei in das Veröffentlichungsverzeichnis kopiert werden soll, und kann einen der folgenden Werte haben:

  • Immer,
  • PreserveNewest
  • noch nie

Fügen Sie also den nächsten Abschnitt zu Ihrem hinzu .csproj:

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

Weitere Informationen zur Steuerung der Datei während der Veröffentlichung finden Sie unter @nover answer und SO Ausschließen oder Einschließen von Dateien in die Veröffentlichung.


"In Ihrer project.jsonDatei befindet sich der Abschnitt publishOptionsmit dem Unterabschnitt include, in dem Sie bereits einige Dateien wie" appsettings.json "haben:

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

Sie sollten "appsettings.Production.json"diesem Array hinzufügen .

Aktualisierungen basierend auf Kommentaren :

  • Beachten Sie , dass alle appsettings.*.jsonDateien wie appsettings.development.json, appsettings.staging.jsonund appsettings.production.jsonwird immer in allen Umgebungen enden. Sie können dies nicht einfach mit verwenden project.json, da es keine Bedingungsregeln unterstützt. Dies wird sich in Zukunft ändern, wenn project.jsones wieder an msbuildund ersetzt wird .csproj. Wenn dies für Ihre App von entscheidender Bedeutung ist, sollten Sie einen anderen Konfigurationsspeicher wie Umgebungsvariable, Datenbank usw. verwenden.

  • Beachten Sie, dass diese Reihenfolge wichtig ist, um zu bestimmen, welche Einstellungen angewendet werden, wenn sie an mehreren Orten vorhanden sind. Aus der Dokumentation :

    Die Reihenfolge, in der Konfigurationsquellen angegeben werden, ist wichtig, da hierdurch der Vorrang festgelegt wird, mit dem Einstellungen angewendet werden, wenn sie an mehreren Speicherorten vorhanden sind. Wenn im folgenden Beispiel dieselbe Einstellung sowohl in appsettings.json als auch in einer Umgebungsvariablen vorhanden ist, wird die Einstellung aus der Umgebungsvariablen verwendet. Die zuletzt angegebene Konfigurationsquelle "gewinnt", wenn eine Einstellung an mehr als einem Ort vorhanden ist. Das ASP.NET-Team empfiehlt, zuletzt Umgebungsvariablen anzugeben, damit die lokale Umgebung alle in den bereitgestellten Konfigurationsdateien festgelegten Elemente überschreiben kann.


3
Warum müssen Sie project.jsonüberhaupt veröffentlicht werden?
Pawel

3
Eine auf dem Veröffentlichungsprofil basierende Einstellung wird jedoch nicht zusammengeführt. Es liest immer den Schlüssel in appsettings.json, nicht appsetting.release.json.
Barbaros Alp

In meinem Fall werden die Einstellungen aus dem Veröffentlichungsprofil tatsächlich mit meinen Appsettings zusammengeführt. Production.json @BarbarosAlp
Riscie

3
Heisst das , alle appsettings Dateien wie appsettings.development.json, appsettings.staging.jsonund appsettings.production.jsondie Umwelt in allen immer Endup?
LP13

project.json läuft aus, nicht appsettings.json!
Softlion

16

In Ihrem project.jsongibt es einen Abschnitt publishOptions. Hier werden alle Dateien und Ordner aufgelistet, die beim Veröffentlichen enthalten sein werden. Sie müssen Ihre aktualisieren, um ungefähr so ​​auszusehen

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

Sie können auch Globbing-Muster verwenden, daher sollten Sie feststellen, dass dies auch funktioniert (ich habe dieses nicht getestet).

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

13

Für das neue csprojProjektformat müssen Sie ItemGroupmit dem Inhalt ein neues hinzufügen

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

Wenn Sie mehrere appsettings.{env}.jsonDateien haben, wiederholen Sie einfach das ContentTag in derselben ItemGroupund alle Ihre Einstellungsdateien landen im Veröffentlichungsordner.

Wie in den Kommentaren erwähnt, besteht eine noch sauberere Lösung darin, einen Platzhalter zu verwenden:

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

Und alle Ihre appsettingsDateien werden veröffentlicht!


2
Sie können auch Platzhalter nutzen und den einzelnen Knoten mit verwenden Include="appsettings*json". Sie können es manuell tun.
Stukselbax

nice one @stukselbax - hat Ihr Feedback in meine Antwort aufgenommen
nover

1
Funktioniert nicht Der Erstellungsfehler besagt, dass diese Dateien bereits an anderer Stelle definiert sind. Das Standardverhalten kann anscheinend nicht überschrieben werden.
Ygoe

1
@ygoe Ja, dies ist etwas Neues in der Dotnet-Toolchain. Die Build-Tools betrachten sie als implizit enthalten.
Nover


3

Es wurde ein dreistufiger Build in Visual Studio-Ansatz zum Veröffentlichen von umgebungsspezifischen Appsetting-Dateien (Windows, PowerShell) entdeckt.

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

Dieser Ansatz wird veröffentlicht

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

Schritt 1. Aktualisieren Sie 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>

Schritt 2. Legen Sie eine Umgebungsvariable in PowerShell fest:

  # 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")

Schritt 3. Schließen Sie dann die Visual Studio-Lösung und öffnen Sie sie erneut, damit Visual Studio die Umgebungsvariable anzeigen und die Projektstruktur entsprechend neu laden kann.

  • Jetzt ist appsettings.json ein übergeordnetes Element und appsettings.Staging.json ist eine verschachtelte Datei.
  • Wenn Sie eine andere Umgebung festlegen (z. B. "Produktion") und dann Visual Studio schließen und Ihre Lösung erneut öffnen, wird appsettings.json als übergeordnetes Element und appsettings.Production.json als verschachtelte Datei angezeigt.

Geben Sie hier die Bildbeschreibung ein

Letzter Schritt . Führen Sie die Veröffentlichung aus.

Geben Sie hier die Bildbeschreibung ein

Hinweis: Verlagsprofil Umgebungsvariablen beeinflussen nicht Konfiguration zu veröffentlichen. Dieser Ansatz verwendet PowerShell zum Festlegen einer Umgebungsvariablen und ermöglicht das umgebungsspezifische Veröffentlichen. Weitere Informationen zu Umgebungsvariablen finden Sie unter dem Link .

Geben Sie hier die Bildbeschreibung ein

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.