6

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

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

我想要在 Visual Studio 和 Team Build 中作为解决方案构建的一部分运行的东西。

4

4 回答 4

5

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

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

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

于 2012-12-18T02:10:00.960 回答
3

我现在通过在我的解决方案中添加一个单独的 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 可以识别此文件扩展名。

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

当然可以通过添加另一个项目并添加对网站的依赖项来在网站之后运行自定义构建。

于 2012-12-23T15:25:06.873 回答
3

Visual Studio < 2012:Web 部署项目

自 2005 年以来,Microsoft 为 Visual Studio 发布了一个单独的可安装项目类型,称为Web 部署项目(有时称为WDP)。它是由 Scott Guthrie在他的博客上首次披露的,并且多年来并没有太大变化,因此他的介绍仍然是一本很好的读物,可以详细了解 WDP 所提供的内容(或转到MSDN 参考资料)。

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

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

此解决方案是 MSBuild 网站项目的“官方”方式,并且比添加具有依赖关系的空类库项目来模拟构建事件之前和之后的复杂性要低。不利的一面是,当您的网站很大时,它可能会增加构建时间。但要以积极的态度结束,为您构建预编译的网站可能会改善您的整体部署工作。

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

视觉工作室 2012

对于 Visual Studio 2012,情况发生了变化。没有计划发布 WDP(尽管有需求),但根据web 开发工具博客的这篇博客文章,网站项目将支持新的发布功能。发布配置文件也是 MSBuild 文件,因此应该可以将它们集成到您现有的构建脚本中,就像使用 WDP 一样。另请参阅:Visual Studio 2012 Web 部署项目已死——发布配置文件万岁

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

于 2012-12-23T19:55:22.623 回答
-3

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

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

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

祝你好运

于 2012-12-17T16:38:55.617 回答