如何自定义网站项目的构建?

时间:2012-12-14 13:42:48

标签: asp.net msbuild

我们有一些自定义的MS Build脚本,可以在构建时为 Web应用程序项目生成代码和配置文件。目前,我们通过覆盖Web项目的.csproj文件中的“BeforeBuild”和“AfterBuild”目标来调用这些构建脚本。但是,在另一个解决方案中,我有一个网站项目,它直接从本地IIS打开,没有.csproj文件。如何自定义此类项目的构建?

如果无法自定义网站的MS Build过程,那么调用像运行我自定义MS Build脚本的.bat文件这样的东西就足够了。我们目前正在使用.bat文件,但开发人员必须手动运行它,但有时会忘记这一点。点击构建时,我看不到一种简单的方法可以自动启动它。

我希望在Visual Studio和Team Build中作为解决方案构建的一部分运行。

4 个答案:

答案 0 :(得分:4)

请注意,与Web应用程序不同,Visual Studio本身并不构建Web站点。当然,肯定有一个可以从VS运行的Build命令,但它所做的一切基本上都是检查你的站点可以构建而没有错误。关键点在于,当您从VS构建Web站点时,它根本不会产生任何构建工件。相反,当您向站点发送http请求时,需要构建的所有内容都会在运行时发生。

您可以通过多种方式自定义在运行时构建内容的方式(例如,使用Build Providers),但如果您的目标是生成web.config文件,那么这对您没有帮助。

作为替代方案,您可能会让您的Web站点依赖于另一个项目(例如库),然后让 项目代表站点执行一些自定义构建操作(例如,通过修改网站的文件)。通过项目依赖性,您可以保证在Web站点之前始终构建另一个项目。

答案 1 :(得分:3)

Visual Studio< 2012年:Web部署项目

自2005年以来,Microsoft已为Visual Studio发布了一个名为 Web部署项目的单独可安装项目类型(有时称为 WDP )。这是他博客上的第一个revealed by Scott Guthrie,多年来一直没有太大变化,所以他的介绍仍然是一个很好的阅读,以详细了解WDP提供的内容(或转到MSDN reference )。

创建WDP时,项目将添加到您的解决方案中,并带有对现有Web站点项目的内置引用。它实际上只是一个MSBuild文件(.wdproj),其内容通过添加到Visual Studio的设置对话框来控制。构建此项目时,它会输出通常由服务器上的ASP.NET运行时生成的程序集(例如,每个目录的第一次ASP.NET请求文件请求)。从本质上讲,您可以获得所谓的预编译网站

因为它基于MSBuild,您可以轻松地将其添加到现有的构建脚本中,或将自定义项添加到<BeforeBuild><AfterBuild>元素(以及<BeforeMerge>和{ {1}})。这也适用于构建服务器,但某些功能可能需要安装Windows SDK。 (根据我的经验,aspnet_merge.exe是主要问题,它负责将所有输出程序集合并到一个程序集中,如果在项目文件中配置它。)

此解决方案是MSBuild网站项目的“官方”方式,并且比在构建事件之前和之后添加具有依赖性的空类库项目更简单。作为缺点,当您的网站很大时,它可能会增加构建时间。但要以积极的方式结束,为您构建预编译的网站可能会改善您的整体部署工作。

下载Visual Studio 20082010(抱歉,我找不到VS2005的版本,但它可能是SP1的一部分)。

Visual Studio 2012

对于Visual Studio 2012,情况已发生变化。根据来自web开发工具博客的demand,没有计划的WDP版本(尽管它有this blog post),但网站项目将支持新的发布功能。发布配置文件也是MSBuild文件,因此应该可以将它们集成到现有的构建脚本中,就像使用WDP一样。另见:Visual Studio 2012 Web Deployment Projects are Dead – Long Live Publishing Profiles

如果您现在同时使用Web应用程序和Web站点项目,那么您可能会发现为两种类型的项目设置相同的构建设置是有益的。在这种情况下,当发布对网站项目的发布配置文件支持在不久的将来(现在有ASP.NET and Web Tools 2012.2 RC支持这个),你应该切换到那个,而不是两个单独的空类库项目。

答案 2 :(得分:1)

我现在通过在我的解决方案中添加一个单独的MS Build文件并确保它在Visual Studio中使用项目依赖项在网站之前构建来实现我所需要的。

实际构建文件非常小,名为“Configure.csproj”,位于网站的根目录中:

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0" DefaultTargets="Build">
  <Import Project="CodeGeneration.targets" />
  <Target Name="Build">
    <CallTarget Targets="GenerateCode" />
  </Target>
  <Target Name="Rebuild">
    <CallTarget Targets="GenerateCode" />
  </Target>
  <Target Name="Clean">
  </Target>
</Project>

右键单击解决方案,然后选择“添加现有项目”并选择此文件。

当没有构建C#时,将此命名为* .csproj似乎很奇怪,但此文件扩展名是Visual Studio在单击“添加现有项目”时可识别的扩展名。

然后确保在网站之前构建它,右键单击解决方案并选择“项目依赖项”。从“项目”下拉列表中选择网站项目,然后选中“配置”旁边的框。

当然可以在网站之后运行自定义构建,方法是添加另一个项目并在网站上添加依赖项。

答案 3 :(得分:-3)

您可以为此创建自己的MSBuild proj文件。它非常简单,这里有一个演练:http://msdn.microsoft.com/en-us/library/dd576348.aspx

然后,您可以将其添加到为帖子构建命令创建的文件中。

<Target Name="AfterEndToEndIteration">
  <Exec Command="YourPath\YourCommand.bat" />
</Target>

祝你好运