runtimeidentifiers run netcore dotnet deploy asp.net-core .net-core publish dotnet-cli

asp.net-core - netcore - runtimeidentifiers linux



dotnet publishing no publica las configuraciones correctas de la aplicaciĆ³n.{env.EnvironmentName}.json (4)

En su project.json hay una sección publishOptions . Esto enumera todos los archivos y carpetas que se incluirán cuando publique. Necesitarás actualizar el tuyo para que se vea así

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

También puede usar patrones globales, por lo que debería encontrar que esto también funciona (no he probado este)

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

Cuando emito el siguiente comando en la línea de comando:

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

El dotnetcli publica el proyecto correctamente. Sin embargo, no copia el archivo appsettings.Production.json , solo el appsettings.json .

¿Por qué es esto? Busqué en Google y leí los documentos principales oficiales, pero no he encontrado cómo se supone que el entorno correcto appsettings.json terminará en la salida de publicación.

¿Debo copiar appsettings.Production.json manualmente en la carpeta publicada?


Para el nuevo formato de proyecto csproj , debe agregar un nuevo ItemGroup con el contenido

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

En caso de que tenga varias appsettings.{env}.json , simplemente repita la etiqueta de Content dentro del mismo ItemGroup y todos sus archivos de configuración terminarán en la carpeta de publicación.

Como se menciona en los comentarios, una solución aún más limpia es usar un comodín que incluya:

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

¡Y se publicarán todos sus archivos de appsettings aplicaciones!


Actualización: para el formato .csproj actual (nuevo) se debe utilizar el atributo CopyToPublishDirectory . Determina si se debe copiar el archivo en el directorio de publicación y puede tener uno de los siguientes valores:

  • Siempre,
  • PreserveNewest
  • Nunca

Entonces agregue la siguiente sección en su .csproj :

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

Busque en @nover answer y SO Excluir o incluir archivos en la publicación para obtener más información sobre el control del archivo durante la publicación.

"En su archivo project.json tiene la sección de publishOptions con subsección include , donde ya tiene algunos archivos como" appsettings.json ":

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

Debe agregar "appsettings.Production.json" en esta matriz.

Actualizaciones basadas en comentarios :

  • Tenga en cuenta que todos los appsettings.*.json appsettings.development.json como appsettings.development.json , appsettings.staging.json y appsettings.production.json siempre terminarán en todos los entornos. No puede simplemente manejar esto usando project.json , ya que no admite ninguna regla de condición. Esto se cambiará en el futuro, cuando project.json se reemplazará de nuevo a msbuild y .csproj . Si esto es crítico para su aplicación, considere usar otro almacén de configuración, como Variable de entorno, base de datos, etc.

  • Tenga en cuenta que ese orden es importante, ya que determine qué configuraciones se aplicarán si existen en varias ubicaciones. De la documentation :

    El orden en que se especifican las fuentes de configuración es importante, ya que esto establece la precedencia con la que se aplicarán las configuraciones si existen en varias ubicaciones. En el siguiente ejemplo, si existe la misma configuración en appsettings.json y en una variable de entorno, la configuración de la variable de entorno será la que se utilice. La última fuente de configuración especificada "gana" si existe una configuración en más de una ubicación. El equipo de ASP.NET recomienda especificar las variables de entorno en último lugar, para que el entorno local pueda anular todo lo establecido en los archivos de configuración implementados.