【问题标题】:How can I customize the build of a web site project?如何自定义网站项目的构建?
【发布时间】:2012-12-14 13:42:48
【问题描述】:

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

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

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

【问题讨论】:

    标签: asp.net msbuild


    【解决方案1】:

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

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

    作为替代方案,您可以让您的网站依赖于另一个项目(例如库),然后让 那个 项目代表站点执行一些自定义构建操作(例如通过修改网站的文件)。有了项目依赖,就可以保证其他项目总是先于网站构建。

    【讨论】:

    • +1 但是你不需要依赖另一个项目。您可以创建一个自定义 MSBuild 脚本,该脚本实现 Build RebuildClean 目标,并使用 Add Existing Project... 将其添加为项目依赖项
    • @mootinator 听起来不错,但可能需要更多信息。我假设您的意思是在解决方案级别添加现有项目,然后从网站“添加引用”到该项目。如此有效,您仍然依赖于另一个项目,但它是一个更简单的项目,它不构建任何二进制文件,仅用于执行随机任务。
    • 对。虽然我在解决方案级别使用“项目依赖项”来强制执行“构建顺序”而不是添加参考。
    • 这似乎根本不是真的。当我单击构建时,Visual Studio 正忙于编译网站,而在团队构建之后,我最终得到了一个包含已编译代码的程序集。还详细介绍了in this article Visual Studio 如何编译网站,而无需生成可用的程序集。很明显,这里发生了一个“构建”,大概可以定制。综上所述,我现在正沿着您在创建要在网站之前构建的 .csproj 文件的答案中建议的路线前进。
    • 实际上你指向的页面和我在下面写的完全一样:在VS中建立一个站点只是为了验证它没有错误,它不会产生任何东西。生成工件的唯一方法是使用 PreCompilation 工具(例如 aspnet_compiler),鉴于您的目标,这绝对不是您想要的。
    【解决方案2】:

    我现在通过在我的解决方案中添加一个单独的 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】:

    Visual Studio

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

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

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

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

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

    Visual Studio 2012

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

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

    【讨论】:

    • 典型的“微软”。我现在在 VS 2010 上的任何投资都需要在升级到 VS 2012 时重新完成。我将坚持我已经找到的解决方案,看看升级后会发生什么。
    • 是的,我知道你的意思。但在下面,所有这些解决方案(包括您的)都是基于 MSBuild。因此,有一条清晰的路径可以让它从单独的类库项目到 WDP,再到 Publish Profile。可以使用 swith /p:DeployOnBuild=true;PublishProfile=Foo 从命令行使用发布配置文件进行构建。
    【解决方案4】:

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

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

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

    祝你好运

    【讨论】:

    • 是的,但问题的重点是我不知道如何自定义网站构建时会发生什么。
    猜你喜欢
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 2011-03-27
    • 2021-10-24
    • 2014-03-11
    • 1970-01-01
    相关资源
    最近更新 更多