Dans un fichier .csproj, à quoi sert <None Include = “…”>?

137

Comment est

<None Include="C:\foo.bar" />

différent de

<Content Include="C:\foo.bar" />

?

Emmett
la source
7
J'ai eu quelques Contents à changer en Nones. Je pense que cela s'est produit lorsque j'ai renommé des fichiers de .ascx en .cshtml lors de la conversion en Razor. Les changer manuellement a corrigé certains problèmes de déploiement que j'avais. Heureux d'avoir trouvé ça.
Chris

Réponses:

135

L'article MSDN sur la propriété d' action de génération explique les différences.

Aucun - Le fichier n'est pas inclus dans le groupe de sortie du projet et n'est pas compilé dans le processus de génération. Un exemple est un fichier texte contenant de la documentation, tel qu'un fichier Lisez-moi.

Contenu - Le fichier n'est pas compilé, mais est inclus dans le groupe de sortie Contenu. Par exemple, ce paramètre est la valeur par défaut d'un fichier .htm ou d'un autre type de fichier Web.

Adrianbanks
la source
5
Merci, j'ai eu du mal à localiser cette référence.
Emmett
Utile, mais pourquoi avoir un élément "Aucun" si le fichier ne doit pas être inclus dans la sortie? À quoi ça sert?
JimH44
1
@ JimH44 Les éléments <Aucun> sont souvent utilisés pour copier spécifiquement des fichiers dans le répertoire de sortie, même s'ils ne sont pas dans le groupe de sortie par défaut . Si vous sélectionnez "Copier dans le répertoire de sortie" -> "Copier toujours" pour un fichier <Aucun>, cela entraînera sa copie, et vous verrez l'entrée ajoutée au fichier .csproj du projet aura une entrée <Aucun> pour le fichier.
Compilateur remarquable du
3
Alors, quelle est la différence entre un fichier <Aucun> avec "Copier dans le répertoire de sortie" -> "Copier toujours" et un fichier <Contenu> avec "Copier dans le répertoire de sortie" -> "Copier toujours"?
hashtable
30

Une différence est la façon dont ils sont publiés; Les éléments "Aucun" ne sont pas inclus dans une publication, les éléments "Contenu" le font; par exemple, dans la boîte de dialogue "Fichiers d'application" de l'onglet Publier.

Marc Gravell
la source
8
Pas vrai. Au moins dans le nouveau point net cli. si vous avez un élément déclaré comme Aucun avec un CopyToOutputDirectoryensemble, trueil sera publié dans undotnet publish
disklosr
13

