2016-06-16 13 views
39

Kiedy wydać następujące polecenie w wierszu poleceń.DotNet publikuj doesnt publikują poprawne AppSettings {env.EnvironmentName} .json

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

dotnetcli publikuje projekt poprawnie. Jednak nie kopiuje pliku appsettings.Production.json, tylko appsettings.json.

Dlaczego tak jest? Przeszukałem go i przeczytałem oficjalne dokumenty główne, ale nie znalazłem odpowiedzi na pytanie, w jaki sposób poprawne środowisko powinno znaleźć się w wynikach publikowania.

Czy muszę ręcznie skopiować appsettings.Production.json do opublikowanego folderu?

Odpowiedz

60

Aktualizacja: For current (new) .csproj format atrybut CopyToPublishDirectory powinny być stosowane. To określa, czy aby skopiować plik do katalogu publikowania i może mieć jedną z następujących wartości:

  • zawsze
  • PreserveNewest
  • Nigdy

Więc dodać kolejny rozdział do swojej .csproj:

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

Zajrzyj do @nover answer i SO Exclude or include files on publish, aby uzyskać więcej informacji o kontroli pliku podczas publikowania.


„W pliku project.json masz sekcję publishOptions z podpunktem include, gdzie masz już jakieś pliki typu "appsettings.json":.

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

Należy dodać "appsettings.Production.json" do tej tablicy

Aktualizacje na podstawie komentarzy:

  • Należy pamiętać, że wszystkie pliki appsettings.*.json, takie jak appsettings.development.json, appsettings.staging.json i appsettings.production.json, zawsze będą widoczne we wszystkich środowiskach. Nie można po prostu obsłużyć tego przy użyciu project.json, ponieważ nie obsługuje żadnych reguł warunków. Zostanie to zmienione w przyszłości, gdy project.json będzie replaced back na msbuild i .csproj. Jeśli ma to krytyczne znaczenie dla Twojej aplikacji, rozważ użycie innego magazynu konfiguracji, takiego jak Zmienna środowiskowa, baza danych itp.

  • Pamiętaj, że kolejność jest ważna, ponieważ ustal, które ustawienia zostaną zastosowane, jeśli istnieją w wielu lokalizacjach. Od documentation:

    Kolejność określania źródeł konfiguracji jest ważna, ponieważ ustanawia to pierwszeństwo, z jakim będą stosowane ustawienia, jeśli istnieją one w wielu lokalizacjach.W poniższym przykładzie, jeśli to samo ustawienie istnieje zarówno w appsettings.json, jak iw zmiennej środowiskowej, zostanie użyte ustawienie ze zmiennej środowiskowej. Ostatnie źródło konfiguracji określiło "wygrywa", jeśli ustawienie istnieje w więcej niż jednej lokalizacji. Zespół ASP.NET zaleca określenie zmiennych środowiskowych jako ostatnich, aby środowisko lokalne mogło przesłonić wszystko, co ustawione w wdrożonych plikach konfiguracyjnych.

+2

Dlaczego w ogóle trzeba opublikować 'project.json'? – Pawel

+1

Ale nie łączy ustawienia opartego na profilu publikowania? Zawsze czyta klucz, który znajduje się w appsettings.json, a nie appsetting.release.json. –

+0

W moim przypadku ustawienia z profilu publikowania są łączone z moimi appsettings.Production.json @BarbarosAlp – Riscie

14

W swojej project.json istnieje punkt publishOptions. Zawiera listę wszystkich plików i folderów, które będą dołączane podczas publikowania. trzeba będzie uaktualnić je do wyglądać tak

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

Można również wykorzystać globbing wzory, więc należy znaleźć ten działa też (nie testowałem ten jeden)

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

"appsettings * .json" opracowano dla mnie –

5

Dla nowy format csproj projekt trzeba dodać nowy ItemGroup z treścią

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

w przypadku gdy masz wiele appsettings.{env}.json plików po prostu powtórzyć Content tag wewnątrz tego samego ItemGroup i wszystkie twoje pliki ustawień znajdą się w folderze publikowania.

Jak wspomniano w komentarzach jeszcze czystsze rozwiązaniem jest użycie wieloznacznego obejmują:

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

i wszystkie appsettings pliki zostaną opublikowane!

+1

Możesz także skorzystać z symboli wieloznacznych i użyć pojedynczego węzła z "Include =" appsettings * json "'. Możesz to zrobić ręcznie. – stukselbax

+0

nice one @stukselbax - uwzględniono twoją opinię w mojej odpowiedzi – nover

+0

Nie działa. Błąd kompilacji mówi, że te pliki są już zdefiniowane gdzie indziej. Wygląda na to, że domyślne zachowanie nie może zostać nadpisane. – ygoe