En un archivo .csproj, ¿para qué sirve <None Include = "...">?

137

Como es

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

diferente de

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

?

Emmett
fuente
77
Me Contentcambiaron algunos s por Nones. Creo que sucedió cuando cambié el nombre de los archivos de .ascx a .cshtml al convertir a Razor. Cambiarlos nuevamente manualmente solucionó algunos problemas de implementación que tenía. Me alegro de haber encontrado esto.
Chris

Respuestas:

135

El artículo de MSDN sobre la propiedad de acción de compilación explica las diferencias.

Ninguno : el archivo no se incluye en el grupo de salida del proyecto y no se compila en el proceso de compilación. Un ejemplo es un archivo de texto que contiene documentación, como un archivo Léame.

Contenido : el archivo no se compila, pero se incluye en el grupo de salida Contenido. Por ejemplo, esta configuración es el valor predeterminado para un .htm u otro tipo de archivo web.

adrianbanks
fuente
55
Gracias, tuve problemas para localizar esta referencia.
Emmett
Útil, pero ¿por qué tener un elemento "Ninguno" si el archivo no se va a incluir en la salida? ¿Cuál es el punto de?
JimH44
1
@ JimH44 Los elementos <Ninguno> se usan a menudo para copiar específicamente archivos en el directorio de salida, aunque no están en el grupo de salida de forma predeterminada . Si selecciona "Copiar al directorio de salida" -> "Copiar siempre" para un archivo <Ninguno>, esto hará que se copie, y verá que la entrada agregada al archivo .csproj del proyecto tendrá una entrada <Ninguna> para el archivo
Compilador conspicuo
3
Entonces, ¿cuál es la diferencia entre un archivo <Ninguno> con "Copiar al directorio de salida" -> "Copiar siempre" y un archivo <Contenido> con "Copiar al directorio de salida" -> "Copiar siempre"?
tabla hash
30

Una diferencia es cómo se publican; Los elementos "Ninguno" no se incluyen en una publicación, los elementos "Contenido" sí; por ejemplo, en el cuadro de diálogo "Archivos de aplicación" en la pestaña Publicar.

Marc Gravell
fuente
8
No es verdad. Al menos en el nuevo punto net cli. si tiene un elemento declarado como Ninguno con un CopyToOutputDirectoryconjunto true, se publicará en undotnet publish
disklosr
13

No estoy 100% seguro (leí la descripción de MSDN de la propiedad Build Action ), pero solo copiar esa respuesta de MSDN a StackOverflow no me responde la pregunta por completo.

La diferencia de Ninguno y Contenido solo tiene un efecto en los proyectos web. Para un proyecto de línea de comando, proyecto WinForm o proyecto UnitTest (en mi caso), etc. Ninguno y el Contenido no tienen un comportamiento diferente.

MSDN: "grupo de salida de proyecto" o "grupo de salida de contenido" solo términos utilizados en un proyecto web, ¿verdad?

hfrmobile
fuente
2
Como usted dice, parece que Nonevs Contentsolo tiene efecto para el paso de publicación, no el paso de compilación . Parece que el paso de compilación CopyToOutputDirectoryse puede configurar en cualquiera de los dos y eso controla si el paso de compilación copia el archivo. También parece extraño que, por defecto, las plantillas T4 se agreguen como Contentelementos y no como Noneelementos.
Christopher King el
8

En mi situación, mi archivo MSBuild tenía ItemGrouprecursos de imagen que aparecían de la siguiente manera:

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

Si bien mi proyecto fue la construcción de bien, este me dejó preguntándose por qué tenía una mezcla de Contenty Noneelementos de tipo de elemento en mi ItemGroup. Este artículo de MSDN (para Visual Studio 2010) me dio la orientación que estaba buscando:

Tenga en cuenta que cuando el editor de recursos agrega una imagen, establece la Acción de compilación en Ninguna , porque el archivo .resx hace referencia al archivo de imagen. En el momento de la compilación, la imagen se extrae en el archivo .resources creado a partir del archivo .resx. Se puede acceder fácilmente a la imagen a través de la clase fuertemente tipada autogenerada para el archivo .resx. Por lo tanto, no debe cambiar esta configuración a Recursos integrados , ya que esto incluiría la imagen dos veces en el ensamblaje.

Resolución: con esta guía, utilizando un editor de texto, cambié los Contentelementos de tipo de elemento a None.

Además, para obtener una descripción general de los elementos de MSBuild, consulte este artículo de MSDN .

DavidRR
fuente
3

Tengo un proyecto que no contiene elementos compilables (almacena html y javascript para pruebas unitarias de jazmín).

Un día, mi solución (que contenía dicho proyecto) dejó de compilarse diciendo "El objetivo" Compilar "no existe en el proyecto".

Agregué una importación para traer el compilador, que funcionó bien en mi máquina pero falló al usar msbuild en el servidor de compilación.

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

Luego cambié una línea de

<None Include="SpecRunner.html" />

a

<Content Include="SpecRunner.html" />

y funcionó en el servidor de compilación también.

cedd
fuente
2

No necesita Ninguno en un archivo de proyecto de plantilla para incluir los archivos que defina en .vstemplate; de ​​lo contrario, se perderán en el proceso de creación y traducción. Se quedan atrás en la carpeta temporal que usa para construir todo y luego se eliminan poco después.

CAD bloke
fuente
1

En mi caso .Pubxml es uno de esos archivos de la lista Ninguno . No está destinado a la creación de soluciones o como un archivo estático para proyectos web. Pero para publicar el sitio en Azure, las configuraciones están presentes en esto.

Según el artículo de Microsoft, estos son los tipos principales que vemos entre las etiquetas de archivo .csproj :

Ninguno: el archivo no se incluye en el grupo de salida del proyecto y no se compila en el proceso de compilación. Un ejemplo es un archivo de texto que contiene documentación, como un archivo Léame.

Compilar: el archivo se compila en la salida de compilación. Esta configuración se usa para archivos de código.

Contenido: el archivo no se compila, pero se incluye en el grupo de salida Contenido. Por ejemplo, esta configuración es el valor predeterminado para un .htm u otro tipo de archivo web.

Recurso incrustado: este archivo se incrusta en la salida de compilación del proyecto principal como un archivo DLL o ejecutable. Por lo general, se usa para archivos de recursos.

krishna kanth
fuente
1
Comente aquí, si algo es engañoso o no está claro, solo un voto negativo no me ayuda a mejorarlo. Gracias por adelantado.
krishna kanth
1
A menudo recibí un error: el nombre del elemento "Ninguno" para incluir "Propiedades \ PublishProfiles \ FolderProfile.pubxml" debería ser "Contenido". en mi proyecto Asp.Net en Bamboo, y alguna vez volver a ejecutar la compilación puede solucionarlo, así que no sé cuál es exactamente el problema
Bochen Lin
Hola @BochenLin, los detalles que mencionaste aquí son un poco escasos, ¿puedes intentar dar más detalles aquí o publicar una nueva pregunta con detalles completos del problema y captura de pantalla si es posible [y luego compartir el enlace de la pregunta aquí].
Krishna kanth
0

Los archivos de contenido no se incluyen en una compilación, pero se incluyen en una publicación.

Ninguno de los archivos no se incluye en una compilación o publicación, a menos que usted los configure de esa manera. Por ejemplo, una configuración de "Copiar al directorio de salida" de "Siempre" o "Más reciente" hará que se incluyan tanto en una compilación como en una publicación.

carlin.scott
fuente