8

我希望 Visual Studio预编译用作 Azure Web 角色有效负载的ASP.NET 应用程序。所以我发现这篇文章解释了如何调用 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 文件“构建操作”更改为“无”,它就不会进入 Azure 服务包,并且一旦包部署到 Azure,视图就不再打开。

如何设置 aspnet_compiler 以在 Visual Studio 中进行预编译?

4

3 回答 3

4

如果要在 Visual Studio / msbuild 中使用 Asp.NET 编译器,则可以将 AspNetCompilerTask 添加到项目文件 (.csproj/.vbproj) 并设置MvcBuildViewstrue.

例子:

<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"类似于“构建后事件”。有关更多信息,请参阅目标构建顺序

于 2012-10-04T23:56:10.420 回答
2

将 ASPX 编译集成到 Visual Studio

我坚持的原则之一是始终在干净的环境中尝试我的构建并模拟安装,就好像它是由 QA 完成的一样。最近我注意到我不断遇到隐藏在 aspx 文件中的错误。那么,为什么不使用旧的和熟悉的 aspnet_compiler.exe 工具呢?它位于 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 并且非常易于使用。

作为一个 VS 插件怪胎,我已经开始考虑一个很棒的插件,它将集成到 VS 中,并会监听构建事件并在输出窗格中显示结果。哎呀,为什么不添加一些咖啡服务功能呢?

我花了大约 10 分钟的谷歌搜索才发现这个博客。迈克·哈德洛 (Mike Hadlow) 在其简单的想法上很有天赋。使用 POST BUILD 事件!我需要做的就是将以下行放在构建后事件中: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_compiler.exe -v / -p "$(ProjectDir)\"

现在,剩下的就是使将这一行添加到我们团队中的每个 Web 项目的过程自动化。

我只有那个插件:)

在此处输入链接描述

于 2013-03-06T12:06:06.463 回答
1

Matej 的回答对我很有帮助,但我无法按原样使用它,但仍然可以让它在 Visual Studio 中的本地构建和通过 TFS 的自动构建中工作。

我不得不添加一些额外的 msbuild 设置。实际上,我有两种不同的情况。一个项目是内置到 _PublishedWebsites 文件夹中的 Web 应用程序,另一个是未内置到 _PublishedWebsites 文件夹中的 MVC Web 应用程序。

首先,如果您的项目文件中还没有以下内容,请添加以下内容:

  <PropertyGroup>
    <MvcBuildViews>true</MvcBuildViews>
  </PropertyGroup>

对于 WITH _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>

对于没有 _PublishedWebsites 的网站:

  <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 ) ^&amp; 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>
于 2016-03-10T19:31:08.723 回答