Je ne suis pas sûr à 100% (j'ai lu la description MSDN de la propriété Build Action ) mais le simple fait de copier cette réponse de MSDN vers StackOverflow ne répond pas complètement à la question pour moi.

La différence entre Aucun et Contenu n'a d'effet que sur les projets Web. Pour un projet en ligne de commande, un projet WinForm ou un projet UnitTest (dans mon cas), etc. Aucun et Contenu n'ont pas de comportement différent.

MSDN: "groupe de sortie de projet" ou "groupe de sortie de contenu" uniquement les termes utilisés dans un projet Web, non?

hfrmobile
la source
2
Comme vous le dites, semble Nonevs Contentn'a d'effet que pour l' étape de publication et non pour l' étape de construction . Car l'étape de construction semble CopyToOutputDirectorypouvoir être définie sur l'un ou l'autre et cela contrôle si le fichier est copié par l'étape de construction. Il semble également étrange que, par défaut, les modèles T4 soient ajoutés en tant Contentqu'éléments et non en tant Nonequ'éléments.
Christopher King
8

Dans ma situation, mon fichier MSBuild avait un ItemGrouppour les ressources image qui se présentait comme suit:

  <ItemGroup>
    <Content Include="Resources\image001.png" />
    <Content Include="Resources\image002.png" />
    <Content Include="Resources\image003.png" />
    <Content Include="Resources\image004.png" />
    <None Include="Resources\image005.png" />
    <None Include="Resources\image006.png" />
    <None Include="Resources\image007.png" />
  </ItemGroup>

Pendant que mon projet se construisait correctement, je me demandais pourquoi j'avais un mélange d' éléments Contentet de Nonetype d'élément dans mon ItemGroup. Cet article MSDN (pour Visual Studio 2010) m'a donné les conseils que je recherchais:

Notez que lorsque l'éditeur de ressources ajoute une image, il définit l' action de génération sur Aucune , car le fichier .resx fait référence au fichier image. Au moment de la construction, l'image est extraite dans le fichier .resources créé à partir du fichier .resx. L'image est alors facilement accessible via la classe fortement typée générée automatiquement pour le fichier .resx. Par conséquent, vous ne devez pas modifier ce paramètre en Ressource intégrée , car cela inclurait l'image deux fois dans l'assembly.

Résolution: Avec ces conseils, à l'aide d'un éditeur de texte, j'ai changé les Contentéléments de type d'élément en None.

En outre, pour une vue d'ensemble des éléments MSBuild, consultez cet article MSDN .

DavidRR
la source
3

J'ai un projet qui ne contient aucun élément compilable (il stocke du html et du javascript pour les tests unitaires de jasmin).

Un jour ma solution (qui contenait ledit projet) a cessé de se compiler en disant "La cible" Build "n'existe pas dans le projet".

J'ai ajouté une importation pour introduire le compilateur, qui a bien fonctionné sur ma machine mais a échoué en utilisant msbuild sur le serveur de construction.

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

J'ai ensuite changé une ligne de

<None Include="SpecRunner.html" />

à

<Content Include="SpecRunner.html" />

et cela a également fonctionné sur le serveur de construction.

cedd
la source
2

Vous avez besoin de None dans un fichier de projet modèle pour inclure les fichiers que vous définissez dans le .vstemplate, sinon ils sont perdus dans le processus de création et de traduction. Ils sont laissés dans le dossier temporaire qu'il utilise pour tout construire, puis supprimés peu de temps après.

Type CAD
la source
1

Dans mon cas .Pubxml est l'un de ces fichiers parmi la liste Aucun . Il n'est pas destiné à la création de solutions ou en tant que fichier statique pour un projet Web. Mais pour publier le site sur Azure, les configurations sont présentes ici.

Selon l'article de Microsoft, voici les principaux types que nous voyons parmi les balises de fichier .csproj :

Aucun - Le fichier n'est pas inclus dans le groupe de sortie du projet et n'est pas compilé dans le processus de génération. Un exemple est un fichier texte contenant de la documentation, tel qu'un fichier Lisez-moi.

Compile - Le fichier est compilé dans la sortie de construction. Ce paramètre est utilisé pour les fichiers de code.

Contenu - Le fichier n'est pas compilé, mais est inclus dans le groupe de sortie Contenu. Par exemple, ce paramètre est la valeur par défaut d'un fichier .htm ou d'un autre type de fichier Web.

Ressource intégrée - Ce fichier est intégré dans la sortie de construction du projet principal en tant que DLL ou exécutable. Il est généralement utilisé pour les fichiers de ressources.

Krishna Kanth
la source
1
S'il vous plaît commenter ici, si quelque chose est trompeur ou pas clair, un simple vote à la baisse ne m'aide pas à l'améliorer. Merci d'avance.
krishna kanth
1
J'ai souvent eu une erreur: le nom de l'élément "Aucun" pour inclure "Properties \ PublishProfiles \ FolderProfile.pubxml" devrait être "Content". dans mon projet Asp.Net sur Bamboo, et parfois réexécuter la construction peut simplement le résoudre, alors ne sais pas exactement quel est le problème
Bochen Lin
Salut @BochenLin, les détails que vous avez mentionnés ici sont un peu rares, pouvez-vous essayer de donner plus de détails ici ou publier une nouvelle question avec les détails complets du problème et une capture d'écran si possible [puis partager le lien de la question ici].
krishna kanth le
0

Les fichiers de contenu ne sont pas inclus dans une version, mais sont inclus dans une publication.

Aucun fichier n'est inclus dans une compilation ou une publication, sauf s'il est configuré de cette façon par vous. Par exemple, un paramètre «Copier dans le répertoire de sortie» sur «Toujours» ou «Plus récent» les fera être inclus à la fois dans une construction et une publication.

carlin.scott
la source