2016-06-16 19 views
39

Wenn ich den folgenden Befehl in der Befehlszeile eingeben.Dotnet publish Passt nicht korrekt appsettings veröffentlichen {env.EnvironmentName} .json

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

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

Warum ist das? Ich habe gegoogelt und die offiziellen Kerndokumente gelesen, aber ich habe nicht herausgefunden, wie die richtige Umgebung appsettings.json in der Publish-Ausgabe landen soll.

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

Antwort

60

Update: For current (new) .csproj format das CopyToPublishDirectory Attribut verwendet werden soll. Es legt fest, ob die Datei in das Publikationsverzeichnis zu kopieren und eine der folgenden Wert haben:

  • Immer,

So fügen nächsten Abschnitt in Ihrem .csproj

  • PreserveNewest
  • Nie:

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

    Blick in @nover answer und SO Exclude or include files on publish für weitere Informationen zur Dateikontrolle während der Veröffentlichung.


    „In Ihrem project.json Datei haben Sie den Abschnitt publishOptions mit Unterabschnitt include, wo Sie bereits einige Dateien wie haben "appsettings.json".

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

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

    Updates basierend auf Kommentare:

    • 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 umgehen, da es keine Bedingungsregeln unterstützt. Dies wird sich in Zukunft ändern, wenn project.jsonreplaced back bis msbuild und .csproj sein 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 Speicherorten vorhanden sind. Von documentation:

      Die Reihenfolge, in der Konfigurationsquellen angegeben werden, ist wichtig, da dies den Vorrang, mit dem festgelegt werden Einstellungen angewendet werden, wenn sie an mehreren Orten existieren.Wenn im Beispiel unten 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 Speicherort vorhanden ist. Das ASP.NET-Team empfiehlt, zuletzt Umgebungsvariablen anzugeben, damit die lokale Umgebung alle in den bereitgestellten Konfigurationsdateien festgelegten Einstellungen überschreiben kann.

  • +2

    Warum brauchen Sie "project.json" überhaupt? – Pawel

    +1

    Aber es fusioniert keine Einstellung basierend auf Veröffentlichungsprofil? Es liest immer den Schlüssel, der in appsettings.json ist, nicht appsetting.release.json. –

    +0

    In meinem Fall werden Einstellungen aus dem Veröffentlichungsprofil tatsächlich mit meinen appsettings.Production.json @BarbarosAlp – Riscie

    14

    In Ihrem project.json gibt es einen Abschnitt publishOptions. Dadurch werden alle Dateien und Ordner aufgelistet, die bei der Veröffentlichung einbezogen werden. Sie müssen Ihre aktualisieren, so etwas wie dieses

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

    Sie auch Muster verwenden können, um aussehen Globbing, so können Sie dies auch funktioniert finden sollte (ich habe diese eine nicht getestet)

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

    "appsettings * .json" ausgearbeitet für mich –

    5

    Für die neue csproj Projektformat müssen Sie

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

    Falls Sie haben appsettings.{env}.json Dateien mehrere neue ItemGroup mit dem Inhalt fügen Sie einfach denwiederholenTag innerhalb der gleichen ItemGroup und alle Ihre Einstellungen Dateien landen im Ordner Veröffentlichen.

    Wie in den Kommentaren erwähnt eine noch sauberere Lösung ist ein Platzhalter zu verwenden sind:

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

    Und alle Ihre appsettings Dateien veröffentlicht werden!

    +1

    Sie können auch Wildcards nutzen und den einzelnen Knoten mit 'Include =" appsettings * json "' verwenden. Sie können es manuell tun. – stukselbax

    +0

    nice one @stukselbax - aufgenommene mein Feedback in meiner Antwort – nover

    +0

    Funktioniert nicht. Der Buildfehler besagt, dass diese Dateien bereits an anderer Stelle definiert wurden. Scheint, dass das Standardverhalten nicht überschrieben werden kann. – ygoe