Lorsque j'émets la commande suivante dans la ligne de commande:
dotnet publish -o "./../output" -c Release
La dotnetcli
publie le projet correctement. Cependant, il ne copie pas le fichier appsettings.Production.json
, mais uniquement le appsettings.json
.
Pourquoi est-ce? J'ai consulté Google et lu les documents de base officiels, mais je n'ai pas trouvé comment l'environnement correct appsettings.json
est censé se retrouver dans la sortie de publication.
Dois-je copier appsettings.Production.json
manuellement dans le dossier publié?
Update:Pour le (nouveau) format .csproj actuel l'attribut CopyToPublishDirectory
doit être utilisé. Il détermine s'il faut copier le fichier dans le répertoire de publication et peut avoir l'une des valeurs suivantes:
Alors ajoutez la section suivante dans votre .csproj
:
<ItemGroup>
<None Include="appsettings.Production.json" CopyToPublishDirectory="Always" />
</ItemGroup>
Recherchez dans @nover answer _ et SO Exclure ou inclure des fichiers lors de la publication pour plus d'informations sur le contrôle du fichier pendant la publication.
"Dans votre fichier project.json
, vous avez la section publishOptions
avec la sous-section include
, où vous avez déjà des fichiers tels que" appsettings.json ":
"publishOptions": {
"include": [
"appsettings.json",
"hosting.json",
"project.json",
"web.config"
]
},
Vous devriez ajouter "appsettings.Production.json"
dans ce tableau.
Mises à jour basées sur les commentaires:
N'oubliez pas que tous les fichiers appsettings.*.json
tels que appsettings.development.json
, appsettings.staging.json
et appsettings.production.json
se retrouveront toujours dans tous les environnements. Vous ne pouvez pas simplement gérer cela avec project.json
, car il ne prend en charge aucune règle de condition. Ceci sera changé à l'avenir, lorsque project.json
sera remplacé en msbuild
et .csproj
. Si cela est critique pour votre application, envisagez d'utiliser un autre magasin de configuration, comme une variable d'environnement, une base de données, etc.
Notez que cet ordre est important, car il permet de déterminer les paramètres à appliquer s’ils existent dans plusieurs emplacements. De documentation :
L'ordre dans lequel les sources de configuration sont spécifiées est important car cela établit la priorité avec laquelle les paramètres seront appliqués s'ils existent dans plusieurs emplacements. Dans l'exemple ci-dessous, si le même paramètre existe à la fois dans appsettings.json et dans une variable d'environnement, le paramètre de la variable d'environnement sera celui utilisé. La dernière source de configuration spécifiée «gagne» si un paramètre existe dans plusieurs emplacements. L'équipe ASP.NET recommande de spécifier les variables d'environnement en dernier, afin que l'environnement local puisse remplacer tout ce qui est défini dans les fichiers de configuration déployés.
Votre project.json
contient une section publishOptions
. Cela répertorie tous les fichiers et dossiers qui seront inclus lors de la publication. Vous aurez besoin de mettre à jour le vôtre pour ressembler à ceci
{
"publishOptions": {
"include": [
"wwwroot",
"Views",
"appsettings.json",
"appsettings.Production.json",
"web.config"
]
},
}
Vous pouvez également utiliser des modèles globbing, vous devriez donc trouver que cela fonctionne aussi (je n'ai pas testé celui-ci)
{
"publishOptions": {
"include": [
"wwwroot",
"Views",
"appsettings*.json",
"web.config"
]
},
}
Pour le nouveau format de projet csproj
, vous devez ajouter une nouvelle ItemGroup
avec le contenu
<ItemGroup>
<Content Include="appsettings.json">
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</Content>
<Content Include="appsettings.Production.json">
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</Content>
</ItemGroup>
Si vous avez plusieurs fichiers appsettings.{env}.json
, répétez simplement la balise Content
à l'intérieur de la même ItemGroup
et tous vos fichiers de paramètres se retrouveront dans le dossier de publication.
Comme mentionné dans les commentaires, une solution encore plus propre consiste à utiliser un caractère générique, notamment:
<ItemGroup>
<Content Include="appsettings*json">
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</Content>
</ItemGroup>
Et tous vos fichiers appsettings
seront publiés!
Après Visual Studio 2017 15.3
Editez le fichier .csproj pour exclure manuellement les fichiers/dossiers de la publication
<ItemGroup>
<Content Remove="appsettings.Development.json" />
</ItemGroup>