visual tutorial studio publicar proyecto net mvc introduccion framework first español deploy crear code asp aprendiendo aplicaciones and razor visual-studio-2013 msbuild asp.net-mvc-5 webdeploy

razor - tutorial - Asegúrese de que todos los archivos*.cshtml estén configurados como "Contenido" para Build Action



publicar asp net core (4)

Algunas veces, cuando copio y *.cshtml archivos *.cshtml , Visual Studio por alguna razón establece Build Action en estos archivos como "Ninguno":

Esto es imposible de detectar cuando trabaja localmente, porque los archivos están presentes. Pero cuando se despliega a través de WebDeploy, los archivos marcados como "Ninguno" en Build Action no se empaquetan. Como resultado, obtengo una aplicación que no funciona en el servidor.

Pregunta: ¿hay alguna manera de detectar automáticamente esas ocurrencias y prevenir?


¡Bien, @jessehouwing ciertamente funcionó para mí! Así que esa solución se mantiene muy bien en mi archivo .csproj ... Solo que acabo de verificar dos veces y parece que ese bonito fragmento desapareció en algún lugar del último mes debido a la fusión de otro desarrollador o algo así ... (cierto historia)

Alternativa de NPM

De todos modos, me gustaría mencionar el módulo NPM check-vs-includes que creé para esto. Es especialmente conveniente para los desarrolladores que tenga Node instalado (y si no lo hace, entonces probablemente debería :)).

Ejecuto el control manualmente antes de cada implementación, en lugar de en cada compilación. Pero es menos probable que desaparezca (desapercibido) de su archivo .csproj debido a una fusión.

Sin embargo, la principal ventaja del uso de este paquete de NPM es que además de verificar Build Action NONE, también busca archivos que NO están incluidos en su proyecto. Porque eso también puede conducir a errores (sutiles pero desagradables) cuando utiliza Web Deploy de Visual Studio. Y las omisiones incluidas son bastante probables si: 1) tiene 1 desarrollador no VS en su equipo, o 2) debido a fusiones del archivo .csproj (que a menudo tiene problemas de fusión).

Consulte la página de NPM para obtener instrucciones. Pero debajo de un simple ejemplo, que asume que usas Node y Gulp:

Ejemplo simple

  1. Instalar el módulo Nodo

    npm i check-vs-includes

  2. Agregue una tarea a su gulpfile.js :

var checkVSIncludes = require(''check-vs-includes''); ... gulp.task(''checkVSIncludes'', function() { checkVSIncludes([''/Views/**/*.cshtml'', ''/app/**/*.js'']); });

  1. Ejecute el control en la carpeta de su proyecto (por ejemplo, donde está su archivo .csproj )

    gulp checkVSincluye


¡Gracias, Jessehouwing por ayudarme a empezar! Me gustó tu solución y voté por ella. Tuve un pequeño problema con eso y terminé con lo siguiente:

<Target Name="EnsureContentOnViews" BeforeTargets="BeforeBuild"> <ItemGroup> <Filtered Include="@(None)" Condition="''%(Extension)'' == ''.cshtml''" /> </ItemGroup> <Error Condition="''@(Filtered)''!=''''" Code="CSHTML" File="%(Filtered.Filename)" Text="Not set to [BuildAction:Content]: Identity: %(Filtered.Identity)" /> </Target>

Justo antes de mi etiqueta </Project> en el archivo csproj.


Puede extender .csproj con un pequeño fragmento que generará una advertencia cuando un elemento en el grupo "Ninguno" tenga la extensión .cshtml . El fragmento sería:

<Target Name="EnsureContentOnViews" BeforeTargets="BeforeBuild"> <ItemGroup> <Filtered Include="@(None)" Condition="''%(Extension)'' == ''.cshtml''" /> </ItemGroup> <Warning Condition="''@(Filtered)''!=''''" Code="CSHTML" File="$(MSBuildProjectDirectory)/%(Filtered.Identity)" Text="View is not set to [BuildAction:Content]" /> </Target>

Si ve otras acciones de compilación (como EmbeddedResource ), puede agregarlas a la definición de elemento filtrado.

Si desea una detección más avanzada, debe analizar los archivos del proyecto para cualquier elemento que se ajuste a este Xpath //ItemGroup/*[not(self::Content)]/@Include

<Target Name="EnsureContentOnViewsXML" BeforeTargets="BeforeBuild"> <XmlPeek XmlInputPath="$(MSBuildProjectFile)" Namespaces="&lt;Namespace Prefix=''msb'' Uri=''schemas.microsoft.com/developer/msbuild/2003''/&gt;"; Query="/msb:Project/msb:ItemGroup/*[not(self::msb:EmbeddedResource)]/@Include"> <Output TaskParameter="Result" ItemName="AllItems" /> </XmlPeek> <!-- MsBuild uses XPath 1.0 which doesn''t have the ''ends-with'' or ''matches'' function. --> <ItemGroup> <Filtered Include="@(AllItems)" Condition="''%(Extension)'' == ''.cshtml''" /> </ItemGroup> <Warning Code="CSHTML" File="$(MSBuildProjectDirectory)/%(Filtered.Identity)" Text="View is not set to [BuildAction:Content]" Condition="''@(Filtered)''!=''''" /> </Target>

En lugar de <Warning ...> también puede usar <Error ...>

Necesitará colocar manualmente uno de estos fragmentos en su archivo de proyecto:


Sugiero implementar una tarea de compilación personalizada. Llámalo en prebuild en tu script msbuild / tfs. La tarea de compilación personalizada debería simplemente comprobar el archivo .scproj si hay un archivo de inclusión de cshtml con la acción de compilación none. De modo que solo sale devolviendo un valor int no nulo.