Entendiendo .NET CORE CSPROJ ACCIONES -- .net-core campo con msbuild camp Relacionados El problema

Understanding .NET Core csproj actions


14
vote

problema

Español

Estoy tratando de tener los contenidos de una carpeta copiada para construir la producción. Idealmente, bajo el mismo camino en relación con la carpeta de salida / publicación. Tengo:

  <!-- front-end files to serve --> <ItemGroup>   <Folder Include="FrontendContent">     <CopyToOutputDirectory>Always</CopyToOutputDirectory>   </Folder> </ItemGroup>   

Sin embargo, cuando uso dotnet publish , no se copia ningún archivo.

Esto funciona para el archivo de configuración que quiero: esto fue generado por VS:

  <ItemGroup>   <None Remove="my-config.json" /> </ItemGroup> <ItemGroup>   <Content Include="my-config.json">     <CopyToOutputDirectory>Always</CopyToOutputDirectory>   </Content> </ItemGroup>   

Entonces, mi pregunta es, ¿qué es esta locura? Semánticamente, un elemento llamado None con un atributo Remove - ¿Qué significa eso?

Mi vaga intuición es que el elemento es equivalente a un "conjunto", cuyos contenidos se accionarán en función del nombre de ese elemento / conjunto, y que incluyen, excluir, eliminar de alguna manera (?) Interactuar para definir y Refinar los contenidos de ese conjunto.

Pero entonces, ¿qué es "carpeta"? ¿Qué es "contenido"? ¿Qué sucede cuando las cosas se detallan: ¿por qué se necesita el combo "ninguno / eliminar"? Si es en absoluto, eso fue generado por VS!

DOCUMENTACIÓN-WISE, encontré:

https://docs.microsoft.com/en-us/dotnet/core/tools/csproj#how-to-see-the-hole-project-as-msbuild-sees-es-it , que habla de compilar, EmbeddedReSource y ninguno Globs de defecto (incluir, excluir y eliminar globos). Sé que es un globo, sé lo que significan esas acciones, pero ¿cuáles son los tipos de globos? ¿Cómo interactúan?

También apunta a la documentación de MSBUILD en https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild-project-file-schema-reference?view=vs-2017 , pero eso parece inútil para esto: No documenta None , EmbeddedResource6 , O Compile Elementos que se muestran, Tampoco habla del Content y Folder Elementos que he encontrado en otros ejemplos (y generado por VS).

De hecho, nada de lo que he encontrado todavía habla sobre lo que todo esto significa.

¿Dónde puedo encontrar documentación para esto?

Original en ingles

I'm trying to have the contents of a folder copied to build output. Ideally under the same path relative to the output/publish folder. I have:

<!-- front-end files to serve --> <ItemGroup>   <Folder Include="Frontend\Content">     <CopyToOutputDirectory>Always</CopyToOutputDirectory>   </Folder> </ItemGroup> 

However, when I use dotnet publish, no file is copied.

This works for the config file I want - this was generated by VS:

<ItemGroup>   <None Remove="my-config.json" /> </ItemGroup> <ItemGroup>   <Content Include="my-config.json">     <CopyToOutputDirectory>Always</CopyToOutputDirectory>   </Content> </ItemGroup> 

So my question is - what is this craziness? Semantically, an element called None with a Remove attribute - what does that even mean?

My vague intuition is that the element is equivalent to a "set", the contents of which will be actioned based on the name of that element/set, and that Include, Exclude, Remove somehow(?) interact to define and refine the contents of that set.

But then - what's "Folder"? What's "Content"? What happens when things double-up: why is the "None/Remove" combo needed? If it is at all - that was generated by VS!

Documentation-wise, I found:

https://docs.microsoft.com/en-us/dotnet/core/tools/csproj#how-to-see-the-whole-project-as-msbuild-sees-it, which talks about Compile, EmbeddedResource and None default globs (Include, Exclude and Remove globs). I know what a glob is, I know what those actions mean, but what are those types of globs? How do they interact?

It also points to MSBuild documentation at https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild-project-file-schema-reference?view=vs-2017, but that seems useless for this: it doesn't document None, EmbeddedResource, or Compile elements shown, nor does it talk about the Content and Folder elements I've found in other examples (and generated by VS).

In fact, nothing I've found yet talks about what this all means.

Where can I find documentation for this?

     
         
         

Lista de respuestas

15
 
vote
vote
La mejor respuesta
 
  1. carpeta Ítems

<Folder> se usa dentro de VS solo muestra un nodo en explorador de soluciones, por ejemplo Para obtener un punto a hacer clic derecho "Agregar & gt; nuevo ...". wwwroot es un ejemplo clásico para aplicaciones CORE ASP.NET, pero si usa la función VS '"Add & GT; Nueva carpeta" o elimine todos los archivos en una carpeta existente, agregará un nodo a Mantenlo en el Explorador de soluciones.

