web-dev-qa-db-fra.com

dotnet publish ne publie pas les paramètres d'application corrects. {env.EnvironmentName} .json

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é?

47
peco

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:

  • Toujours,
  • PreserveNewest
  • Jamais 

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.

69
Set

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"
    ]
  },
}
15
Sock

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!

9
nover

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>

ref: https://www.danielcrabtree.com/blog/273/fixing-the-duplicate-content-error-after-upgrading-visual-studio-2017

source primaire

1
Ben Anderson