it-swarm.com.de

dotnet publish veröffentlicht keine korrekten Apps-Einstellungen. {env.EnvironmentName} .json

Wenn ich den folgenden Befehl in der Befehlszeile ausgeben:

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

Die dotnetcli veröffentlicht das Projekt korrekt. Es kopiert jedoch nicht die appsettings.Production.json-Datei, sondern nur den appsettings.json.

Warum ist das? Ich habe herumgeloggert und die offiziellen Kerndokumente gelesen, aber nicht gefunden, wie die korrekte Umgebung appsettings.json in der Veröffentlichungsausgabe landen soll.

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

47
peco

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

  • Immer,
  • Neues erhalten
  • Noch nie 

Fügen Sie also den nächsten Abschnitt in Ihren .csproj ein: 

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

In @nover answer und SO können Sie Dateien beim Publizieren ausschließen oder einschließen , um weitere Informationen zur Dateikontrolle während der Veröffentlichung zu erhalten.


"In Ihrer project.json-Datei haben Sie den Abschnitt publishOptions mit 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" in dieses Array einfügen.

Updates basieren auf Kommentaren:

  • Beachten Sie, dass alle appsettings.*.json-Dateien wie appsettings.development.json, appsettings.staging.json und appsettings.production.json immer in allen Umgebungen enden. Sie können dies nicht einfach mit project.json behandeln, da es keine Bedingungsregeln unterstützt. Dies wird in der Zukunft geändert, wenn project.jsonzurück in msbuild und .csproj ersetzt wird. 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 Dokumentation

    Die Reihenfolge, in der Konfigurationsquellen angegeben werden, ist wichtig, da hierdurch die Priorität festgelegt wird, mit der Einstellungen angewendet werden, wenn sie an mehreren Orten vorhanden sind. Wenn in dem folgenden Beispiel in beiden Einstellungen in appsettings.json und in einer Umgebungsvariablen die gleiche Einstellung vorhanden ist, wird die Einstellung in der Umgebungsvariablen verwendet. Die zuletzt angegebene Konfigurationsquelle “gewinnt”, wenn eine Einstellung an mehreren Orten vorhanden ist. Das ASP.NET-Team empfiehlt, die Umgebungsvariablen zuletzt anzugeben, damit die lokale Umgebung alle Einstellungen in bereitgestellten Konfigurationsdateien überschreiben kann.

69
Set

In Ihrem project.json gibt es einen Abschnitt publishOptions. Hier werden alle Dateien und Ordner aufgelistet, die bei der Veröffentlichung enthalten sind. Sie müssen Ihre aktualisieren, um so etwas auszusehen

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

Sie können auch Globbing-Muster verwenden, daher sollten Sie auch feststellen, dass dies funktioniert.

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

Für das neue csproj-Projektformat müssen Sie dem Inhalt eine neue ItemGroup hinzufügen

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

Falls Sie mehrere appsettings.{env}.json-Dateien haben, wiederholen Sie einfach das Content-Tag in derselben ItemGroup-Datei, und alle Ihre Einstellungsdateien landen im Veröffentlichungsordner.

Wie in den Kommentaren erwähnt, ist die Verwendung eines Platzhalters eine noch sauberere Lösung:

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

Und alle Ihre appsettings-Dateien werden veröffentlicht!

9
nover

Nach Visual Studio 2017 15.3

Bearbeiten Sie die .csproj-Datei, um Dateien/Ordner manuell von der Veröffentlichung auszuschließen

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

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

Originalquelle

1
Ben Anderson