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
comoappsettings.development.json
,appsettings.staging.json
yappsettings.production.json
siempre terminarán en todos los entornos. No puede simplemente manejar esto usandoproject.json
, ya que no admite ninguna regla de condición. Esto se cambiará en el futuro, cuandoproject.json
se reemplazará de nuevo amsbuild
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.
Después de Visual Studio 2017 15.3
Edite el archivo .csproj para excluir manualmente la publicación de archivos / carpetas
<ItemGroup>
<Content Remove="appsettings.Development.json" />
</ItemGroup>
fuente original