El <Folder> Los elementos no se utilizan durante la compilación. Los elementos de copia se determinan en función de los metadatos especificados en los tipos de elementos conocidos (ninguno, contenido, ...) y no se basan en los elementos de la carpeta en la jerarquía de sistemas de archivos.

Si desea especificar metadatos para toda una jerarquía, podría hacer un

  <Content Include="my/content/**/*" CopyToPublishDirectory="True" … />   
  1. incluir / eliminar combo

Dentro del contenido estático de un archivo de proyecto (no dentro de un <Target> , se aplican algunas reglas diferentes en allí), MSBUILD permite tres operaciones en colecciones de elementos:

  • incluye: agregue un elemento a la "" colección "" "de los elementos del tipo de elemento especificado
  • Actualización: cambie los metadatos en los elementos del tipo de elemento especificado
  • Eliminar: Eliminar elementos de la "Colección" ""

Esto significa que si lo haces

  <None Include="foo.txt" /> <Content Include="foo.txt" />   

Luego, tanto el @(None)6 y @(Content) las colecciones contendrán foo.txt . Esto no es realmente un problema para el sistema de compilación (a menos que especifique, quiera que ambos copien a la salida, esto conduce a errores con las rutas de salida en conflicto), pero para las herramientas que le muestran los archivos en su proyecto y sus propiedades. Puede crear situaciones difíciles.

Si foo.txt se enumera como wwwroot0 , wwwroot1111 y wwwroot2 , luego el IDE (VS, RIDER, VS / MAC, ...) Las herramientas tienen que tomar una decisión difícil sobre qué mostrarle para ese archivo.

Para mitigar este problema, es bueno asegurarse de que un archivo aparezca como solo uno de estos tipos de elementos de "acción de compilación" para que los IDES no se confundan (y también el usuario también).

Entonces, ¿por qué tienen que eliminar archivos de wwwroot3 ?

Los nuevos proyectos "estilo SDK" agregan muchos valores predeterminados. Básicamente, contienen algo como (simplificado!):

  wwwroot4  

Entonces, si desea cambiar un archivo para que sea un recurso incorporado o un elemento de contenido, debe eliminar el archivo de la colección wwwroot5 .

Si no necesita cambiar el tipo de artículo, también puede usar wwwroot6616 :

  wwwroot7  
  1. Entonces, ¿qué hacen las cosas en wwwroot8

Esas definiciones no hacen nada por su cuenta. Solo llenan / cambian una colección de "artículos". Incluso podrías crear el tuyo y usarlos más tarde:

  wwwroot9  

El punto clave es que algunas partes de la lógica de construcción buscan elementos que conocen y usan.

La parte que calcula la entrada al compilador verá <Folder>0 y <Folder>1 elementos, la parte que determina qué archivos para copiar en el directorio de salida buscará varios ARTÍCULOS ( <Folder>2 , <Folder>3 , <Folder>4 y algunos otros IIRC) con metadatos específicos establecidos.

Los nuevos tipos de proyectos pueden definir sus propios tipos de elementos que se enumeran en el Explorador de soluciones VS a través de puntos de extensibilidad.

Pero VS solo mostrará elementos en el Explorador de soluciones para los tipos de elementos que están configurados de esta manera. Y para estos tipos de elementos, tiene sentido no tener un archivo listado en varios de ellos.

 
  1. Folder items

<Folder> is used inside VS just shows a node in solution explorer, e.g. to get you a point to right click "Add > New xe2x80xa6". wwwroot is a classic example for ASP.NET Core applications but if you use the VS' "Add > New Folder" feature or delete all of the files in an existing folder, it will add a node to keep it in the solution explorer.

The <Folder> items aren't used during the build. Copying items is determined based on the metadata specified on known item types (None,Content,...) and not based on Folder items in the filesystem hierarchy.

If you want to specify metadata for a whole hierarchy, you could do a

<Content Include="my/content/**/*" CopyToPublishDirectory="True" xe2x80xa6 /> 
  1. Include/Remove combo

Inside the static content of a project file (not within a <Target> - a few different rules apply in there), MSBuild allows three operations on collections of items:

  • Include: add an items to the ""collection"" of items of the specified item type
  • Update: change the metadata on items of the specified item type
  • Remove: remove items from the ""collection""

This means that if you do

<None Include="foo.txt" /> <Content Include="foo.txt" /> 

Then there both the @(None) and @(Content) collections will contain foo.txt. This isn't really a problem for the build system (unless you specify you want both of them copied to the output - this leads to errors with conflicting output paths), but for tooling that shows you the files in your project and their properties this can create tricky situations.

If foo.txt is listed as None, Content and EmbeddedResource, then the IDE (VS, Rider, VS/Mac, xe2x80xa6) tooling has to make a tough decision on what to show you for that file.

