在没有Web部署项目的VS中预编译Web应用程序项目?

时间:2011-02-19 16:44:09

标签: asp.net visual-studio deployment

我想在Visual Studio 2010中预编译整个ASP.NET Web应用程序项目,主要是为了确保页面和控件中没有错误。

如何在不使用Web部署项目的情况下执行此操作?我尝试使用WDP,但它有一个非常烦人的错误,导致它编译应用程序文件夹中的所有文件,包括已被“排除”的文件。这令人抓狂。

要清楚,我了解如何在VS中编译我的应用程序。我也知道如何部署它。我想知道的是如何在部署之前预处理整个应用程序(包括所有ASPX和ASCX文件)。这对我很重要,因为它是确保在运行时之前ASPX或ASCX文件中没有错误的唯一方法。我知道有这方面的命令行工具。我想在VS内部进行预编译,以便我能够快速纠正发现的任何问题。

还有另一种方法吗?有没有办法自定义发布命令?

非常感谢帮助,因为关于这个主题的MS文档令人沮丧,重复和偏执。

布赖恩

4 个答案:

答案 0 :(得分:4)

问题发生多年后,但有些人可能觉得它很有用。 我使用的是VS 2013,但之前也在VS 2010中使用过它。

Go to Tool/External Tools, Add button. 
Title: Pre Compile 
Command: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_compiler.exe 
Arguments: -p $(SolutionDir)\Web  -v / 
Initial directory: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ 
[TICK] : Use Output Window

显然,将路径更改为合适的.net框架。 您可以单击错误,并在VS中的正确行上打开文件。 奇怪的是,有时我会多次运行并得到不同的输出......

这样做的缺点是它没有告诉你它什么时候完成(你总是可以在任务浏览器中检查aspnet_compiler!)。所以我做了一个DOS批处理文件,其唯一目的就是说"完成"在“输出”窗口中。请注意,命令行与上面的命令行不同,因为在此版本中,我复制了由我们自己的msbuild脚本有效生成的命令行(它使用" fixednames"例如,用于解析循环引用预编译器错误)。 %~f1是"参数" VS的“外部工具”窗口的输入框。

批处理文件(precompile.cmd):

@echo C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe -p "%~f1" -v / -f -c -fixednames c:\temp\SomeFolder
@c:
@cd C:\Windows\Microsoft.NET\Framework\v4.0.30319\
@C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe -p "%~f1" -v / -f -c -fixednames c:\temp\SomeFolder
@echo.
@echo Done.

在VS中:

Go to Tool/External Tools, Add button. 
Title: Pre Compile 2
Command: C:\mypath\precompile.cmd
Arguments: $(SolutionDir)\Web
Initial directory: [leave blank]
[TICK] : Use Output Window

PS:不确定这是如何/是否受到网站或Web应用程序的影响。

答案 1 :(得分:1)

所以,这是我目前的解决方案,这远非理想。

  1. 我创建了一键式发布配置文件,以将应用程序发布到我的计算机上的本地文件夹中。该站点的本地副本可以用作Aspnet_compiler的输入,Aspnet_compiler执行预编译。

  2. 我创建了一个名为“Precompile。”的新构建配置。

  3. 在项目文件中,我创建了一个新的“目标”,仅在预编译配置处于活动状态时运行(请参阅下面的语法)。这基本上告诉MSBuild在编译后运行额外的任务;也就是说,它将运行Aspnet_compiler来预编译站点。它采用One-Click生成的站点文件,对它们进行预编译,然后将它们输出到第二个本地文件夹。如果在预编译期间发现任何错误,它们将显示在VS。

  4. 这是一个带有毛刺的完全半生不熟的解决方案。最大的问题是,Aspnet_compiler发现的任何错误都指向One-Click文件夹中的文件,因此如果您双击它们,它们会将您带到那些文件,而不是解决方案文件。

    我可以用这种方法控制预编译。除非我选择预编译配置,否则任务不会运行。但是整个事情让人觉得迂回而愚蠢。

    也许会出现更好的解决方案。

    这是我添加到项目文件中的元素,最后是在主<Project>元素内:

    <Target Name="AfterCompile"
         Condition=" '$(Configuration)|$(Platform)' == 'Precompile|AnyCPU' ">
    
        <AspNetCompiler PhysicalPath="[Source files created by One-click]"
        VirtualPath="/" Force="true"
        TargetPath="[Destination folder]" />
    </Target>
    

答案 2 :(得分:-1)

构建解决方案。确保Web应用程序不会从构建中排除,而是检入解决方案属性页。

不记得“在构建解决方案时排除网站”是针对Web应用程序项目/网站项目还是两者兼而有之。

答案 3 :(得分:-1)

我必须发布另一个答案,因为我无法在评论中附加图片。

See the Build website as a part of the solution option