Как получить aspnet_compiler, вызываемый из Visual Studio во время сборки?
Я хочу, чтобы Visual Studio предварительно скомпилировала мое приложение ASP.NET, которое используется в качестве полезной нагрузки веб-роли Azure. Итак, я нашел этот пост, который объясняет, как вызвать aspnet_compiler для проверки представлений.
Я попытался добавить следующее к "событию после сборки" моего приложения ASP.NET:
call "%VS100COMNTOOLS%\vsvars32.bat"
aspnet_compiler -v / -p $(ProjectDir)
или альтернативно это (имя приложения указывается явно):
call "%VS100COMNTOOLS%\vsvars32.bat"
aspnet_compiler -v /ASP.NET-Application-ProjectNameHere -p $(ProjectDir)
В обоих случаях при выполнении сборки я вижу следующее в выводе сборки:
Setting environment for using Microsoft Visual Studio 2010 x86 tools.
Utility to precompile an ASP.NET application
Copyright (C) Microsoft Corporation. All rights reserved.
и, разумеется, никакой предварительной компиляции не происходит, потому что если я изменю любой файл.aspx или.cshtml "Build Action" на "None", он не попадет в пакет службы Azure, и представление больше не открывается после развертывания пакета в Azure.
Как настроить aspnet_compiler для предварительной компиляции из Visual Studio?
3 ответа
Если вы хотите использовать Asp.NET Compiler в вашей Visual Studio / msbuild, вы можете добавить AspNetCompiler
Задайте файл вашего проекта (.csproj/.vbproj) и установите MvcBuildViews
в true
,
Пример:
<Project>
<PropertyGroup>
<MvcBuildViews>true</MvcBuildViews>
</PropertyGroup>
<!-- ... -->
<Target Name="PrecompileWeb" AfterTargets="build" Condition="'$(MvcBuildViews)'=='true'">
<Message Text="Starting AspNetCompiler for $(ProjectDir)" Importance="high" />
<AspNetCompiler
VirtualPath="temp"
PhysicalPath="$(WebProjectOutputDir)"
Force="true"
/>
</Target>
<!-- ... -->
</Project>
Вы также можете установить TargetPath
атрибут для указания каталога назначения.
AfterTargets="build"
похож на "событие после сборки". Смотрите Target Build Order для более подробной информации.
Интегрировать компиляцию ASPX в Visual Studio
Один из принципов, на которых я настаиваю, состоит в том, чтобы всегда пробовать мою сборку в чистой среде и моделировать установку, как если бы она была сделана QA. В последнее время я заметил, что продолжаю падать на ошибки, скрытые глубоко в файлах aspx. Итак, почему бы не использовать старый и знакомый инструмент aspnet_compiler.exe? Он находится по адресу C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 и его довольно просто использовать.
Как фанат надстроек VS я начал думать об удивительной надстройке, которая интегрируется с VS и будет прослушивать события сборки и отображать результаты на панели вывода. Черт, почему бы не добавить некоторые возможности подачи кофе?
Мне понадобилось около 10 минут поиска в Google, чтобы наткнуться на этот блог. Майк Хэдлоу обладал гениальностью в своей идее простоты. Используйте POST BUILD EVENT! Все, что мне нужно сделать, это вставить следующую строку в событие после сборки: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_compiler.exe -v / -p "$(ProjectDir)\"
Теперь осталось только сделать процесс добавления этой строки для каждого веб-проекта в нашей команде автоматическим.
У меня есть только надстройка для этого:)
Ответ от Matej был полезен для меня, но я не смог использовать его как есть и все же заставить его работать как для локальных сборок в Visual Studio, так и для автоматических сборок через TFS.
Мне пришлось добавить несколько дополнительных настроек msbuild. На самом деле, у меня было 2 разных сценария. Одним из проектов было веб-приложение, встроенное в папку _PublishedWebsites, а другим - веб-приложение MVC, которое не встраивалось в папку _PublishedWebsites.
Сначала добавьте следующее, если его нет в файле проекта:
<PropertyGroup>
<MvcBuildViews>true</MvcBuildViews>
</PropertyGroup>
Для одного с _PublishedWebsites:
<Choose>
<When Condition="'$(BuildingInsideVisualStudio)' == true">
<PropertyGroup>
<AspNetCompilerPhysicalPath>$(ProjectDir)</AspNetCompilerPhysicalPath>
</PropertyGroup>
</When>
<Otherwise>
<PropertyGroup>
<AspNetCompilerPhysicalPath>$(WebProjectOutputDir)</AspNetCompilerPhysicalPath>
</PropertyGroup>
</Otherwise>
</Choose>
<Target Name="PrecompileWeb" AfterTargets="build" Condition="'$(MvcBuildViews)'=='true'">
<!-- aspnet_compiler.exe needs to be run on the folder that has the aspx files and the "bin" subfolder.
When running locally, the value needs to be the project directory, which is $(ProjectDir).
When running the TFS build, the value needs to be (BuildFolder)\(ProjectName)\_PublishedWebsites\(ProjectName).
The $(AspNetCompilerPhysicalPath) will hold the correct value for both types of builds.
-->
<Message Text="Starting AspNetCompiler for $(ProjectName) at $(AspNetCompilerPhysicalPath)" Importance="high" />
<AspNetCompiler
VirtualPath="/"
PhysicalPath="$(AspNetCompilerPhysicalPath)"
TargetPath="$(AspNetCompilerPhysicalPath)\bin_precompile"
Force="true"
/>
</Target>
Для одного БЕЗ _Публикуемых сайтов:
<Choose>
<When Condition="'$(BuildingInsideVisualStudio)' == true">
<PropertyGroup>
<AspNetCompiler_CopyFilesFirst>false</AspNetCompiler_CopyFilesFirst>
</PropertyGroup>
</When>
<Otherwise>
<PropertyGroup>
<AspNetCompiler_CopyFilesFirst>true</AspNetCompiler_CopyFilesFirst>
</PropertyGroup>
<ItemGroup>
<AllOutputFiles Include="$(OutDir)\\**\*.*" />
</ItemGroup>
</Otherwise>
</Choose>
<Target Name="PrecompileWeb" AfterTargets="build" Condition="'$(MvcBuildViews)'=='true'">
<!-- aspnet_compiler.exe needs to be run on the folder that has the cshtml files and the "bin" subfolder. I could not find a setting that was appropriate for both.
When running locally, the value needs to be the project directory, which is $(ProjectDir).
When running the TFS build, there is no folder that matches both of those criteria.
So first we will copy the output into the source code folder's "bin" subfolder,
then run it against the source $(ProjectDir), the same as if we were building locally.
-->
<Message Text="Before running AspNetCompiler, copy files from $(OutDir) to $(ProjectDir)\bin" Importance="high" />
<Exec Command="( robocopy.exe /mir $(OutDir) $(ProjectDir)\bin ) ^& IF %25ERRORLEVEL%25 LEQ 1 exit 0" Condition="'$(AspNetCompiler_CopyFilesFirst)'=='true'" />
<Message Text="Starting AspNetCompiler for $(ProjectName) at $(ProjectDir)" Importance="high" />
<AspNetCompiler
VirtualPath="/"
PhysicalPath="$(ProjectDir)"
TargetPath="$(ProjectDir)\bin_precompile"
Force="true"
/>
</Target>