To mitigate this problem, it is good to make sure that a file is listed as only one of these "Build Action" item types so that IDEs won't be confused (and transitively also the user).

So why do have to remove files from None?

The new "SDK-style" projects add a lot of defaults. They basically contain something like (simplified!!):

<None Include="**/*" /> 

So if you want to change a file to be an embedded resource or a content item, you should remove the file from the @(None) collection.

If you don't need to change the item type, you can also use Update:

<None Update="some/content/**/*" CopyToOutputDirectory="True" /> 
  1. So what do those things under <ItemGroup> do?

Those definitions do nothing on their own. They just fill / change a collection of "items". You could even create your own and use them later:

<MyCoolFiles Include="cool/files/**/*;other/cool/files/**/*" /> <None Remove="@(MyCoolFiles)" /> <Content Include="@(MyCoolFiles)" CopyToPublishDirectory="True" />  <Target Name="PrintCoolFiles" BeforeTargets="BeforeBuild">   <Message Importance="high" Text="These are my cool files: @(MyCoolFiles)" /> </Target> 

The key point is that some parts of the build logic look for items they know a about and use them.

The part that calculates the input to the compiler will look at Compile and EmbeddedResource items, the part that determines which files to copy to the output directory will look for various items (None, Content, EmbeddedResource and a few others IIRC) with specific metadata set.

New project types may define their own item types to be listed in VS' solution explorer via extensibility points.

But VS will only show items in the solution explorer for item types that are configured in this way. And for these item types it makes sense to not have a file listed in multiple of them.

 
 
         
         

Relacionados problema

32  ¿Todavía está compatible con NANT y adecuado para .NET 3.5 / VS2008?  ( Is nant still supported and suitable for net 3 5 vs2008 ) 
Estoy usando MsBuild para construir mis cosas. Quiero usar cruiseControl.net como Build Server. Ahora, CCNET se refiere a NANT mucho, pero parece que CCNNET...

7  ¿Cómo puedo pasar un parámetro a través de MSBUILD al compilador?  ( How can i pass a parameter through msbuild to the compiler ) 
Estoy usando la línea a continuación para tener Msbuild Build A Delphi 2010 GroupProj: MSBuild C:srcmyprojgroup.groupproj /target:Build /p:config=Relea...

18  CruiseControl.net, Msbuild, / P: Outputpath y CCNETArtifactDirectory  ( Cruisecontrol net msbuild poutputpath and ccnetartifactdirectory ) 
Estoy tratando de configurar cruiseControl.net en este momento. Hasta ahora funciona bien, pero tengo un problema con la tarea MSBUILD. De acuerdo con la D...

1  Buenos recursos para aprender sobre Msbuild y la integración continua con TFS  ( Good resources to learn about msbuild and continuous integration with tfs ) 
Soy relativamente nuevo en MSBUILD y estoy buscando buenos recursos para aprender más sobre MSBUILD y CI con TFS. Específicamente, estoy buscando las siguient...

1  Comando que da para crear una carpeta ZIP al destino deseado en MSBUILD  ( Command which gives to create a zip folder to desired destination in msbuild ) 
quiere un comando que le da a crear una carpeta zip al destino deseado en MSBUILD. Por favor, ayude a su urgente .. Para más clarificación de mi pregunta:...

43  Use la revisión SVN a la estructura de la etiqueta en CCNET  ( Use svn revision to label build in ccnet ) 
Estoy usando CCNET en un proyecto de muestra con SVN como control de mi fuente. CCNET está configurado para crear una compilación en cada registro. CCNET usa ...

19  Usando MSTest con cruiseControl.net  ( Using mstest with cruisecontrol net ) 
Hemos estado usando CruiseControl durante bastante tiempo con Nunit y Nant. Para un proyecto reciente, decidimos utilizar el marco de pruebas que viene con Vi...

0  Tener problemas para cambiar la sección <DataConFiguration> de Web.config en WDP  ( Having problems changing the dataconfiguration section of web config in wdp ) 
Tengo un archivo web.config que contiene una sección como esta: <configuration> <configSections> <section name="dataConfiguration" type="Microsoft.Pr...

0  Silverlight Solution se basa en VS2008 pero falla con MSBUILD  ( Silverlight solution builds in vs2008 but fails with msbuild ) 
Tengo una solución de Silverlight que quiero crear un script de compilación para. Tengo un script simple que se parece a este call "c:Program FilesMicrosof...

6  Problemas con las compilaciones en TFS 2010 y resolviendo las dependencias  ( Problems with builds on tfs 2010 and resolving dependencies ) 
Tengo un proyecto que funciona muy bien en mi máquina (y servidores de producción). Es un proyecto VS2010 que ejecuta C # 3.5. Al permitir que mi servidor d...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos